        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 ttbcusto_margem_sku_b02i for tbcusto_margem_sku
active before insert position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';
    HISTORICO = 'Perfil:'||new.perfil||', Margem: '||new.margem||' inserido';

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCUSTO_MARGEM_SKU',new.familia_id, HISTORICO);
    END

end;

CREATE OR ALTER trigger ttbcusto_margem_sku_b01u for tbcusto_margem_sku
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( old.margem <> new.margem) THEN
    BEGIN
        HISTORICO = 'Perfil:'||new.perfil||', Margem: '||old.margem||' -> '||new.margem;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCUSTO_MARGEM_SKU',new.familia_id, HISTORICO);
    END
end;


CREATE OR ALTER trigger ttbcusto_margem_sku_b01d for tbcusto_margem_sku
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';
    HISTORICO = 'Perfil:'||old.perfil||': Excluido.';

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCUSTO_MARGEM_SKU',old.familia_id, HISTORICO);
    END
end;


CREATE OR ALTER trigger ttbcor_b9u for tbcor
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;

CREATE OR ALTER procedure spc_corte_etiqueta (
    remessa_id integer,
    remessa_talao_id integer)
returns (
    etiq blob sub_type 1 segment size 80 character set win1252)
as
declare variable id integer;
declare variable remessa integer;
declare variable remessa_data date;
declare variable remessa_requisicao char(4);
declare variable remessa_tipo char(4);
declare variable controle integer;
declare variable modelo_codigo integer;
declare variable modelo_densidade integer;
declare variable modelo_espessura numeric(18,2);
declare variable matriz_codigo integer;
declare variable matriz_descricao varchar(80);
declare variable matriz_largura numeric(18,5);
declare variable produto_codigo integer;
declare variable produto_descricao varchar(400);
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_sobra numeric(18,4);
declare variable tolerancia numeric(18,4);
declare variable chapas numeric(18,5);
declare variable placas numeric(18,5);
declare variable sobras numeric(18,5);
declare variable placas_ smallint;
declare variable sobras_ smallint;
declare variable lib char(4);
declare variable consumo_medio numeric(18,5);
declare variable placa_altura numeric(18,5);
declare variable placa_comprimento numeric(18,5);
declare variable placa_sobra numeric(18,5);
declare variable placa numeric(18,5);
declare variable observacao varchar(800);
declare variable situacao integer;
declare variable descricao varchar(400);
declare variable grade_codigo integer;
declare variable cor_codigo integer;
declare variable classe varchar(20);
declare variable programacao_boca integer;
declare variable programacao_esteira integer;
declare variable tamanho_grade varchar(40);
declare variable programacao_sequencia integer;
declare variable esteira_descricao varchar(80);
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable turno char(4);
declare variable cor_descricao varchar(80);
declare variable seq varchar(40);
declare variable perfil char(4);
declare variable perc_sobra numeric(18,1);
declare variable flag char(4);
declare variable aproveitamento numeric(18,4);
declare variable mediapar numeric(18,4);
declare variable talao_origem blob sub_type 1 segment size 100;
declare variable largura_t numeric(15,5);
declare variable comprimento_t numeric(15,5);
declare variable placa_t numeric(15,5);
declare variable sobra_t numeric(15,5);
declare variable up_destino varchar(255);
declare variable cliente varchar(255);
declare variable localizacao varchar(255);
declare variable talao_vinculo_controle varchar(50);
begin

end;

CREATE OR ALTER procedure spi_remessa_consumo_bojo (
    i_remessa_id integer,
    i_mp_familia_id integer)
as
declare variable estabelecimento_id integer;
declare variable remessa_id integer;
declare variable mp_familia_id integer;
declare variable requisicao char(1);
declare variable v_limite numeric(15,4) = 99999;
declare variable aproveitamento_talao_id integer;
declare variable matriz_descricao varchar(320);
declare variable matriz_coeficiente numeric(18,5);
declare variable matriz_largura numeric(18,5);
declare variable matriz_placa numeric(18,5);
declare variable matriz_sobra numeric(18,5);
declare variable matriz_quantidade_por_placa numeric(18,5);
declare variable matriz_quantidade_chapa numeric(18,5);
declare variable calc_chapa numeric(15,5);
declare variable resto numeric(15,5);
declare variable ident_prod_tam_mtz integer;
declare variable talao_id integer;
declare variable remessa_talao_id integer;
declare variable modelo_id integer;
declare variable modelo_densidade numeric(18,4);
declare variable modelo_espessura numeric(18,4);
declare variable matriz_id integer;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable tamanho_descricao varchar(40);
declare variable quantidade numeric(18,5);
declare variable quantidade_sobra numeric(18,4);
declare variable consumo_quantidade numeric(18,4);
declare variable chapas numeric(18,5);
declare variable placas numeric(18,5);
declare variable sobras numeric(18,5);
declare variable grade_id integer;
declare variable aproveitamento numeric(18,4);
declare variable req_sobra numeric(18,5);
BEGIN

end;

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

CREATE OR ALTER procedure spi_remessa_consumo_bojo (
    i_remessa_id integer,
    i_mp_familia_id integer)
as
declare variable estabelecimento_id integer;
declare variable remessa_id integer;
declare variable mp_familia_id integer;
declare variable requisicao char(1);
declare variable v_limite numeric(15,4) = 99999;
declare variable aproveitamento_talao_id integer;
declare variable matriz_descricao varchar(320);
declare variable matriz_coeficiente numeric(18,5);
declare variable matriz_largura numeric(18,5);
declare variable matriz_placa numeric(18,5);
declare variable matriz_sobra numeric(18,5);
declare variable matriz_quantidade_por_placa numeric(18,5);
declare variable matriz_quantidade_chapa numeric(18,5);
declare variable calc_chapa numeric(15,5);
declare variable resto numeric(15,5);
declare variable ident_prod_tam_mtz integer;
declare variable talao_id integer;
declare variable remessa_talao_id integer;
declare variable modelo_id integer;
declare variable modelo_densidade numeric(18,4);
declare variable modelo_espessura numeric(18,4);
declare variable matriz_id integer;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable tamanho_descricao varchar(40);
declare variable quantidade numeric(18,5);
declare variable quantidade_sobra numeric(18,4);
declare variable consumo_quantidade numeric(18,4);
declare variable chapas numeric(18,5);
declare variable placas numeric(18,5);
declare variable sobras numeric(18,5);
declare variable grade_id integer;
declare variable aproveitamento numeric(18,4);
declare variable req_sobra numeric(18,5);
BEGIN
     
    DELETE FROM TBREMESSA_CONSUMO C WHERE C.REMESSA = :I_REMESSA_ID;

    UPDATE VWREMESSA
       SET FAMILIA_ID_MP = -1--:I_MP_FAMILIA_ID
     WHERE REMESSA_ID    = :I_REMESSA_ID;

    SELECT FIRST 1
        R.ESTABELECIMENTO_ID,
        R.REMESSA_ID,
        R.FAMILIA_ID_MP,
        R.REQUISICAO
    FROM
        VWREMESSA R
    WHERE
        R.REMESSA_ID = :I_REMESSA_ID
    INTO
        :ESTABELECIMENTO_ID,
        :REMESSA_ID,
        :MP_FAMILIA_ID,
        :REQUISICAO;

    IF ( NOT (COALESCE(MP_FAMILIA_ID,0) > 0)  ) THEN
    BEGIN
--        EXCEPTION "..." 'REMESSA SEM FAMILIA DE CONSUMO DEFINIDA';
    END

    /**
     * Realiza a verificacao de sobras
     */
    --EXECUTE PROCEDURE SPI_REMESSA_SOBRA(:REMESSA_ID);

    /**
     * Realiza o calculo de consumo
     */
    FOR
        SELECT
            ROW_NUMBER() OVER (PARTITION BY PRODUTO_ID,TAMANHO,MATRIZ_ID ORDER BY PERFIL,MODELO_DENSIDADE,MODELO_ESPESSURA,CLASSE,COR_DESCRICAO,PRODUTO_ID,TAMANHO,MATRIZ_ID,REMESSA_TALAO_ID) IDENT_PROD_TAM_MTZ,
            TALAO_ID,
            REMESSA_TALAO_ID,
            MODELO_ID,
            MODELO_DENSIDADE,
            MODELO_ESPESSURA,
            MATRIZ_ID,
            PRODUTO_ID,
            GRADE_ID,
            TAMANHO,
            TAMANHO_DESCRICAO,
            QUANTIDADE,
            QUANTIDADE_SOBRA
    
        FROM (
            SELECT
                X.TALAO_ID,
                X.REMESSA_TALAO_ID,
                X.MODELO_ID,
                CAST(SUBSTRING(X.DENS_ESPESS FROM 1 FOR 5) AS INTEGER)  MODELO_DENSIDADE,
                CAST(SUBSTRING(X.DENS_ESPESS FROM 6 FOR 5) AS NUMERIC(15,2))  MODELO_ESPESSURA,
                X.MATRIZ_ID,
                X.PRODUTO_ID,
                X.TAMANHO,  
                X.TAMANHO_DESCRICAO,
                X.QUANTIDADE,
                X.QUANTIDADE_SOBRA,

                X.LIB,
                X.GRADE_ID,
                X.CLASSE,
                (SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = X.COR_ID) COR_DESCRICAO,
                X.SEQ,
                X.PERFIL

            FROM (
            
                SELECT
                    A.ID TALAO_ID,
                    A.REMESSA REMESSA_ID,
                    A.CONTROLE REMESSA_TALAO_ID,
                    A.MODELO_CODIGO MODELO_ID,
                    P.GRADE_CODIGO GRADE_ID,
                    A.MATRIZ_CODIGO MATRIZ_ID,
                    A.PRODUTO_CODIGO PRODUTO_ID,
                    P.COR_CODIGO COR_ID,
                    A.TAMANHO,
                    A.QUANTIDADE,
                    COALESCE(A.LIB,'0') LIB,
                    A.SEQ,
                    COALESCE((SELECT SUM(S.QUANTIDADE)
                                FROM TBREQUISICAO_SOBRA S
                               WHERE S.REMESSA       = A.REMESSA
                                 AND S.TALAO         = A.CONTROLE
                                 AND S.REQUISICAO_ID = 0),0.0000) QUANTIDADE_SOBRA,
                
                   (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,A.TAMANHO)) TAMANHO_DESCRICAO,
                
                    IIF(A.ESPESSURA > 0 AND A.DENSIDADE > 0, LPAD(A.DENSIDADE,5,'0')||LPAD(A.ESPESSURA,5,'0'),
                    IIF(M.ESPESSURA > 0 AND M.DENSIDADE > 0, LPAD(M.DENSIDADE,5,'0')||LPAD(M.ESPESSURA,5,'0'),
                    COALESCE(
                    (SELECT FIRST 1
                            COALESCE((SELECT FIRST 1
                                        LPAD(M.DENSIDADE,5,'0')||LPAD(M.ESPESSURA,5,'0')
                                        FROM TBMODELO M
                                       WHERE M.CODIGO = P2.MODELO_CODIGO),'0000000000')
                       FROM TBMODELO_CONSUMO_COR MC, TBFAMILIA F, TBPRODUTO P2
                      WHERE MC.MODELO_ID = A.MODELO_CODIGO
                        AND MC.COR_ID = P.COR_CODIGO
                        AND MC.PRODUTO_ID = P2.CODIGO
                        AND P2.FAMILIA_CODIGO = F.CODIGO
                        AND F.DENSIDADE_ESPESSURA = '1'
                        AND((A.TAMANHO = 1 AND MC.T01 > 0) OR
                            (A.TAMANHO = 2 AND MC.T02 > 0) OR
                            (A.TAMANHO = 3 AND MC.T03 > 0) OR
                            (A.TAMANHO = 4 AND MC.T04 > 0) OR
                            (A.TAMANHO = 5 AND MC.T05 > 0) OR
                            (A.TAMANHO = 6 AND MC.T06 > 0) OR
                            (A.TAMANHO = 7 AND MC.T07 > 0) OR
                            (A.TAMANHO = 8 AND MC.T08 > 0) OR
                            (A.TAMANHO = 9 AND MC.T09 > 0) OR
                            (A.TAMANHO =10 AND MC.T10 > 0) OR
                            (A.TAMANHO =11 AND MC.T11 > 0) OR
                            (A.TAMANHO =12 AND MC.T12 > 0) OR
                            (A.TAMANHO =13 AND MC.T13 > 0) OR
                            (A.TAMANHO =14 AND MC.T14 > 0) OR
                            (A.TAMANHO =15 AND MC.T15 > 0) OR
                            (A.TAMANHO =16 AND MC.T16 > 0) OR
                            (A.TAMANHO =17 AND MC.T17 > 0) OR
                            (A.TAMANHO =18 AND MC.T18 > 0) OR
                            (A.TAMANHO =19 AND MC.T19 > 0) OR
                            (A.TAMANHO =20 AND MC.T20 > 0))),'0000000000'))) DENS_ESPESS,

                    (SELECT FIRST 1 COALESCE(C.CLASSE||'.'||LPAD(C.SUBCLASSE,3,'0'),'0.000') FROM TBCOR C WHERE P.COR_CODIGO = C.CODIGO) CLASSE,
                    (SELECT FIRST 1 COALESCE(C.PERFIL,'') FROM TBCOR C WHERE P.COR_CODIGO = C.CODIGO) PERFIL

                FROM TBREMESSA_ITEM_PROCESSADO A
                LEFT JOIN TBPRODUTO P ON A.PRODUTO_CODIGO = P.CODIGO
                LEFT JOIN TBMODELO M ON A.MODELO_CODIGO = M.CODIGO
                WHERE A.REMESSA = :REMESSA_ID
    
                ) X
    
            ORDER BY PERFIL,MODELO_DENSIDADE,MODELO_ESPESSURA,CLASSE,COR_DESCRICAO,PRODUTO_ID,TAMANHO,MATRIZ_ID,REMESSA_TALAO_ID
            ) Y
            WHERE (QUANTIDADE - QUANTIDADE_SOBRA) > 0
    INTO
        :IDENT_PROD_TAM_MTZ,
        :TALAO_ID,
        :REMESSA_TALAO_ID,
        :MODELO_ID,
        :MODELO_DENSIDADE,
        :MODELO_ESPESSURA,
        :MATRIZ_ID,
        :PRODUTO_ID,
        :GRADE_ID,
        :TAMANHO,
        :TAMANHO_DESCRICAO,
        :QUANTIDADE,
        :QUANTIDADE_SOBRA

        

    DO
    BEGIN

        IF ( NOT (COALESCE(MODELO_DENSIDADE,0) > 0) ) THEN
        BEGIN
            EXCEPTION "..." 'TALAO ' || LPAD(REMESSA_TALAO_ID,4,'0') || ' SEM DENSIDADE DE DEFINIDA';
        END


        IF ( NOT (COALESCE(MODELO_ESPESSURA,0) > 0) ) THEN
        BEGIN
            EXCEPTION "..." 'TALAO ' || LPAD(REMESSA_TALAO_ID,4,'0') || ' SEM ESPESSURA DE DEFINIDA';
        END

        IF ( IDENT_PROD_TAM_MTZ = 1 OR REQUISICAO = '1' ) THEN
        BEGIN
            APROVEITAMENTO = 0;
        END

        APROVEITAMENTO_TALAO_ID =
        (SELECT FIRST 1 P.ID
           FROM TBREMESSA_ITEM_PROCESSADO P
          WHERE P.REMESSA = :REMESSA_ID
            AND P.MATRIZ_CODIGO = :MATRIZ_ID
            AND P.PRODUTO_CODIGO = :PRODUTO_ID
            AND P.TAMANHO = :TAMANHO
          ORDER BY P.CONTROLE DESC);

        FOR
            SELECT
                MATRIZ_DESCRICAO,
                COEFICIENTE     MATRIZ_COEFICIENTE,
                LARGURA         MATRIZ_LARGURA,
                PLACA           MATRIZ_PLACA,
                SOBRA           MATRIZ_SOBRA,
                QUANTIDADE      MATRIZ_QUANTIDADE_POR_PLACA,
                (PLACA * QUANTIDADE + SOBRA) MATRIZ_QUANTIDADE_CHAPA
            FROM
                SPC_REMESSA_CONSUMO_MATRIZ(:MATRIZ_ID,:GRADE_ID,:TAMANHO)

        INTO
            :MATRIZ_DESCRICAO,
            :MATRIZ_COEFICIENTE,
            :MATRIZ_LARGURA,
            :MATRIZ_PLACA,
            :MATRIZ_SOBRA,
            :MATRIZ_QUANTIDADE_POR_PLACA,
            :MATRIZ_QUANTIDADE_CHAPA
        DO
        BEGIN
            
            IF ( NOT (MATRIZ_QUANTIDADE_POR_PLACA > 0)  ) THEN
            BEGIN
                EXCEPTION "..." 'TALAO ' || LPAD(REMESSA_TALAO_ID,4,'0') || ' - MATRIZ: ' || LPAD(MATRIZ_ID,5,'0') || ' - ' || MATRIZ_DESCRICAO || ' NO TAMANHO: [' || TAMANHO_DESCRICAO || '] ESTA SEM FATOR DE CONVERSAO OU QUANTIDADE DEFINIDA.';
            END

            CHAPAS = 0;
            PLACAS = 0;
            SOBRAS = 0;

            REQ_SOBRA = IIF( QUANTIDADE_SOBRA > 0, TRUNC(QUANTIDADE_SOBRA / MATRIZ_QUANTIDADE_CHAPA) * MATRIZ_QUANTIDADE_CHAPA, 0);

            CONSUMO_QUANTIDADE = QUANTIDADE - REQ_SOBRA - IIF(REMESSA_TALAO_ID < 8000, IIF(APROVEITAMENTO_TALAO_ID = TALAO_ID, APROVEITAMENTO,0), 0);

            IF ( QUANTIDADE <> QUANTIDADE_SOBRA AND CONSUMO_QUANTIDADE > 0 AND MATRIZ_COEFICIENTE > 0 ) THEN
            BEGIN
                CALC_CHAPA = (MATRIZ_PLACA * MATRIZ_QUANTIDADE_POR_PLACA) + MATRIZ_SOBRA;

                IF ( TRUNC( CONSUMO_QUANTIDADE / CALC_CHAPA ) = (CONSUMO_QUANTIDADE / CALC_CHAPA) ) THEN
                BEGIN
                    CALC_CHAPA = CONSUMO_QUANTIDADE / CALC_CHAPA;
                    CHAPAS = CALC_CHAPA;
                    PLACAS = MATRIZ_PLACA * CALC_CHAPA;
                    SOBRAS = IIF( MATRIZ_SOBRA > 0, CALC_CHAPA, 0);
                END
                ELSE
                BEGIN
                    CHAPAS = TRUNC(CONSUMO_QUANTIDADE/CALC_CHAPA) + IIF(QUANTIDADE - REQ_SOBRA <= V_LIMITE, 1,0);
                    PLACAS = MATRIZ_PLACA * TRUNC(CONSUMO_QUANTIDADE/CALC_CHAPA);
                    SOBRAS = IIF( MATRIZ_SOBRA > 0, TRUNC(CONSUMO_QUANTIDADE/CALC_CHAPA),0 );

                    IF ( QUANTIDADE - REQ_SOBRA <= V_LIMITE ) THEN
                    BEGIN
                        RESTO = CONSUMO_QUANTIDADE - ( PLACAS * MATRIZ_QUANTIDADE_POR_PLACA ) - ( SOBRAS * MATRIZ_SOBRA );

                        IF ( TRUNC( RESTO / MATRIZ_QUANTIDADE_POR_PLACA ) = ( RESTO / MATRIZ_QUANTIDADE_POR_PLACA ) ) THEN
                        BEGIN
                            PLACAS = PLACAS + ( RESTO / MATRIZ_QUANTIDADE_POR_PLACA );
                        END
                        ELSE
                        BEGIN
                            IF ( SOBRAS > 0 ) THEN
                            BEGIN
                                PLACAS = PLACAS + (TRUNC(RESTO / MATRIZ_QUANTIDADE_POR_PLACA));
                                SOBRAS = CHAPAS;

                            END
                            ELSE
                            BEGIN
                                PLACAS = PLACAS + (TRUNC(RESTO / MATRIZ_QUANTIDADE_POR_PLACA)+1);
                            END

                        END
                        

                    END
                END

                

            END



--            IF ( :REMESSA_ID = 45655 AND :REMESSA_TALAO_ID = 224 ) THEN
--            BEGIN
--                EXCEPTION "..." CHAPAS || ' ' || MATRIZ_LARGURA || ' ' || CHAPAS || ' ' || 0.001;
--            END


            EXECUTE PROCEDURE SPU_REMESSA_PEDIDO_TALAO6(
                ESTABELECIMENTO_ID,
                REMESSA_ID, 
                REMESSA_TALAO_ID, 
                CHAPAS,
                PLACAS,
                SOBRAS,
                IIF( TRUNC((MATRIZ_PLACA * CHAPAS) - PLACAS) > 0 , TRUNC((MATRIZ_PLACA * CHAPAS)-PLACAS), 0),
                IIF( MATRIZ_SOBRA > 0 , (TRUNC(CHAPAS) - SOBRAS), 0),
                CONSUMO_QUANTIDADE,
                IIF(REMESSA_TALAO_ID < 8000, IIF( TALAO_ID = APROVEITAMENTO_TALAO_ID, APROVEITAMENTO / MATRIZ_QUANTIDADE_POR_PLACA, 0),0),
                ((CHAPAS * MATRIZ_LARGURA)+(CHAPAS*0.001)),
                MODELO_ESPESSURA,
                MODELO_DENSIDADE
            );

            EXECUTE PROCEDURE SPI_REMESSA_CONSUMO_MATRIZ_V7(
                :REMESSA_ID,
                :REMESSA_TALAO_ID
            );

            APROVEITAMENTO = APROVEITAMENTO + ((TRUNC((MATRIZ_PLACA * CHAPAS ) - PLACAS) ) * MATRIZ_QUANTIDADE_POR_PLACA);

        END





    END

    EXECUTE PROCEDURE SPI_HISTORICO('TBREMESSA',:REMESSA_ID,'CALCULO DE CONSUMO / CALCULO DE APROVEITAMENTO PROCESSADO');
                
END;

CREATE OR ALTER procedure spc_corte_etiqueta (
    remessa_id integer,
    remessa_talao_id integer)
returns (
    etiq blob sub_type 1 segment size 80 character set win1252)
as
declare variable id integer;
declare variable remessa integer;
declare variable remessa_data date;
declare variable remessa_requisicao char(4);
declare variable remessa_tipo char(4);
declare variable controle integer;
declare variable modelo_codigo integer;
declare variable modelo_densidade integer;
declare variable modelo_espessura numeric(18,2);
declare variable matriz_codigo integer;
declare variable matriz_descricao varchar(80);
declare variable matriz_largura numeric(18,5);
declare variable produto_codigo integer;
declare variable produto_descricao varchar(400);
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_sobra numeric(18,4);
declare variable tolerancia numeric(18,4);
declare variable chapas numeric(18,5);
declare variable placas numeric(18,5);
declare variable sobras numeric(18,5);
declare variable placas_ smallint;
declare variable sobras_ smallint;
declare variable lib char(4);
declare variable consumo_medio numeric(18,5);
declare variable placa_altura numeric(18,5);
declare variable placa_comprimento numeric(18,5);
declare variable placa_sobra numeric(18,5);
declare variable placa numeric(18,5);
declare variable observacao varchar(800);
declare variable situacao integer;
declare variable descricao varchar(400);
declare variable grade_codigo integer;
declare variable cor_codigo integer;
declare variable classe varchar(20);
declare variable programacao_boca integer;
declare variable programacao_esteira integer;
declare variable tamanho_grade varchar(40);
declare variable programacao_sequencia integer;
declare variable esteira_descricao varchar(80);
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable turno char(4);
declare variable cor_descricao varchar(80);
declare variable seq varchar(40);
declare variable perfil varchar(10);
declare variable perc_sobra numeric(18,1);
declare variable flag char(4);
declare variable aproveitamento numeric(18,4);
declare variable mediapar numeric(18,4);
declare variable talao_origem blob sub_type 1 segment size 100;
declare variable largura_t numeric(15,5);
declare variable comprimento_t numeric(15,5);
declare variable placa_t numeric(15,5);
declare variable sobra_t numeric(15,5);
declare variable up_destino varchar(255);
declare variable cliente varchar(255);
declare variable localizacao varchar(255);
declare variable talao_vinculo_controle varchar(50);
begin

SELECT FIRST 1
    ID,
    REMESSA,
    REMESSA_DATA,
    REMESSA_REQUISICAO,
    REMESSA_TIPO,
    CONTROLE,
    MODELO_CODIGO,
    MODELO_DENSIDADE,
    MODELO_ESPESSURA,
    MATRIZ_CODIGO,
    MATRIZ_DESCRICAO,
    MATRIZ_LARGURA,
    PRODUTO_CODIGO,
    PRODUTO_DESCRICAO,
    TAMANHO,
    QUANTIDADE,
    QUANTIDADE_SOBRA,
    TOLERANCIA,
    CHAPAS,
    PLACAS,
    SOBRAS,
    PLACAS_,
    SOBRAS_,
    LIB,
    CONSUMO_MEDIO,
    PLACA_ALTURA,
    PLACA_COMPRIMENTO,
    PLACA_SOBRA,
    PLACA,
    OBSERVACAO,
    SITUACAO,
    DESCRICAO,
    GRADE_CODIGO,
    COR_CODIGO,
    CLASSE,
    PROGRAMACAO_BOCA,
    PROGRAMACAO_ESTEIRA,
    TAMANHO_GRADE,
    PROGRAMACAO_SEQUENCIA,
    ESTEIRA_DESCRICAO,
    HORA_PRODUCAO,
    HORA_LIBERACAO,
    TURNO,
    COR_DESCRICAO,
    SEQ,
    PERFIL,
    PERC_SOBRA,
    FLAG,
    APROVEITAMENTO,
    MEDIAPAR,
    CLIENTE,
    LOCALIZACAO,
    TALAO_VINCULO_CONTROLE
FROM
    (SELECT
        X.ID,
        X.REMESSA,
        X.REMESSA_DATA,
        X.REMESSA_REQUISICAO,
        X.REMESSA_TIPO,
        X.CONTROLE,
        X.MODELO_CODIGO,

        CAST(SUBSTRING(X.DENS_ESPESS FROM 1 FOR 5) AS INTEGER)  MODELO_DENSIDADE,

        CAST(SUBSTRING(X.DENS_ESPESS FROM 6 FOR 5) AS NUMERIC(15,2))  MODELO_ESPESSURA,
        
        X.MATRIZ_CODIGO,
        X.MATRIZ_DESCRICAO,
        X.MATRIZ_LARGURA,
        X.PRODUTO_CODIGO,
        X.PRODUTO_DESCRICAO,
        X.TAMANHO,
        X.QUANTIDADE,
        X.QUANTIDADE_SOBRA,
        X.TOLERANCIA,
        X.CHAPAS,
        X.PLACAS,
        X.SOBRAS,
        X.PLACAS_,
        X.SOBRAS_,
        X.LIB,
        X.CONSUMO_MEDIO,
        X.OBSERVACAO,
        X.SITUACAO,
        X.DESCRICAO,
        X.GRADE_CODIGO,
        X.COR_CODIGO,
        X.CLASSE,
        X.PROGRAMACAO_BOCA,
        X.PROGRAMACAO_ESTEIRA,
        X.TAMANHO_GRADE,
        X.PROGRAMACAO_SEQUENCIA,
        X.ESTEIRA_DESCRICAO,
        X.HORA_PRODUCAO,
        X.HORA_LIBERACAO,
        X.TURNO,
        (SELECT FIRST 1 DESCRICAO FROM TBCOR WHERE CODIGO = X.COR_CODIGO) COR_DESCRICAO,
        X.SEQ,
        X.PERFIL,
        X.PERC_SOBRA,
        '0' FLAG,
        X.APROVEITAMENTO,

        (SELECT FIRST 1 LARGURA
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA_ALTURA,
        (SELECT FIRST 1 COMPRIMENTO
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA_COMPRIMENTO,  
        (SELECT FIRST 1 SOBRA
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA_SOBRA,    
        (SELECT FIRST 1 PLACA
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA,

        CAST(IIF(X.CONSUMO_MEDIO>0,(X.QUANTIDADE-X.QUANTIDADE_SOBRA)/X.CONSUMO_MEDIO,0) AS NUMERIC(15,4)) MEDIAPAR,
        CLIENTE,
        LOCALIZACAO,
        TALAO_VINCULO_CONTROLE
    FROM
       (SELECT
            A.ID,
            A.REMESSA,
            R.DATA REMESSA_DATA,
            R.REQUISICAO REMESSA_REQUISICAO,
            R.TIPO REMESSA_TIPO,
            A.CONTROLE,
            A.MODELO_CODIGO,
            P.GRADE_CODIGO,
            A.MATRIZ_CODIGO,
            A.PRODUTO_CODIGO,
            P.DESCRICAO PRODUTO_DESCRICAO,
            A.TAMANHO,
            A.QUANTIDADE,
            A.TOLERANCIA,
            A.CHAPAS,
            A.PLACAS,
            A.SOBRAS,
            A.PLACAS_,
            A.SOBRAS_,
            A.CONSUMO_MEDIO,
            A.OBSERVACAO,
            A.SITUACAO,
            P.DESCRICAO,
            P.COR_CODIGO,
            A.PROGRAMACAO_BOCA,
            A.PROGRAMACAO_ESTEIRA,
            A.PROGRAMACAO_SEQUENCIA,
            A.HORA_PRODUCAO,
            A.HORA_LIBERACAO,
            A.TURNO,
            A.SEQ,
                         
            COALESCE(A.LIB,'0') LIB,

            COALESCE((SELECT SUM(S.QUANTIDADE) FROM TBREQUISICAO_SOBRA S
                       WHERE S.REMESSA = A.REMESSA AND S.TALAO = A.CONTROLE
                         AND S.REQUISICAO_ID = 0),0.0000) QUANTIDADE_SOBRA,

           (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,A.TAMANHO)) TAMANHO_GRADE,

            IIF(A.ESPESSURA > 0 AND A.DENSIDADE > 0, LPAD(A.DENSIDADE,5,'0')||LPAD(A.ESPESSURA,5,'0'),
            IIF(M.ESPESSURA > 0 AND M.DENSIDADE > 0, LPAD(M.DENSIDADE,5,'0')||LPAD(M.ESPESSURA,5,'0'),
            COALESCE(
            (SELECT FIRST 1
              COALESCE((SELECT FIRST 1 LPAD(M.DENSIDADE,5,'0')||LPAD(M.ESPESSURA,5,'0')
                 FROM TBMODELO M WHERE M.CODIGO = P2.MODELO_CODIGO),'0000000000')
              FROM TBMODELO_CONSUMO_COR MC, TBFAMILIA F, TBPRODUTO P2
             WHERE MC.MODELO_ID = A.MODELO_CODIGO
               AND MC.COR_ID = P.COR_CODIGO
               AND MC.PRODUTO_ID = P2.CODIGO
               AND P2.FAMILIA_CODIGO = F.CODIGO
               AND F.DENSIDADE_ESPESSURA = '1'),'0000000000'))) DENS_ESPESS,
        
            (SELECT FIRST 1 E.DESCRICAO FROM TBESTEIRA E WHERE A.PROGRAMACAO_ESTEIRA = E.CODIGO) ESTEIRA_DESCRICAO,

            (SELECT FIRST 1 G.DESCRICAO FROM TBMATRIZ G WHERE A.MATRIZ_CODIGO = G.CODIGO) MATRIZ_DESCRICAO,

            (SELECT FIRST 1 H.LARGURA   FROM TBMATRIZ H WHERE A.MATRIZ_CODIGO = H.CODIGO) MATRIZ_LARGURA,

            (SELECT FIRST 1 COALESCE(CLASSE||'.'||LPAD(SUBCLASSE,3,'0'),'0.000') FROM TBCOR WHERE P.COR_CODIGO = CODIGO) CLASSE,

            (SELECT FIRST 1 COALESCE(PERFIL,'') FROM TBCOR WHERE P.COR_CODIGO = CODIGO) PERFIL, A.PERC_SOBRA, A.APROVEITAMENTO,

            COALESCE((SELECT
                X.TABELA_ID ||' - '||
               (SELECT FIRST 1 (SELECT FIRST 1 LEFT(E.RAZAOSOCIAL,20) FROM TBEMPRESA E WHERE E.CODIGO = P.CLIENTE_CODIGO)
                  FROM TBPEDIDO P
                 WHERE P.PEDIDO = X.TABELA_ID) CLIENTE
            FROM (
                SELECT FIRST 1 B.TABELA_ID
                FROM TBPEDIDO_ITEM_PROCESSADO A, TBREMESSA_ITEM_ALOCACAO B
                WHERE A.REMESSA = C.REMESSA_ID
                  AND A.REMESSA_ACUMULADO_CONTROLE = C.REMESSA_TALAO_ID
                  AND A.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_ID
                  AND A.REMESSA = B.REMESSA
                  AND A.CONTROLE = B.TALAO
                  AND TIPO = 'P'
                  AND B.STATUS = 1) X
            ),'PRONTA ENTREGA')CLIENTE,
            COALESCE((SELECT FIRST 1 LPAD(L.CODIGO,3,0)||' - '||L.DESCRICAO AS LOCALIZACAO FROM TBLOCALIZACAO L WHERE L.CODIGO = A.LOCALIZACAO_ID),'') AS LOCALIZACAO,
            COALESCE((SELECT FIRST 1 ' T.' ||FN_LPAD(T1.REMESSA_TALAO_ID,4,0) || ' '
               FROM VWREMESSA_TALAO T1
              WHERE T1.ID = A.TALAO_VINCULO),'') TALAO_VINCULO_CONTROLE
    
        
        FROM
            TBPRODUTO P,
            TBMODELO M,
            TBREMESSA R,
            TBREMESSA_ITEM_PROCESSADO A
            left join VWREMESSA_CONSUMO C on A.REMESSA = C.REMESSA_ID and a.CONTROLE = C.REMESSA_TALAO_ID
        WHERE          
            A.PRODUTO_CODIGO = P.CODIGO
        AND A.MODELO_CODIGO  = M.CODIGO
        AND A.REMESSA        = R.NUMERO
        AND A.REMESSA        = :REMESSA_ID
        AND A.CONTROLE       = :REMESSA_TALAO_ID
        ORDER BY A.CONTROLE
        ) X
    ) Y
    ORDER BY MODELO_DENSIDADE DESC, MODELO_ESPESSURA DESC, CLASSE DESC, COR_DESCRICAO, PLACA_ALTURA, PLACA_COMPRIMENTO, ESTEIRA_DESCRICAO DESC, PRODUTO_DESCRICAO DESC
INTO
    ID,
    REMESSA,
    REMESSA_DATA,
    REMESSA_REQUISICAO,
    REMESSA_TIPO,
    CONTROLE,
    MODELO_CODIGO,
    MODELO_DENSIDADE,
    MODELO_ESPESSURA,
    MATRIZ_CODIGO,
    MATRIZ_DESCRICAO,
    MATRIZ_LARGURA,
    PRODUTO_CODIGO,
    PRODUTO_DESCRICAO,
    TAMANHO,
    QUANTIDADE,
    QUANTIDADE_SOBRA,
    TOLERANCIA,
    CHAPAS,
    PLACAS,
    SOBRAS,
    PLACAS_,
    SOBRAS_,
    LIB,
    CONSUMO_MEDIO,
    PLACA_ALTURA,
    PLACA_COMPRIMENTO,
    PLACA_SOBRA,
    PLACA,
    OBSERVACAO,
    SITUACAO,
    DESCRICAO,
    GRADE_CODIGO,
    COR_CODIGO,
    CLASSE,
    PROGRAMACAO_BOCA,
    PROGRAMACAO_ESTEIRA,
    TAMANHO_GRADE,
    PROGRAMACAO_SEQUENCIA,
    ESTEIRA_DESCRICAO,
    HORA_PRODUCAO,
    HORA_LIBERACAO,
    TURNO,
    COR_DESCRICAO,
    SEQ,
    PERFIL,
    PERC_SOBRA,
    FLAG,
    APROVEITAMENTO,
    MEDIAPAR,
    CLIENTE,
    LOCALIZACAO,
    TALAO_VINCULO_CONTROLE;


    ETIQ = '';
    IF ( ID > 0) THEN
    BEGIN
    
        ETIQ = COALESCE((
        SELECT FIRST 1 E.SCRIPT
          FROM TBETIQUETAS E
         WHERE E.ID = 136),'');
        
        SELECT FIRST 1
               FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_ORIGEM,
               FN_DESCRICAO('TBUP',T2.UP_ID)UP_DESCRICAO
          FROM VWREMESSA_CONSUMO C,
               TBREMESSA_CONSUMO_VINCULO V,
               VWREMESSA_TALAO T2
         WHERE C.REMESSA_ID        = :REMESSA
           AND C.REMESSA_TALAO_ID  = :CONTROLE
           AND V.CONSUMO_ID        = C.ID
           AND T2.REMESSA_ID       = V.REMESSA_ID
           AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
          INTO TALAO_ORIGEM,
               UP_DESTINO;

        TALAO_ORIGEM = COALESCE(TALAO_ORIGEM,'');
        UP_DESTINO   = COALESCE(UP_DESTINO,'');




        ETIQ = REPLACE(ETIQ,':)'                   ,'#2');
        ETIQ = REPLACE(ETIQ,'#MTZ#'                ,MATRIZ_DESCRICAO);
        ETIQ = REPLACE(ETIQ,'#CONSUMO#'            ,FN_FORMAT_NUMBER(CONSUMO_MEDIO,2)||' MTS '||FN_FORMAT_NUMBER(MEDIAPAR,2)||' PRS/MT');
        ETIQ = REPLACE(ETIQ,'#ESPESSURA#'          ,FN_FORMAT_NUMBER(MODELO_ESPESSURA,2));
        ETIQ = REPLACE(ETIQ,'#DENSIDADE#'          ,FN_LPAD(MODELO_DENSIDADE,2,0));
        ETIQ = REPLACE(ETIQ,'#CODIGOLIBERACAO1#'   ,FN_LPAD(REMESSA,6,0)||FN_LPAD(CONTROLE,4,0)||'03');
        ETIQ = REPLACE(ETIQ,'#CODIGOLIBERACAO2#'   ,FN_LPAD(REMESSA,6,0)||FN_LPAD(CONTROLE,4,0)||'04');
        ETIQ = REPLACE(ETIQ,'#NUMERO_TALAO#'       ,FN_LPAD(CONTROLE,3,0));
        ETIQ = REPLACE(ETIQ,'#TAMANHO#'            ,TAMANHO_GRADE);
        ETIQ = REPLACE(ETIQ,'#DATA_HORA_IMPRESSAO#',FN_DATE('NOW','DT HRS'));
        ETIQ = REPLACE(ETIQ,'#QUANTIDADELIBERACAO#',FN_FORMAT_NUMBER(QUANTIDADE-QUANTIDADE_SOBRA));
        ETIQ = REPLACE(ETIQ,'#QUANTIDADE_SOBRA#'   ,FN_FORMAT_NUMBER(QUANTIDADE_SOBRA));
        ETIQ = REPLACE(ETIQ,'#FABRICA#'            ,ESTEIRA_DESCRICAO);
        ETIQ = REPLACE(ETIQ,'#DATA#'               ,FN_DATE(REMESSA_DATA,'DT'));
        ETIQ = REPLACE(ETIQ,'#CHAPAS#'             ,FN_LPAD(FN_FORMAT_NUMBER(CHAPAS),2,0));
        ETIQ = REPLACE(ETIQ,'#PLACAS#'             ,FN_LPAD(FN_FORMAT_NUMBER(PLACAS),2,0));
        ETIQ = REPLACE(ETIQ,'#SOBRAS#'             ,FN_LPAD(FN_FORMAT_NUMBER(SOBRAS),2,0));
        ETIQ = REPLACE(ETIQ,'#SUB_PLACAS#'         ,FN_LPAD(FN_FORMAT_NUMBER(PLACAS_),2,0));
        ETIQ = REPLACE(ETIQ,'#SUB_SOBRAS#'         ,FN_LPAD(FN_FORMAT_NUMBER(SOBRAS_),2,0));
        ETIQ = REPLACE(ETIQ,'#REMESSA#'            ,FN_LPAD(REMESSA,5,0));
        ETIQ = REPLACE(ETIQ,'#TURNO#'              ,TURNO);
        ETIQ = REPLACE(ETIQ,'#OB#'                 ,'');
        ETIQ = REPLACE(ETIQ,'#SUBUP#'              ,FN_LPAD(PROGRAMACAO_BOCA,2,0));
        ETIQ = REPLACE(ETIQ,'#CLASSE#'             ,'('||FN_FORMAT_NUMBER(CLASSE)||')');
        ETIQ = REPLACE(ETIQ,'#PRODUTO_ID#'         ,FN_LPAD(PRODUTO_CODIGO,5,0));
        ETIQ = REPLACE(ETIQ,'#PRODUTO#'            ,FN_REMOVE_ACENTOS(PRODUTO_DESCRICAO));
        ETIQ = REPLACE(ETIQ,'#PRODUTO2#'           ,TRIM(REPLACE(PRODUTO_DESCRICAO,'BOJO','')));
        ETIQ = REPLACE(ETIQ,'#COMPOSICAO#'         ,'');
        ETIQ = REPLACE(ETIQ,'#VIP#'                ,IIF(REMESSA_TIPO = '2','VIP',''));
        ETIQ = REPLACE(ETIQ,'#CLIENTE#'            ,CLIENTE );
        ETIQ = REPLACE(ETIQ,'#APROVEITAMENTO#'     ,IIF(APROVEITAMENTO > 0,'+'||FN_FORMAT_NUMBER(APROVEITAMENTO),''));
        ETIQ = REPLACE(ETIQ,'#TALAO_ORIGEM#'       ,TALAO_ORIGEM);
        ETIQ = REPLACE(ETIQ,'#UP_DESTINO#'         ,UP_DESTINO);
    
        IF ( MATRIZ_CODIGO > 0 ) THEN
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TAMANHOPLACAS#',FN_FORMAT_NUMBER(PLACA_ALTURA,2)||' X '|| FN_FORMAT_NUMBER(PLACA_COMPRIMENTO,2));
            
            IF (PLACA_SOBRA > 0) THEN
            BEGIN
                ETIQ = REPLACE(ETIQ,'#TAMANHOSOBRAS#',FN_FORMAT_NUMBER(PLACA_ALTURA,2)||' X '|| FN_FORMAT_NUMBER(MATRIZ_LARGURA - (PLACA * PLACA_COMPRIMENTO),2));
            END
            ELSE
            BEGIN
                ETIQ = REPLACE(ETIQ,'#TAMANHOSOBRAS#','');
            END
        END
        ELSE
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TAMANHOPLACAS#','');
            ETIQ = REPLACE(ETIQ,'#TAMANHOSOBRAS#','');
        END
    
                                            
        ETIQ = REPLACE(ETIQ,'#SEQUENCIAL2#',TALAO_VINCULO_CONTROLE);
--        IF (SUBSTRING(SEQ FROM 1 FOR 3) = 'ULT') THEN
--        BEGIN
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL1#','');
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL2#',SEQ);
--        END ELSE
--        BEGIN
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL1#',SEQ);
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL2#','');
--        END
    
        IF ((PERC_SOBRA > 0) AND (REMESSA_REQUISICAO = '0')) THEN --SOBRAS
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TIPO#','R');
            ETIQ = REPLACE(ETIQ,'#COMENTARIO#',FN_FORMAT_NUMBER(PERC_SOBRA,1)||'%');
        END
        ELSE
        IF ((CONTROLE > 9000) AND (REMESSA_REQUISICAO = '1')) THEN --REQUISIÇÃO
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TIPO#','R');
            ETIQ = REPLACE(ETIQ,'#COMENTARIO#',' REQ ');
        END
        ELSE
        BEGIN                                         --NORMAL
            ETIQ = REPLACE(ETIQ,'#TIPO#','N');
            ETIQ = REPLACE(ETIQ,'#COMENTARIO#','');
        END
    END

    SUSPEND;

end;

CREATE OR ALTER trigger ttbcor_b9u for tbcor
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.DESCRICAO <> NEW.DESCRICAO) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.'||OLD.DESCRICAO||'->'||NEW.DESCRICAO;
       END
   if (OLD.tonalidade <> NEW.tonalidade) then
       BEGIN
       HISTORICO = HISTORICO||' Ton.:'||OLD.tonalidade||'->'||NEW.tonalidade;
       END
   if (OLD.ton_fornecedor <> NEW.ton_fornecedor) then
       BEGIN
       HISTORICO = HISTORICO||' Ton.Forn.'||OLD.ton_fornecedor||'->'||NEW.ton_fornecedor;
       END
   if (OLD.abreviado <> NEW.abreviado) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.Abv.'||OLD.abreviado||'->'||NEW.abreviado;
       END
   if (OLD.classe||Old.subclasse <> NEW.classe||New.subclasse) then
       BEGIN
       HISTORICO = HISTORICO||' Class/Sub.'||OLD.classe||'.'||Old.subclasse||'->'||NEW.classe||'.'||NEW.subclasse;
       END
   if (OLD.perfil <> NEW.perfil) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.'||OLD.perfil||'->'||NEW.perfil;
       END
   if (OLD.Pantone <> NEW.Pantone) then
       BEGIN
       HISTORICO = HISTORICO||' Pantone '||OLD.Pantone||'->'||NEW.Pantone;
       END
   if (OLD.observacao <> NEW.observacao) then
       BEGIN
       HISTORICO = HISTORICO||' Obs.'||OLD.observacao||'->'||NEW.observacao;
       END
   if (OLD.amostra <> NEW.amostra) then
       BEGIN
       HISTORICO = HISTORICO||' Amostra:'||OLD.amostra||'->'||NEW.amostra;
       END
   if (OLD.qtd_cores <> NEW.qtd_cores) then
       BEGIN
       HISTORICO = HISTORICO||' Qtd.Cores:'||OLD.qtd_cores||'->'||NEW.qtd_cores;
       END
   if (OLD.TEMPO_SETUP <> NEW.TEMPO_SETUP) then
       BEGIN
       HISTORICO = HISTORICO||' Tmp.Set.'||OLD.TEMPO_SETUP||'->'||NEW.TEMPO_SETUP;
       END
   if (OLD.TEMPO_SETUP_APROVACAO <> NEW.TEMPO_SETUP_APROVACAO) then
       BEGIN
       HISTORICO = HISTORICO||' Tmp.Set.Aprv.'||OLD.TEMPO_SETUP_APROVACAO||'->'||NEW.TEMPO_SETUP_APROVACAO;
       END

   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Status Inativado';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Status Ativado';
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBCOR', OLD.CODIGO,
      (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),
       :Historico);
       End
end;

CREATE OR ALTER trigger ttbcontacontabil_b9u for tbcontacontabil
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;

CREATE OR ALTER trigger ttbcontacontabil_biu0 for tbcontacontabil
active before insert or update position 0
AS
begin

end;

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

CREATE OR ALTER trigger ttbcontacontabil_biu0 for tbcontacontabil
active before insert or update position 0
AS
begin
  if (NOT COALESCE(NEW.CODECD,0) > 0) then /* Trigger text */
     BEGIN
     Exception "..." 'CODIGO DA CONTA ECD OBRIGATORIO, OPERACAO CANCELADA! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
     END
end;



CREATE OR ALTER trigger ttbcontacontabil_b9u for tbcontacontabil
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   IF (OLD.CONTA <> NEW.CONTA) THEN
       BEGIN
       HISTORICO = HISTORICO||' CONTA:'||OLD.CONTA||'->'||NEW.CONTA;
       END
   IF (OLD.ANALITICA <> NEW.ANALITICA) THEN
       BEGIN
       HISTORICO = HISTORICO||' ANALITICA:'||OLD.ANALITICA||'->'||NEW.ANALITICA;
       END

   IF (OLD.DESCRICAO <> NEW.DESCRICAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' DESCRICAO:'||OLD.DESCRICAO||'->'||NEW.DESCRICAO;
       END
   IF (OLD.DESCRED <> NEW.DESCRED) THEN
       BEGIN
       HISTORICO = HISTORICO||' DESC.REDUZ.'||OLD.DESCRED||'->'||NEW.DESCRED;
       END
   IF (OLD.NATUREZA <> NEW.NATUREZA) THEN
       BEGIN
       HISTORICO = HISTORICO||' NAT:'||OLD.NATUREZA||'->'||NEW.NATUREZA;
       END
   IF (OLD.GRUPOLALUR <> NEW.GRUPOLALUR) THEN
       BEGIN
       HISTORICO = HISTORICO||' GRP.LALUR:'||OLD.GRUPOLALUR||'->'||NEW.GRUPOLALUR;
       END
   IF (OLD.GRUPOCONTA <> NEW.GRUPOCONTA) THEN
       BEGIN
       HISTORICO = HISTORICO||' GRP.CONTA:'||OLD.GRUPOCONTA||'->'||NEW.GRUPOCONTA;
       END

   IF (OLD.RPCF <> NEW.RPCF) THEN
       BEGIN
       HISTORICO = HISTORICO||' RPCF:'||OLD.RPCF||'->'||NEW.RPCF;
       END
   IF (OLD.CODECD <> NEW.CODECD) THEN
       BEGIN
       HISTORICO = HISTORICO||' COD.ECD:'||OLD.CODECD||'->'||NEW.CODECD;
       END

   IF (OLD.CODREDUZIDO <> NEW.CODREDUZIDO) THEN
       BEGIN
       HISTORICO = HISTORICO||' COD RED:'||OLD.CODREDUZIDO||'->'||NEW.CODREDUZIDO;
       END
   IF (OLD.DATATIVINI <> NEW.DATATIVINI) THEN
       BEGIN
       HISTORICO = HISTORICO||' DATA:'||OLD.DATATIVINI||'->'||NEW.DATATIVINI;
       END
   IF (OLD.CST_PISCOF <> NEW.CST_PISCOF) THEN
       BEGIN
       HISTORICO = HISTORICO||' CST PIS/COF:'||OLD.CST_PISCOF||'->'||NEW.CST_PISCOF;
       END
   IF (OLD.NAT_BC_CRED <> NEW.NAT_BC_CRED) THEN
       BEGIN
       HISTORICO = HISTORICO||' NAT.BC.CRED.'||OLD.NAT_BC_CRED||'->'||NEW.NAT_BC_CRED;
       END
   IF (OLD.IND_ORIGEM <> NEW.IND_ORIGEM) THEN
       BEGIN
       HISTORICO = HISTORICO||' IND.ORIGEM:'||OLD.IND_ORIGEM||'->'||NEW.IND_ORIGEM;
       END
   IF (OLD.NAT_RECEITA <> NEW.NAT_RECEITA) THEN
       BEGIN
       HISTORICO = HISTORICO||' NAT.RECEITA:'||OLD.NAT_RECEITA||'->'||NEW.NAT_RECEITA;
       END
   IF (OLD.CCUSTO <> NEW.CCUSTO) THEN
       BEGIN
       HISTORICO = HISTORICO||' C.CUSTO:'||OLD.CCUSTO||'->'||NEW.CCUSTO;
       END

   IF (OLD.CONTROLE_ORCAMENTARIO <> NEW.CONTROLE_ORCAMENTARIO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CONTR.ORCAMENT:'||OLD.CONTROLE_ORCAMENTARIO||'->'||NEW.CONTROLE_ORCAMENTARIO;
       END
   IF (OLD.PERFIL <> NEW.PERFIL) THEN
       BEGIN
       HISTORICO = HISTORICO||' PERF:'||OLD.PERFIL||'->'||NEW.PERFIL;
       END
   IF (OLD.GRUPO <> NEW.GRUPO) THEN
       BEGIN
       HISTORICO = HISTORICO||' GRUPO:'||OLD.GRUPO||'->'||NEW.GRUPO;
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBCONTACONTABIL', OLD.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),
       :Historico);
       End
End;


ALTER TABLE TBCONFIGURACAO ADD OLD_PERFIL VARCHAR(10);
update TBCONFIGURACAO set OLD_PERFIL = SPED_PERFIL;
ALTER TABLE TBCONFIGURACAO DROP SPED_PERFIL;
ALTER TABLE TBCONFIGURACAO ADD SPED_PERFIL VARCHAR(10) DEFAULT '';
update TBCONFIGURACAO set SPED_PERFIL = OLD_PERFIL;
ALTER TABLE TBCONFIGURACAO DROP OLD_PERFIL;
ALTER TABLE TBCLIENTE_OCORRENCIA ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBCLIENTE_OCORRENCIA set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBCLIENTE_OCORRENCIA DROP CLASSIFICACAO;
ALTER TABLE TBCLIENTE_OCORRENCIA ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBCLIENTE_OCORRENCIA set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBCLIENTE_OCORRENCIA DROP OLD_PERFIL;
CREATE OR ALTER trigger ttbccusto_b9u for tbcentro_de_custo
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;

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

CREATE OR ALTER trigger ttbccusto_b9u for tbcentro_de_custo
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.DESCRICAO <> NEW.DESCRICAO) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.'||OLD.DESCRICAO||'->'||NEW.DESCRICAO;
       END
   if (OLD.Conta_Contabil <> NEW.Conta_Contabil) then
       BEGIN
       HISTORICO = HISTORICO||' C.Cont.'||OLD.Conta_Contabil||'->'||NEW.Conta_Contabil;
       END
   if (OLD.Historico_Contabil<> NEW.Historico_Contabil) then
       BEGIN
       HISTORICO = HISTORICO||' Hist.Cont.'||OLD.Historico_Contabil||'->'||NEW.Historico_Contabil;
       END
   if (OLD.Gp_Id <> NEW.Gp_Id) then
       BEGIN
       HISTORICO = HISTORICO||' GP.'||OLD.Gp_Id||'->'||NEW.Gp_Id;
       END
   if (OLD.Estabelecimento_Id <> NEW.Estabelecimento_Id) then
       BEGIN
       HISTORICO = HISTORICO||' Estab.'||OLD.Estabelecimento_Id||'->'||NEW.Estabelecimento_Id;
       END
   if (OLD.Perfil <> NEW.Perfil) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.'||OLD.Perfil||'->'||NEW.Perfil;
       END
   if (OLD.CT <> NEW.CT) then
       BEGIN
       HISTORICO = HISTORICO||' CT:'||OLD.CT||'->'||NEW.CT;
       END
   if (OLD.Reg_Indicador <> NEW.Reg_Indicador) then
       BEGIN
       HISTORICO = HISTORICO||' Reg.Ind.'||OLD.Reg_Indicador||'->'||NEW.Reg_Indicador;
       END
   if (OLD.Email <> NEW.Email) then
       BEGIN
       HISTORICO = HISTORICO||' Email:'||OLD.Email||'->'||NEW.Email;
       END
   if (OLD.Operacao_Codigo <> NEW.Operacao_Codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Oper.'||OLD.Operacao_Codigo||'->'||NEW.Operacao_Codigo;
       END
   if (OLD.Operacao_Codigo_Pedido <> NEW.Operacao_Codigo_Pedido) then
       BEGIN
       HISTORICO = HISTORICO||' Oper.Ped.'||OLD.Operacao_Codigo_Pedido||'->'||NEW.Operacao_Codigo_Pedido;
       END
   if (OLD.NIVEL <> NEW.NIVEL) then
       BEGIN
       HISTORICO = HISTORICO||' Nív.'||OLD.NIVEL||'->'||NEW.NIVEL;
       END
   if (OLD.CCUSTO_CONTABILIZACAO <> NEW.CCUSTO_CONTABILIZACAO) then
       BEGIN
       HISTORICO = HISTORICO||' C.Custo Cont.'||OLD.CCUSTO_CONTABILIZACAO||'->'||NEW.CCUSTO_CONTABILIZACAO;
       END
   if (OLD.TIPO_CUSTO <> NEW.TIPO_CUSTO) then
       BEGIN
       HISTORICO = HISTORICO||' Tp.Custo:'||OLD.TIPO_CUSTO||'->'||NEW.TIPO_CUSTO;
       END

   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Status Inativado';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Status Ativado';
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBCENTRO_DE_CUSTO', OLD.CODIGO,
      (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),
       :Historico);
       End
end;
DROP INDEX ITBCALENDARIO_ESTACAO_03;


ALTER TABLE TBCALENDARIO_ESTACAO ADD OLD_PERFIL VARCHAR(10);
update TBCALENDARIO_ESTACAO set OLD_PERFIL = PERFIL_SKU;
ALTER TABLE TBCALENDARIO_ESTACAO DROP PERFIL_SKU;
ALTER TABLE TBCALENDARIO_ESTACAO ADD PERFIL_SKU VARCHAR(10);
update TBCALENDARIO_ESTACAO set PERFIL_SKU = OLD_PERFIL;
ALTER TABLE TBCALENDARIO_ESTACAO DROP OLD_PERFIL;


CREATE INDEX ITBCALENDARIO_ESTACAO_03 ON TBCALENDARIO_ESTACAO (PERFIL_SKU);

ALTER TABLE TBCAIXABANCO ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBCAIXABANCO set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBCAIXABANCO DROP CLASSIFICACAO;
ALTER TABLE TBCAIXABANCO ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBCAIXABANCO set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBCAIXABANCO DROP OLD_PERFIL;CREATE OR ALTER procedure spu_desaloca_agrup_pedido (
    estabelecimento_id integer,
    agrupamento_id integer,
    id integer)
returns (
    quant numeric(15,4),
    saldo numeric(15,4),
    cap_sku numeric(15,4),
    cap_cor numeric(15,4),
    perfil_sku char(10),
    perfil_cor char(10),
    tabela_id integer,
    tab_item_id integer,
    tamanho integer)
as
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

end;

CREATE OR ALTER procedure spu_desaloca_agrup_pedido2 (
    estabelecimento_id integer,
    tabela_id integer,
    tab_item_id integer,
    tamanho integer)
as
declare variable quant numeric(15,4);
declare variable saldo numeric(15,4);
declare variable cap_sku numeric(15,4);
declare variable cap_cor numeric(15,4);
declare variable perfil_sku varchar(10);
declare variable perfil_cor varchar(10);
declare variable agrupamento_id integer;
declare variable id integer;
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

end;

CREATE OR ALTER procedure spu_desaloca_agrup_pedido3 (
    estabelecimento_id integer,
    agrupamento_id integer,
    id integer,
    quant numeric(15,4))
as
declare variable saldo numeric(15,4);
declare variable cap_sku numeric(15,4);
declare variable cap_cor numeric(15,4);
declare variable perfil_sku varchar(10);
declare variable perfil_cor varchar(10);
declare variable tabela_id integer;
declare variable tab_item_id integer;
declare variable tamanho integer;
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

end;

CREATE OR ALTER procedure spu_trata_pedido_remessa5 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku varchar(10),
    perfil_cor varchar(10),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

end;

CREATE OR ALTER procedure spu_trata_pedido_remessa6 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku varchar(1),
    perfil_cor varchar(10),
    rem_status char(10),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

end;

CREATE OR ALTER procedure spu_trata_ped_item_remessa5 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku char(1),
    perfil_cor char(1),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
BEGIN
    
end;

ALTER TABLE TBAGRUPAMENTO_PEDIDO ADD OLD_PERFIL_SKU VARCHAR(10);
update TBAGRUPAMENTO_PEDIDO set OLD_PERFIL_SKU = PERFIL_SKU;
ALTER TABLE TBAGRUPAMENTO_PEDIDO DROP PERFIL_SKU;
ALTER TABLE TBAGRUPAMENTO_PEDIDO ADD PERFIL_SKU VARCHAR(10) DEFAULT '';
update TBAGRUPAMENTO_PEDIDO set PERFIL_SKU = OLD_PERFIL_SKU;
ALTER TABLE TBAGRUPAMENTO_PEDIDO DROP OLD_PERFIL_SKU;

ALTER TABLE TBAGRUPAMENTO_PEDIDO ADD OLD_PERFIL_COR VARCHAR(10);
update TBAGRUPAMENTO_PEDIDO set OLD_PERFIL_COR = PERFIL_COR;
ALTER TABLE TBAGRUPAMENTO_PEDIDO DROP PERFIL_COR;
ALTER TABLE TBAGRUPAMENTO_PEDIDO ADD PERFIL_COR VARCHAR(10) DEFAULT '';
update TBAGRUPAMENTO_PEDIDO set PERFIL_COR = OLD_PERFIL_COR;
ALTER TABLE TBAGRUPAMENTO_PEDIDO DROP OLD_PERFIL_COR;

CREATE OR ALTER procedure spu_trata_ped_item_remessa5 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku char(1),
    perfil_cor char(1),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
BEGIN
    
FOR
Select First 1 A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
               A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--               Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                          Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

               Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                          Where T.Tabela_Id = A.Pedido
                            and T.Tab_Item_Id = A.Controle
                            and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                            AND T.TAMANHO = A.TAMANHO
                            and T.Status = '1'),'0') Rem_Status,

               Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                          Where C.Pedido = A.Pedido
                            and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
               -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult,

                  (Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                     From TbPedido P, TbPerfil PF
                    Where P.Pedido = A.Pedido
                      and P.Classificacao = PF.Id
                      and PF.Tabela = 'PED') aloc_mult

  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Controle = :Controle_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :qtd_mult, :aloc_mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin
    
           vQtd_Prd = Trunc(:Qtd_Prd);

           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                and B.Saldo >= :Qtd_Mult
                Order By R.Data
                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    Do
                       Begin
    
                        if (:Id > 0) then
                            Begin
    
                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
            
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
            
                                        if (:AGRUPAMENTO_ID > 0) Then -- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        :vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
            
                                        if (:AGRUPAMENTO_ID > 0) Then 
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        :vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                           End
                        End
                   End
           End
     End
End;

CREATE OR ALTER procedure spu_trata_pedido_remessa6 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku varchar(1),
    perfil_cor varchar(10),
    rem_status char(10),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

FOR 
Select A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
       A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--     Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

       Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                  Where T.Tabela_Id = A.Pedido
                    and T.Tab_Item_Id = A.Controle
                    and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                    AND T.TAMANHO = A.TAMANHO
                    and T.Status = '1'),'0') Rem_Status,

       Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                  Where C.Pedido = A.Pedido
                    and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
       -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult


  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin

           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                and B.Saldo >= :Qtd_Mult
                Order By R.Data

                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    Do
                      Begin

                      if (:ID > 0) then
                           Begin

                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
                    
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                        --Exit;
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                              End
                          End
                    End
           End
     End
End;

CREATE OR ALTER procedure spu_trata_pedido_remessa5 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku varchar(10),
    perfil_cor varchar(10),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

FOR 
Select A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
       A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--     Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

       Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                  Where T.Tabela_Id = A.Pedido
                    and T.Tab_Item_Id = A.Controle
                    and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                    AND T.TAMANHO = A.TAMANHO
                    and T.Status = '1'),'0') Rem_Status,

       Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                  Where C.Pedido = A.Pedido
                    and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
       -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult


  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin

           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                Order By R.Data

                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    Do
                      Begin

                      if (:ID > 0) then
                           Begin

                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
                    
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                        --Exit;
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                              End
                          End
                    End
           End
     End
End;

CREATE OR ALTER procedure spu_desaloca_agrup_pedido3 (
    estabelecimento_id integer,
    agrupamento_id integer,
    id integer,
    quant numeric(15,4))
as
declare variable saldo numeric(15,4);
declare variable cap_sku numeric(15,4);
declare variable cap_cor numeric(15,4);
declare variable perfil_sku varchar(10);
declare variable perfil_cor varchar(10);
declare variable tabela_id integer;
declare variable tab_item_id integer;
declare variable tamanho integer;
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

For
   Select A.Quantidade-A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Sku and P.Tabela = 'SKU'),
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Cor and P.Tabela = 'COR'),
          A.tabela_id, A.tab_item_id, A.tamanho
     From TbAgrupamento_Pedido A                     
    Where Estabelecimento_id = :Estabelecimento_Id 
      and Agrupamento_Id = :Agrupamento_Id
      and Id = :Id
      and Quantidade - Saldo > 0
    Into :Saldo, :Perfil_Sku, :Perfil_Cor, :Cap_Sku,
         :Cap_Cor, :tabela_id, :tab_item_id, :tamanho
    Do

    if (:Id > 0) then
        Begin

        if (Quant < Saldo) then
            Begin
            Saldo = :Quant;
            End

        if (:Saldo > 0) then
            Begin
    
              Update TbAgrupamento_Pedido Set
               Quantidade =  Quantidade - :Saldo,
               Necess_Sku = (Quantidade - :Saldo)/:Cap_Sku,
               Necess_Cor = (Quantidade - :Saldo)/:Cap_Cor 
--             Saldo = 0
               Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :Id
                 and Saldo < Quantidade;
              /*
              if (:tabela_id > 0) then
                  Begin
                  Update tbpedido_item Set
                   Agp_Dt_Cli = Null,
                   Agp_Dt_Prd = Null
                   Where Estabelecimento_Codigo = :Estabelecimento_Id
                     and Pedido   = :tabela_id
                     and Controle = :tab_item_id
                     and Tamanho  = :Tamanho;
                  End
              */
              vSaldo_Cor = :Saldo;
              vSaldo_GP  = :Saldo;
              vSaldo_Fer = :Saldo;

              if (:vSaldo_Cor > 0) then
                  Begin
                    FOR
                       Select A1.QUANTIDADE, A1.NECESSIDADE, A1.ID
                         From TBAGRUPAMENTO_CARGA_SKU_COR A1
                        Where A1.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A1.AGRUP_PED_ID = :Id
                          and A1.Quantidade > 0
                        Order By A1.Quantidade Desc
                        Into :QUANTIDADE1, :NECESSIDADE1, :ID1
                        Do
                        Begin
                           if (:vSaldo_Cor <= :QUANTIDADE1 and :vSaldo_Cor > 0) Then
                               Begin
                               update tbagrupamento_carga_sku_cor set
                               quantidade = quantidade - :vSaldo_Cor,
                               necessidade = necessidade - (:vSaldo_Cor/:Cap_Cor)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = 0;
                               End else
                           if (:vSaldo_Cor > :QUANTIDADE1) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Cor Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = vSaldo_Cor - :QUANTIDADE1;
                               End
                        End
                  End
    
              if (:vSaldo_Gp > 0) then
                  Begin
                    FOR
                       Select A2.QUANTIDADE, A2.NECESSIDADE, A2.ID
                         From TBAGRUPAMENTO_CARGA_SKU_GP A2
                        Where A2.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A2.AGRUP_PED_ID = :Id
                          and A2.Quantidade > 0
                        Order By A2.Quantidade Desc
                        Into :QUANTIDADE2, :NECESSIDADE2, :ID2
                        Do
                        Begin
                           if (:vSaldo_Gp <= :QUANTIDADE2 and :vSaldo_Gp > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = Quantidade - :vSaldo_Gp,
                               Necessidade = Necessidade - (:vSaldo_Gp/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = 0;
                               End else
                           if (:vSaldo_Gp > :QUANTIDADE2) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = vSaldo_Gp - :QUANTIDADE2;
                               End
                        End
                  End
    
              if (:vSaldo_Fer > 0) then
                  Begin
                    FOR
                       Select A3.QUANTIDADE, A3.NECESSIDADE, A3.ID
                         From TBAGRUPAMENTO_CARGA_SKU_FER A3
                        Where A3.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A3.AGRUP_PED_ID = :Id
                          and A3.Quantidade > 0
                        Order By A3.Quantidade Desc
                        Into :QUANTIDADE3, :NECESSIDADE3, :ID3
                        Do
                        Begin
                           if (:vSaldo_Fer <= :QUANTIDADE3 and :vSaldo_Fer > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = Quantidade - :vSaldo_Fer,
                               Necessidade = Necessidade - (:vSaldo_Fer/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = 0;
                               End else
                           if (:vSaldo_Fer > :QUANTIDADE3) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = vSaldo_Fer - :QUANTIDADE3;
                               End
                        End
                  End
            End
        End
End;

CREATE OR ALTER procedure spu_desaloca_agrup_pedido2 (
    estabelecimento_id integer,
    tabela_id integer,
    tab_item_id integer,
    tamanho integer)
as
declare variable quant numeric(15,4);
declare variable saldo numeric(15,4);
declare variable cap_sku numeric(15,4);
declare variable cap_cor numeric(15,4);
declare variable perfil_sku varchar(10);
declare variable perfil_cor varchar(10);
declare variable agrupamento_id integer;
declare variable id integer;
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

FOR

   Select A.Quantidade, A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Sku and P.Tabela = 'SKU'),
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Cor and P.Tabela = 'COR'),
          A.agrupamento_id, A.id
     From TbAgrupamento_Pedido A                     
    Where Estabelecimento_id = :Estabelecimento_Id 
      and tabela_id = :tabela_id
      and tab_item_id = :tab_item_id
      and tamanho = :tamanho
      and Saldo > 0
    Into :Quant, :Saldo, :Perfil_Sku, :Perfil_Cor,
         :Cap_Sku, :Cap_Cor, :agrupamento_id, :id
    Do

    if (:Id > 0) then
        Begin

        if (:Quant = :Saldo) then
            Begin
            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Agrupamento_Id = :Agrupamento_Id
              and Id = :Id
              and Saldo = Quantidade;
            End else
        if (:Saldo > 0) then
            Begin
    
              Update TbAgrupamento_Pedido Set
               Quantidade =  Quantidade - Saldo,
               Necess_Sku = (Quantidade - Saldo)/:Cap_Sku,
               Necess_Cor = (Quantidade - Saldo)/:Cap_Cor,
               Saldo = 0
               Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :Id
                 and Saldo < Quantidade;

              if (:tabela_id > 0) then
                  Begin
                  Update tbpedido_item Set
                   Agp_Dt_Cli = Null,
                   Agp_Dt_Prd = Null
                   Where Estabelecimento_Codigo = :Estabelecimento_Id
                     and Pedido   = :tabela_id
                     and Controle = :tab_item_id
                     and Tamanho  = :Tamanho;
                  End

              vSaldo_Cor = :Saldo;
              vSaldo_GP  = :Saldo;
              vSaldo_Fer = :Saldo;

              if (:vSaldo_Cor > 0) then
                  Begin
                    FOR
                       Select A1.QUANTIDADE, A1.NECESSIDADE, A1.ID
                         From TBAGRUPAMENTO_CARGA_SKU_COR A1
                        Where A1.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A1.AGRUP_PED_ID = :Id
                          and A1.Quantidade > 0
                        Order By A1.Quantidade Desc
                        Into :QUANTIDADE1, :NECESSIDADE1, :ID1
                        Do
                        Begin
                           if (:vSaldo_Cor <= :QUANTIDADE1 and :vSaldo_Cor > 0) Then
                               Begin
                               update tbagrupamento_carga_sku_cor set
                               quantidade = quantidade - :vSaldo_Cor,
                               necessidade = necessidade - (:vSaldo_Cor/:Cap_Cor)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = 0;
                               End else
                           if (:vSaldo_Cor > :QUANTIDADE1) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Cor Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = vSaldo_Cor - :QUANTIDADE1;
                               End
                        End
                  End
    
              if (:vSaldo_Gp > 0) then
                  Begin
                    FOR
                       Select A2.QUANTIDADE, A2.NECESSIDADE, A2.ID
                         From TBAGRUPAMENTO_CARGA_SKU_GP A2
                        Where A2.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A2.AGRUP_PED_ID = :Id
                          and A2.Quantidade > 0
                        Order By A2.Quantidade Desc
                        Into :QUANTIDADE2, :NECESSIDADE2, :ID2
                        Do
                        Begin
                           if (:vSaldo_Gp <= :QUANTIDADE2 and :vSaldo_Gp > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = Quantidade - :vSaldo_Gp,
                               Necessidade = Necessidade - (:vSaldo_Gp/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = 0;
                               End else
                           if (:vSaldo_Gp > :QUANTIDADE2) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = vSaldo_Gp - :QUANTIDADE2;
                               End
                        End
                  End
    
              if (:vSaldo_Fer > 0) then
                  Begin
                    FOR
                       Select A3.QUANTIDADE, A3.NECESSIDADE, A3.ID
                         From TBAGRUPAMENTO_CARGA_SKU_FER A3
                        Where A3.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A3.AGRUP_PED_ID = :Id
                          and A3.Quantidade > 0
                        Order By A3.Quantidade Desc
                        Into :QUANTIDADE3, :NECESSIDADE3, :ID3
                        Do
                        Begin
                           if (:vSaldo_Fer <= :QUANTIDADE3 and :vSaldo_Fer > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = Quantidade - :vSaldo_Fer,
                               Necessidade = Necessidade - (:vSaldo_Fer/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = 0;
                               End else
                           if (:vSaldo_Fer > :QUANTIDADE3) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = vSaldo_Fer - :QUANTIDADE3;
                               End
                        End
                  End
            End
        End
End;

CREATE OR ALTER procedure spu_desaloca_agrup_pedido (
    estabelecimento_id integer,
    agrupamento_id integer,
    id integer)
returns (
    quant numeric(15,4),
    saldo numeric(15,4),
    cap_sku numeric(15,4),
    cap_cor numeric(15,4),
    perfil_sku varchar(10),
    perfil_cor varchar(10),
    tabela_id integer,
    tab_item_id integer,
    tamanho integer)
as
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

FOR

   Select A.Quantidade, A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Sku and P.Tabela = 'SKU'),
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Cor and P.Tabela = 'COR'),
          A.tabela_id, A.tab_item_id, A.tamanho
     From TbAgrupamento_Pedido A                     
    Where Estabelecimento_id = :Estabelecimento_Id 
      and Agrupamento_Id = :Agrupamento_Id
      and Id = :Id
      and Saldo > 0
    Into :Quant, :Saldo, :Perfil_Sku, :Perfil_Cor, :Cap_Sku,
         :Cap_Cor, :tabela_id, :tab_item_id, :tamanho
    Do

    if (:Id > 0) then
        Begin

        if (:Quant = :Saldo) then
            Begin
            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Agrupamento_Id = :Agrupamento_Id
              and Id = :Id
              and Saldo = Quantidade;
            End else
        if (:Saldo > 0) then
            Begin
    
              Update TbAgrupamento_Pedido Set
               Quantidade =  Quantidade - Saldo,
               Necess_Sku = (Quantidade - Saldo)/:Cap_Sku,
               Necess_Cor = (Quantidade - Saldo)/:Cap_Cor,
               Saldo = 0
               Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :Id
                 and Saldo < Quantidade;

              if (:tabela_id > 0) then
                  Begin
                  Update tbpedido_item Set
                   Agp_Dt_Cli = Null,
                   Agp_Dt_Prd = Null
                   Where Estabelecimento_Codigo = :Estabelecimento_Id
                     and Pedido   = :tabela_id
                     and Controle = :tab_item_id
                     and Tamanho  = :Tamanho;
                  End

              vSaldo_Cor = :Saldo;
              vSaldo_GP  = :Saldo;
              vSaldo_Fer = :Saldo;

              if (:vSaldo_Cor > 0) then
                  Begin
                    FOR
                       Select A1.QUANTIDADE, A1.NECESSIDADE, A1.ID
                         From TBAGRUPAMENTO_CARGA_SKU_COR A1
                        Where A1.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A1.AGRUP_PED_ID = :Id
                          and A1.Quantidade > 0
                        Order By A1.Quantidade Desc
                        Into :QUANTIDADE1, :NECESSIDADE1, :ID1
                        Do
                        Begin
                           if (:vSaldo_Cor <= :QUANTIDADE1 and :vSaldo_Cor > 0) Then
                               Begin
                               update tbagrupamento_carga_sku_cor set
                               quantidade = quantidade - :vSaldo_Cor,
                               necessidade = necessidade - (:vSaldo_Cor/:Cap_Cor)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = 0;
                               End else
                           if (:vSaldo_Cor > :QUANTIDADE1) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Cor Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = vSaldo_Cor - :QUANTIDADE1;
                               End
                        End
                  End
    
              if (:vSaldo_Gp > 0) then
                  Begin
                    FOR
                       Select A2.QUANTIDADE, A2.NECESSIDADE, A2.ID
                         From TBAGRUPAMENTO_CARGA_SKU_GP A2
                        Where A2.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A2.AGRUP_PED_ID = :Id
                          and A2.Quantidade > 0
                        Order By A2.Quantidade Desc
                        Into :QUANTIDADE2, :NECESSIDADE2, :ID2
                        Do
                        Begin
                           if (:vSaldo_Gp <= :QUANTIDADE2 and :vSaldo_Gp > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = Quantidade - :vSaldo_Gp,
                               Necessidade = Necessidade - (:vSaldo_Gp/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = 0;
                               End else
                           if (:vSaldo_Gp > :QUANTIDADE2) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = vSaldo_Gp - :QUANTIDADE2;
                               End
                        End
                  End
    
              if (:vSaldo_Fer > 0) then
                  Begin
                    FOR
                       Select A3.QUANTIDADE, A3.NECESSIDADE, A3.ID
                         From TBAGRUPAMENTO_CARGA_SKU_FER A3
                        Where A3.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A3.AGRUP_PED_ID = :Id
                          and A3.Quantidade > 0
                        Order By A3.Quantidade Desc
                        Into :QUANTIDADE3, :NECESSIDADE3, :ID3
                        Do
                        Begin
                           if (:vSaldo_Fer <= :QUANTIDADE3 and :vSaldo_Fer > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = Quantidade - :vSaldo_Fer,
                               Necessidade = Necessidade - (:vSaldo_Fer/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = 0;
                               End else
                           if (:vSaldo_Fer > :QUANTIDADE3) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = vSaldo_Fer - :QUANTIDADE3;
                               End
                        End
                  End
            End
        End
End;

CREATE TABLE TBTEMP_AJUSTE (
    AGRUPAMENTO_ID  INTEGER NOT NULL,
    GP_ID           INTEGER NOT NULL,
    SUBUP_ID        INTEGER NOT NULL,
    PERFIL          varchar(10) NOT NULL,
    ID              INTEGER NOT NULL,
    CAP_PRODUTIVA   NUMERIC(15,4) DEFAULT 0,
    QUANTIDADE      NUMERIC(15,4) DEFAULT 0,
    SALDO           NUMERIC(15,4) DEFAULT 0,
    CAP_MINUTO      NUMERIC(15,4) DEFAULT 0,
    FLAG            SMALLINT DEFAULT 0
);

insert into TBTEMP_AJUSTE
select
	AGRUPAMENTO_ID,
	GP_ID,
	SUBUP_ID,
	PERFIL,
	ID,
	CAP_PRODUTIVA,
	QUANTIDADE,
	SALDO,
	CAP_MINUTO,
	FLAG
from TBAGRUPAMENTO_CARGA_GP;

CREATE OR ALTER trigger ttbagrup_carga_sku_gp_b1d_01 for tbagrupamento_carga_sku_gp
active before delete position 1
AS
begin

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_gp_b1i_01 for tbagrupamento_carga_sku_gp
active before insert position 1
AS
Begin

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_gp_b1u_01 for tbagrupamento_carga_sku_gp
active before update position 1
AS
declare variable vGP_id integer;
declare variable vSubUP_id integer;
declare variable vPerfil Char(1);

declare variable vMinutos integer;
declare variable vAgrup_GP_id  integer;
Begin

End;

DROP TRIGGER TTBAGRUP_CARGA_GP_B0I;
DROP TRIGGER TTBAGRUP_CARGA_GP_B0U_01;
DROP TABLE TBAGRUPAMENTO_CARGA_GP;

CREATE TABLE TBAGRUPAMENTO_CARGA_GP (
    AGRUPAMENTO_ID  INTEGER NOT NULL,
    GP_ID           INTEGER NOT NULL,
    SUBUP_ID        INTEGER NOT NULL,
    PERFIL          varchar(10) NOT NULL,
    ID              INTEGER NOT NULL,
    CAP_PRODUTIVA   NUMERIC(15,4) DEFAULT 0,
    QUANTIDADE      NUMERIC(15,4) DEFAULT 0,
    SALDO           NUMERIC(15,4) DEFAULT 0,
    CAP_MINUTO      NUMERIC(15,4) DEFAULT 0,
    FLAG            SMALLINT DEFAULT 0
);

ALTER TABLE TBAGRUPAMENTO_CARGA_GP ADD PRIMARY KEY (AGRUPAMENTO_ID, GP_ID, SUBUP_ID, PERFIL, ID);

insert into TBAGRUPAMENTO_CARGA_GP
select
	AGRUPAMENTO_ID,
	GP_ID,
	SUBUP_ID,
	PERFIL,
	ID,
	CAP_PRODUTIVA,
	QUANTIDADE,
	SALDO,
	CAP_MINUTO,
	FLAG
from TBTEMP_AJUSTE;

DROP TABLE TBTEMP_AJUSTE;

CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_GP_B0I FOR TBAGRUPAMENTO_CARGA_GP
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbagrupamento_carga_GP,1);
end;

CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_GP_B0U_01 FOR TBAGRUPAMENTO_CARGA_GP
ACTIVE BEFORE UPDATE POSITION 0
as
begin
  if (new.Saldo <> Old.Saldo and Old.Flag >= New.Flag) then
      Begin
      if (New.Saldo < 0 and new.Saldo < Old.Saldo) Then
          Begin
          Exception "..." 'Não há saldo disponível';
          End
      End
end;

CREATE OR ALTER trigger ttbagrup_carga_sku_gp_b1d_01 for tbagrupamento_carga_sku_gp
active before delete position 1
AS
begin

    UPDATE tbagrupamento_carga_gp set
    Quantidade = Quantidade - OLD.Quantidade,
    Saldo = Saldo + OLD.Necessidade
      Where AGRUPAMENTO_ID = OLD.Agrupamento_Id
        and ID = OLD.Agrup_gp_Id;

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_gp_b1i_01 for tbagrupamento_carga_sku_gp
active before insert position 1
AS
Begin

  UPDATE tbagrupamento_carga_gp set
  Quantidade = Quantidade + NEW.Quantidade,
  Saldo = Saldo - NEW.Necessidade
  Where AGRUPAMENTO_ID = New.Agrupamento_Id
    and ID = New.Agrup_gp_Id;

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_gp_b1u_01 for tbagrupamento_carga_sku_gp
active before update position 1
AS
declare variable vGP_id integer;
declare variable vSubUP_id integer;
declare variable vPerfil Char(1);

declare variable vMinutos integer;
declare variable vAgrup_GP_id  integer;
Begin
  if (NEW.Agrupamento_Id = OLD.Agrupamento_Id) then
      Begin
      if (NEW.Quantidade < OLD.Quantidade) then
          Begin
           UPDATE tbagrupamento_carga_gp set
           Quantidade = Quantidade - (Old.Quantidade - New.Quantidade),
           Saldo = Saldo + Abs(New.Necessidade - Old.Necessidade)
           Where AGRUPAMENTO_ID = New.Agrupamento_Id
             and ID = New.Agrup_gp_Id;
          End else
      if (NEW.Quantidade > OLD.Quantidade) then
          Begin
           UPDATE tbagrupamento_carga_gp set
           Quantidade = Quantidade + (New.Quantidade - Old.Quantidade),
           Saldo = Saldo - Abs(New.Necessidade - Old.Necessidade)
           Where AGRUPAMENTO_ID = New.Agrupamento_Id
             and ID = New.Agrup_Gp_Id;
          End
      End else
  if (NEW.Agrupamento_Id <> OLD.Agrupamento_Id) then
      Begin

      For
      Select First 1 F1.GP_id, F1.subup_id, F1.perfil
        From TBAGRUPAMENTO_CARGA_GP F1
       Where F1.agrupamento_id = Old.Agrupamento_Id
         and F1.id = Old.Agrup_GP_Id
      Into :vGP_id, :vsubup_id, :vPerfil
      Do Begin

           For
           Select First 1 A.minutos_produtivos, Coalesce(F2.ID,0) as Agrup_GP_id from TbAgrupamento A
             Left Join TBAGRUPAMENTO_CARGA_GP F2 ON F2.agrupamento_id = A.ID and F2.GP_id = :vGP_id and F2.Subup_id = :vsubup_id and F2.Perfil = :vPerfil
            Where A.ID = New.Agrupamento_Id
            Into :vMinutos, :vAgrup_GP_id
            Do Begin
               if (:vAgrup_GP_id = 0) then
                   Begin
                   vAgrup_GP_id = gen_id(gtbagrupamento_carga_GP,1);
                   Insert into TBAGRUPAMENTO_CARGA_GP
                   (AGRUPAMENTO_ID,GP_ID,SUBUP_ID, PERFIL,ID,CAP_PRODUTIVA,QUANTIDADE,SALDO)
                    values (New.Agrupamento_Id,:vGP_id,:vSUBUP_ID,:vPERFIL,:vAgrup_GP_id,:vMinutos,0,:vMinutos);
                   End
               End

         End

       UPDATE tbagrupamento_carga_gp set
       Quantidade = Quantidade - Old.Quantidade,
       Saldo = Saldo + Old.Necessidade
       Where AGRUPAMENTO_ID = Old.Agrupamento_Id
         and ID = Old.Agrup_Gp_Id;

       UPDATE tbagrupamento_carga_gp set
       Quantidade = Quantidade + New.Quantidade,
       Saldo = Saldo - New.Necessidade
       Where AGRUPAMENTO_ID = New.Agrupamento_Id
         and ID = :vAgrup_Gp_Id;

       New.Agrup_Gp_Id = :vAgrup_Gp_Id;
      End
End;



GRANT ALL ON TBAGRUPAMENTO_CARGA_GP TO RDB$ADMIN;CREATE TABLE TBTEMP_AJUSTE (
    AGRUPAMENTO_ID  INTEGER NOT NULL,
    PERFIL          CHAR(1) NOT NULL,
    ID              INTEGER NOT NULL,
    CAP_PRODUTIVA   NUMERIC(15,4) DEFAULT 0,
    QUANTIDADE      NUMERIC(15,4) DEFAULT 0,
    SALDO           NUMERIC(15,4) DEFAULT 0,
    CAP_MINUTO      NUMERIC(15,4) DEFAULT 0,
    FLAG            SMALLINT DEFAULT 0
);

insert into TBTEMP_AJUSTE
select
    AGRUPAMENTO_ID,
    PERFIL,
    ID,
    CAP_PRODUTIVA,
    QUANTIDADE,
    SALDO,
    CAP_MINUTO,
    FLAG
from  TBAGRUPAMENTO_CARGA_COR;

DROP TRIGGER TTBAGRUP_CARGA_COR_B0U_01;
DROP TRIGGER TTBAGRUP_CARGA_COR_B0I;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1d_01 for tbagrupamento_carga_sku_cor
active before delete position 1
AS
begin

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1i_01 for tbagrupamento_carga_sku_cor
active before insert position 1
AS
Begin

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1u_01 for tbagrupamento_carga_sku_cor
active before update position 1
AS
declare variable vPerfil Char(1);
declare variable vMinutos integer;
declare variable vAgrup_Cor_id  integer;
Begin

End;

DROP TABLE TBAGRUPAMENTO_CARGA_COR;

CREATE TABLE TBAGRUPAMENTO_CARGA_COR (
    AGRUPAMENTO_ID  INTEGER NOT NULL,
    PERFIL          varchar(10) NOT NULL,
    ID              INTEGER NOT NULL,
    CAP_PRODUTIVA   NUMERIC(15,4) DEFAULT 0,
    QUANTIDADE      NUMERIC(15,4) DEFAULT 0,
    SALDO           NUMERIC(15,4) DEFAULT 0,
    CAP_MINUTO      NUMERIC(15,4) DEFAULT 0,
    FLAG            SMALLINT DEFAULT 0
);

ALTER TABLE TBAGRUPAMENTO_CARGA_COR ADD PRIMARY KEY (AGRUPAMENTO_ID, PERFIL, ID);

insert into TBAGRUPAMENTO_CARGA_COR
select
    AGRUPAMENTO_ID,
    PERFIL,
    ID,
    CAP_PRODUTIVA,
    QUANTIDADE,
    SALDO,
    CAP_MINUTO,
    FLAG
from  TBTEMP_AJUSTE;

DROP TABLE TBTEMP_AJUSTE;

CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_COR_B0I FOR TBAGRUPAMENTO_CARGA_COR
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbagrupamento_carga_cor,1);
end;

CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_COR_B0U_01 FOR TBAGRUPAMENTO_CARGA_COR
ACTIVE BEFORE UPDATE POSITION 0
as
begin
  if (new.Saldo <> Old.Saldo and Old.Flag >= New.Flag) then
      Begin
      if (New.Saldo < 0 and new.Saldo < Old.Saldo) Then
          Begin
          Exception "..." 'Não há saldo disponível.'||Cast(Old.Saldo as VarChar(20))||' -> '||Cast(New.Saldo as VarChar(20));
          End
      End
end;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1d_01 for tbagrupamento_carga_sku_cor
active before delete position 1
AS
begin

    UPDATE tbagrupamento_carga_cor set
    Quantidade = Quantidade - OLD.Quantidade,
    Saldo = Saldo + OLD.Necessidade
      Where AGRUPAMENTO_ID = OLD.Agrupamento_Id
        and ID = OLD.Agrup_cor_Id;

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1i_01 for tbagrupamento_carga_sku_cor
active before insert position 1
AS
Begin

  UPDATE tbagrupamento_carga_cor set
  Quantidade = Quantidade + NEW.Quantidade,
  Saldo = Saldo - NEW.Necessidade
  Where AGRUPAMENTO_ID = New.Agrupamento_Id
    and ID = New.Agrup_cor_Id;

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1u_01 for tbagrupamento_carga_sku_cor
active before update position 1
AS
declare variable vPerfil Char(1);
declare variable vMinutos integer;
declare variable vAgrup_Cor_id  integer;
Begin
  if (NEW.Agrupamento_Id = OLD.Agrupamento_Id) then
      Begin
          if (NEW.Quantidade < OLD.Quantidade) then
              Begin
               UPDATE tbagrupamento_carga_cor set
               Quantidade = Quantidade - Abs(Old.Quantidade - New.Quantidade),
               Saldo = Saldo + Abs(New.Necessidade - Old.Necessidade)
               Where AGRUPAMENTO_ID = New.Agrupamento_Id
                 and ID = New.Agrup_cor_Id;
              End else
          if (NEW.Quantidade > OLD.Quantidade) then
              Begin
               UPDATE tbagrupamento_carga_cor set
               Quantidade = Quantidade + Abs(New.Quantidade - Old.Quantidade),
               Saldo = Saldo - Abs(New.Necessidade - Old.Necessidade)
               Where AGRUPAMENTO_ID = New.Agrupamento_Id
                 and ID = New.Agrup_Cor_Id;
              End
      End else
  if (NEW.Agrupamento_Id <> OLD.Agrupamento_Id) then
      Begin

      vPerfil = Coalesce((Select First 1 F1.Perfil
                            From TBAGRUPAMENTO_CARGA_COR F1
                           Where F1.agrupamento_id = Old.Agrupamento_Id
                             and F1.id = Old.Agrup_Cor_Id),0);

       For
       Select First 1 A.minutos_produtivos, Coalesce(F2.ID,0) as Agrup_Cor_id from TbAgrupamento A
         Left Join TBAGRUPAMENTO_CARGA_COR F2 ON F2.agrupamento_id = A.ID and f2.Perfil = :vPerfil
        Where A.ID = New.Agrupamento_Id
        Into :vMinutos, :vAgrup_Cor_id
        Do Begin
           if (:vAgrup_Cor_id = 0) then
               Begin
               vAgrup_Cor_id = gen_id(gtbagrupamento_carga_cor,1);
               Insert into TBAGRUPAMENTO_CARGA_COR
               (AGRUPAMENTO_ID,PERFIL,ID,CAP_PRODUTIVA,QUANTIDADE,SALDO)
                values (New.Agrupamento_Id,:vPerfil,:vAgrup_Cor_id,:vMinutos,0,:vMinutos);
               End
           End

       UPDATE tbagrupamento_carga_cor set
       Quantidade = Quantidade - Old.Quantidade,
       Saldo = Saldo + Old.Necessidade
       Where AGRUPAMENTO_ID = Old.Agrupamento_Id
         and ID = Old.Agrup_Cor_Id;

       UPDATE tbagrupamento_carga_cor set
       Quantidade = Quantidade + New.Quantidade,
       Saldo = Saldo - New.Necessidade
       Where AGRUPAMENTO_ID = New.Agrupamento_Id
         and ID = :vAgrup_Cor_Id;

       New.Agrup_Cor_Id = :vAgrup_Cor_Id;
      End
End;

GRANT ALL ON TBAGRUPAMENTO_CARGA_COR TO RDB$ADMIN;

DROP INDEX ITBAGRUPAMENTO_05;

CREATE OR ALTER trigger ttbagrupamento_b0i_01 for tbagrupamento
active before insert position 9
AS
DECLARE VARIABLE Agrup_Id Integer;
DECLARE VARIABLE Agrup_Desc VARCHAR(50);
begin

end;

CREATE OR ALTER trigger ttbagrupamento_b0u_01 for tbagrupamento
active before update position 9
AS
DECLARE VARIABLE Agrup_Id Integer;
DECLARE VARIABLE Agrup_Desc VARCHAR(50);
DECLARE VARIABLE Pedidos Integer;
begin

end;

CREATE OR ALTER trigger ttbagrupamento_b9u for tbagrupamento
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;


CREATE OR ALTER procedure spu_trata_pedido_data10 (
    pedido_1 integer,
    data_emissao_1 date,
    data_cliente_1 date,
    perfil_1 varchar(10),
    programado_1 char(1))
returns (
    controle integer,
    data_cliente date,
    data_producao date,
    agp_dt_prd date,
    agp_dt_cli date,
    est_min char(1),
    data_agrupamento date,
    rem_status char(1),
    qtd_prd numeric(15,4),
    qtd_est numeric(15,4),
    qtd_agp numeric(15,4),
    qtd_rem numeric(15,4),
    tipo_pedido char(1))
as
declare variable rem_stat char(1);
declare variable registros char(1);
declare variable tratamento_ped char(1);
declare variable maior_data_cliente date;
declare variable maior_data_producao date;
BEGIN

end;

CREATE OR ALTER procedure spu_trata_pedido_data11 (
    pedido_1 integer,
    data_emissao_1 date,
    data_cliente_1 date,
    perfil_1 varchar(10),
    programado_1 char(1))
returns (
    controle integer,
    data_cliente date,
    data_producao date,
    agp_dt_prd date,
    agp_dt_cli date,
    est_min char(1),
    data_agrupamento date,
    rem_status char(1),
    qtd_prd numeric(15,4),
    qtd_est numeric(15,4),
    qtd_agp numeric(15,4),
    qtd_rem numeric(15,4),
    tipo_pedido char(1))
as
declare variable rem_stat char(1);
declare variable registros char(1);
declare variable tratamento_ped char(1);
declare variable maior_data_cliente date;
declare variable maior_data_producao date;
declare variable vhora time;
BEGIN

end;

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

CREATE INDEX ITBAGRUPAMENTO_05 ON TBAGRUPAMENTO (PERFIL,DATA_INICIAL);

CREATE OR ALTER procedure spu_trata_pedido_data11 (
    pedido_1 integer,
    data_emissao_1 date,
    data_cliente_1 date,
    perfil_1 varchar(10),
    programado_1 char(1))
returns (
    controle integer,
    data_cliente date,
    data_producao date,
    agp_dt_prd date,
    agp_dt_cli date,
    est_min char(1),
    data_agrupamento date,
    rem_status char(1),
    qtd_prd numeric(15,4),
    qtd_est numeric(15,4),
    qtd_agp numeric(15,4),
    qtd_rem numeric(15,4),
    tipo_pedido char(1))
as
declare variable rem_stat char(1);
declare variable registros char(1);
declare variable tratamento_ped char(1);
declare variable maior_data_cliente date;
declare variable maior_data_producao date;
declare variable vhora time;
BEGIN

  Tratamento_Ped = '1';
  Maior_Data_Cliente  = Cast('01.01.2000' as Date);
  Maior_Data_Producao = Cast('01.01.2000' as Date);
  Registros = '0';
  Rem_Stat = '0';

  vHora = Cast((Select First 1 Valor_Ext From TbControle_n Where ID = 234) as Time);

if (Pedido_1 > 0) then
  Begin
    FOR 
    Select A.Controle,
           A.Data_Cliente, A.Data_Producao, A.Agp_Dt_Prd, A.Agp_Dt_Cli, A.Est_Min,

           Coalesce((Select First 1 Max(AGP.DATA_FINAL) From TbAgrupamento_Pedido T, TbAgrupamento AGP
                      Where T.ESTABELECIMENTO_ID = AGP.ESTABELECIMENTO_ID
                        AND T.Agrupamento_Id = AGP.Id
                        and T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and AGP.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Saldo > 0
                        and T.Tipo in ('P','M')),
                   (Select
                    (Select First 1 AGP.Data_Final From TbAgrupamento AGP
                      Where AGP.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                        and AGP.data_inicial <= X.Data
                        and AGP.data_final >= X.Data
                        and AGP.status = '1'
                        and AGP.simulacao = '0'
                        and AGP.perfil = :perfil_1) Data
                    From (
                    Select Max(Cast(R.Data_Bsc as Date)) Data
                      From tbremessa_item_alocacao T, TbRemessa R
                     Where T.ESTABELECIMENTO_ID = R.Estabelecimento_codigo
                       and T.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                       and t.Remessa = R.Numero
                       and T.Tabela_Id = A.Pedido
                       and T.Tab_Item_Id = A.Controle
                       AND T.TAMANHO = A.TAMANHO
                       and T.Tipo in ('P','M')
                       and T.Saldo > 0
                    ) X)) Data_Agrupamento,

           Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                      Where T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Status = '1'),'0') Rem_Status,
    
           Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                      Where C.Pedido = A.Pedido
                        and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
           -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem, A.Qtd_Est, A.Qtd_Agp, A.Qtd_Rem,

           (Select First 1 P.Tipo_Pedido From TbPedido P Where a.pedido = p.pedido) Tipo_Pedido

      From TbPedido_Item A
     Where A.Pedido = :Pedido_1
       and A.Situacao = 1
       and A.Tamanho > 0
    -- For Update
     With Lock
    
    Into :Controle, :Data_Cliente, :Data_Producao, :Agp_Dt_Prd, :Agp_Dt_Cli,
         :Est_Min, :Data_Agrupamento, :Rem_Status,
         :Qtd_Prd, :Qtd_Est, :Qtd_Agp, :Qtd_Rem, :Tipo_Pedido
    Do
        
    if (:Tipo_Pedido = '1') then --Pedido Normal
        begin
        if (:Rem_Status = '0') then
             Begin
             Registros = '1';
             -- Tratamento via Est.Minimo --
             if (:Est_Min = '1') then
                  Begin
                     -- Em Estoque
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                         if (Current_Time <= :vHora and Current_Date = :Data_Emissao_1 and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                             Begin
                                 if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                             End else
                             Begin
                             if (Current_Date+1 >= :Maior_Data_Cliente and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                                 Begin
                                 if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                                 End else
                             if (:Data_Cliente >= :Maior_Data_Cliente) then
                                 Begin
                                  if (Maior_Data_Producao < :Data_Producao) then Maior_Data_Producao = :Data_Producao;
                                  if (Maior_Data_Cliente  < :Data_Cliente ) then Maior_Data_Cliente  = :Data_Cliente;
                                 End
                             End

                  End else
              -- Tratamento via Agrupamento --
             if (:Est_Min = '0') then
                  Begin
                     -- Em Estoque
                     if (:Qtd_Prd = 0 and :Qtd_Agp = 0 and :Qtd_Rem = 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Current_Time <= :vHora and Current_Date = :Data_Emissao_1) then
                              Begin
                               if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                              End else
                              Begin
                               if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                              End

                          End else
                     -- Em Agrupamento ou Producao
                     if ((:Qtd_Prd = 0) and (:Qtd_Agp > 0 or :Qtd_Rem > 0)) then
                          Begin

                          --
                          --if (Agp_Dt_Prd is not null) then
                          if (Data_Producao is not null) then
                              begin
                          --  Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Agp_Dt_Prd));
                              Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Data_Producao));
                              end

                          Update TbPedido_Item Set
                          Agp_Dt_Prd = :Data_Agrupamento,
                          Agp_Dt_Cli = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Maior_Data_Producao < :Data_Agrupamento) then
                              Maior_Data_Producao = :Data_Agrupamento;
                          if (Maior_Data_Cliente  < :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))) then
                              Maior_Data_Cliente  = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao));

                          if (Maior_Data_Producao <= :Data_Emissao_1) then
                              Begin
                              Maior_Data_Producao = :Data_Producao;
                              Maior_Data_Cliente  = :Data_Cliente;
                              End

                          End else
                     -- A Produzir > 0
                     if (:Qtd_Prd > 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          Tratamento_Ped = '0'; --Pedido precisa ser tratado
                          End
                  End
             End

        End
  End

  if (:Registros = '1' and :Rem_Stat = '0') then
      Begin

      if (:Tratamento_Ped = '0') Then
           Begin
           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBPEDIDO', :PEDIDO_1,
          (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),
           'Ha itens com pendencias que evitaram a conclusao no tratamento do pedido');
           End
    
      if (:Tratamento_Ped = '1') Then
           Begin

           If ((:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) or (:Programado_1 = '0' )) Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao,
               Data_Cliente = :Maior_Data_Cliente
               Where Pedido = :Pedido_1;
               End else

           If (:Programado_1 = '1') Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao
               Where Pedido = :Pedido_1
                 and Data_Entrega < :Maior_Data_Producao;
               End

           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
           'TBPEDIDO', :PEDIDO_1,
           (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),
           'Pedido tratado por completo');

           if (:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) Then
               Begin
               INSERT INTO TBHISTORICO (
               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
              'TBPEDIDO', :PEDIDO_1,
              (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),
               'O tratamento de itens forcou a alteracao da data do cliente no Pedido Programado');
               End
           End

      End

End;

CREATE OR ALTER procedure spu_trata_pedido_data10 (
    pedido_1 integer,
    data_emissao_1 date,
    data_cliente_1 date,
    perfil_1 varchar(10),
    programado_1 char(1))
returns (
    controle integer,
    data_cliente date,
    data_producao date,
    agp_dt_prd date,
    agp_dt_cli date,
    est_min char(1),
    data_agrupamento date,
    rem_status char(1),
    qtd_prd numeric(15,4),
    qtd_est numeric(15,4),
    qtd_agp numeric(15,4),
    qtd_rem numeric(15,4),
    tipo_pedido char(1))
as
declare variable rem_stat char(1);
declare variable registros char(1);
declare variable tratamento_ped char(1);
declare variable maior_data_cliente date;
declare variable maior_data_producao date;
BEGIN

  Tratamento_Ped = '1';
  Maior_Data_Cliente  = Cast('01.01.2000' as Date);
  Maior_Data_Producao = Cast('01.01.2000' as Date);
  Registros = '0';
  Rem_Stat = '0';

if (Pedido_1 > 0) then
  Begin
    FOR 
    Select A.Controle,
           A.Data_Cliente, A.Data_Producao, A.Agp_Dt_Prd, A.Agp_Dt_Cli, A.Est_Min,

           Coalesce((Select First 1 Max(AGP.DATA_FINAL) From TbAgrupamento_Pedido T, TbAgrupamento AGP
                      Where T.ESTABELECIMENTO_ID = AGP.ESTABELECIMENTO_ID
                        AND T.Agrupamento_Id = AGP.Id
                        and T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and AGP.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Saldo > 0
                        and T.Tipo in ('P','M')),
                   (Select
                    (Select First 1 AGP.Data_Final From TbAgrupamento AGP
                      Where AGP.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                        and AGP.data_inicial <= X.Data
                        and AGP.data_final >= X.Data
                        and AGP.status = '1'
                        and AGP.simulacao = '0'
                        and AGP.perfil = :perfil_1) Data
                    From (
                    Select Max(Cast(R.Data_Bsc as Date)) Data
                      From tbremessa_item_alocacao T, TbRemessa R
                     Where T.ESTABELECIMENTO_ID = R.Estabelecimento_codigo
                       and T.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                       and t.Remessa = R.Numero
                       and T.Tabela_Id = A.Pedido
                       and T.Tab_Item_Id = A.Controle
                       AND T.TAMANHO = A.TAMANHO
                       and T.Tipo in ('P','M')
                       and T.Saldo > 0
                    ) X)) Data_Agrupamento,

           Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                      Where T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Status = '1'),'0') Rem_Status,
    
           Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                      Where C.Pedido = A.Pedido
                        and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
           -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem, A.Qtd_Est, A.Qtd_Agp, A.Qtd_Rem,

           (Select First 1 P.Tipo_Pedido From TbPedido P Where a.pedido = p.pedido) Tipo_Pedido

      From TbPedido_Item A
     Where A.Pedido = :Pedido_1
       and A.Situacao = 1
       and A.Tamanho > 0
    -- For Update
     With Lock
    
    Into :Controle, :Data_Cliente, :Data_Producao, :Agp_Dt_Prd, :Agp_Dt_Cli,
         :Est_Min, :Data_Agrupamento, :Rem_Status,
         :Qtd_Prd, :Qtd_Est, :Qtd_Agp, :Qtd_Rem, :Tipo_Pedido
    Do
        
    if (:Tipo_Pedido = '1') then --Pedido Normal
        begin
        if (:Rem_Status = '0') then
             Begin
             Registros = '1';
             -- Tratamento via Est.Minimo --
             if (:Est_Min = '1') then
                  Begin
                     -- Em Estoque
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                         if (Current_Time <= Cast('15:00:59' as Time) and Current_Date = :Data_Emissao_1 and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                             Begin
                                 if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                             End else
                             Begin
                             if (Current_Date+1 >= :Maior_Data_Cliente and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                                 Begin
                                 if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                                 End else
                             if (:Data_Cliente >= :Maior_Data_Cliente) then
                                 Begin
                                  if (Maior_Data_Producao < :Data_Producao) then Maior_Data_Producao = :Data_Producao;
                                  if (Maior_Data_Cliente  < :Data_Cliente ) then Maior_Data_Cliente  = :Data_Cliente;
                                 End
                             End

                  End else
              -- Tratamento via Agrupamento --
             if (:Est_Min = '0') then
                  Begin
                     -- Em Estoque
                     if (:Qtd_Prd = 0 and :Qtd_Agp = 0 and :Qtd_Rem = 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Current_Time <= Cast('15:00:59' as Time) and Current_Date = :Data_Emissao_1) then
                              Begin
                               if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                              End else
                              Begin
                               if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                              End

                          End else
                     -- Em Agrupamento ou Producao
                     if ((:Qtd_Prd = 0) and (:Qtd_Agp > 0 or :Qtd_Rem > 0)) then
                          Begin

                          --
                          --if (Agp_Dt_Prd is not null) then
                          if (Data_Producao is not null) then
                              begin
                          --  Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Agp_Dt_Prd));
                              Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Data_Producao));
                              end

                          Update TbPedido_Item Set
                          Agp_Dt_Prd = :Data_Agrupamento,
                          Agp_Dt_Cli = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Maior_Data_Producao < :Data_Agrupamento) then
                              Maior_Data_Producao = :Data_Agrupamento;
                          if (Maior_Data_Cliente  < :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))) then
                              Maior_Data_Cliente  = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao));

                          if (Maior_Data_Producao <= :Data_Emissao_1) then
                              Begin
                              Maior_Data_Producao = :Data_Producao;
                              Maior_Data_Cliente  = :Data_Cliente;
                              End

                          End else
                     -- A Produzir > 0
                     if (:Qtd_Prd > 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          Tratamento_Ped = '0'; --Pedido precisa ser tratado
                          End
                  End
             End

        End
  End

  if (:Registros = '1' and :Rem_Stat = '0') then
      Begin

      if (:Tratamento_Ped = '0') Then
           Begin
           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBPEDIDO', :PEDIDO_1,
          (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),
           'Ha itens com pendencias que evitaram a conclusao no tratamento do pedido');
           End
    
      if (:Tratamento_Ped = '1') Then
           Begin

           If ((:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) or (:Programado_1 = '0' )) Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao,
               Data_Cliente = :Maior_Data_Cliente
               Where Pedido = :Pedido_1;
               End else

           If (:Programado_1 = '1') Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao
               Where Pedido = :Pedido_1
                 and Data_Entrega < :Maior_Data_Producao;
               End

           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
           'TBPEDIDO', :PEDIDO_1,
           (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),
           'Pedido tratado por completo');

           if (:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) Then
               Begin
               INSERT INTO TBHISTORICO (
               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
              'TBPEDIDO', :PEDIDO_1,
              (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),
               'O tratamento de itens forcou a alteracao da data do cliente no Pedido Programado');
               End
           End

      End

End;

CREATE OR ALTER trigger ttbagrupamento_b9u for tbagrupamento
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.ESTABELECIMENTO_ID <> NEW.ESTABELECIMENTO_ID) then
       BEGIN
       HISTORICO = HISTORICO||' Est:'||OLD.ESTABELECIMENTO_ID||'->'||NEW.ESTABELECIMENTO_ID;
       END
   if (OLD.LOCALIZACAO_ID <> NEW.LOCALIZACAO_ID) then
       BEGIN
       HISTORICO = HISTORICO||' Loc:'||OLD.LOCALIZACAO_ID||'->'||NEW.LOCALIZACAO_ID;
       END
   if (OLD.DESCRICAO <> NEW.DESCRICAO) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.'||OLD.DESCRICAO||'->'||NEW.DESCRICAO;
       END

   if (OLD.DATA_INICIAL <> NEW.DATA_INICIAL or OLD.DATA_FINAL <> NEW.DATA_FINAL) then
       BEGIN
       HISTORICO = HISTORICO||' Período:'||OLD.DATA_INICIAL||'a'||OLD.DATA_FINAL||'->'||NEW.DATA_INICIAL||'a'||NEW.DATA_FINAL;
       END
   if (OLD.Perfil <> NEW.Perfil) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.'||OLD.Perfil||'->'||NEW.Perfil;
       END
   if (OLD.MINUTOS_PRODUTIVOS <> NEW.MINUTOS_PRODUTIVOS) then
       BEGIN
       HISTORICO = HISTORICO||' Min.Prd.'||OLD.MINUTOS_PRODUTIVOS||'->'||NEW.MINUTOS_PRODUTIVOS;
       END
   if (OLD.SIMULACAO <> NEW.SIMULACAO) then
       BEGIN
       HISTORICO = HISTORICO||' Simulação '||OLD.SIMULACAO||'->'||NEW.SIMULACAO;
       END
/*
   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Status Inativado';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Status Ativado';
       END
*/
   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBAGRUPAMENTO', OLD.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),
       :Historico);
       End
end;

CREATE OR ALTER trigger ttbagrupamento_b0u_01 for tbagrupamento
active before update position 9
AS
DECLARE VARIABLE Agrup_Id Integer;
DECLARE VARIABLE Agrup_Desc VARCHAR(50);
DECLARE VARIABLE Pedidos Integer;
begin

   if (New.Simulacao <> Old.Simulacao or New.Data_Inicial <> Old.Data_Inicial or New.Data_Final <> Old.Data_Final) Then
       Begin
       if (New.Simulacao = '1') then
           Begin
            Pedidos = Coalesce((Select First 1 Id From TbAgrupamento_Pedido Where Agrupamento_Id = Old.Id and Tipo = 'P'),0);
            if (:Pedidos > 0) Then
                Begin
                Exception "..." 'TIPO DE AGRUPAMENTO NAO PODE SER ALTERADO, JA EXISTEM PEDIDOS VINCULADOS!'||
                                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                End
           End
       if (New.Simulacao = '0') then
           Begin
            Agrup_Id = Coalesce((Select First 1 Id From TbAgrupamento
                                  Where ((Data_Inicial <= New.Data_Inicial and Data_Final >= New.Data_Inicial) or
                                         (Data_Inicial <= New.Data_Final and Data_Final >= New.Data_Final))
                                    and Simulacao = '0' and Id <> Old.Id and Perfil = New.Perfil
                                    and localizacao_Id = New.Localizacao_Id
                                    ),0);
            if (:Agrup_Id > 0) Then
                Begin
                Agrup_Desc = (Select First 1 Id||'-'||Descricao From TbAgrupamento Where Id = :Agrup_Id);
                Exception "..." 'PERIODO INFORMADO SOBREPONDO PERIODO DE OUTRO AGRUPAMENTO: '||:AGRUP_DESC||
                                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                End
           End
       End

end;

CREATE OR ALTER trigger ttbagrupamento_b0i_01 for tbagrupamento
active before insert position 9
AS
DECLARE VARIABLE Agrup_Id Integer;
DECLARE VARIABLE Agrup_Desc VARCHAR(50);
begin

   if (New.Simulacao = '0') Then
      Begin
        Agrup_Id = Coalesce((Select First 1 Id From TbAgrupamento
                              Where ((Data_Inicial <= New.Data_Inicial and Data_Final >= New.Data_Inicial) or
                                     (Data_Inicial <= New.Data_Final and Data_Final >= New.Data_Final))
                                and Simulacao = '0' and Perfil = New.Perfil
                                and localizacao_Id = New.Localizacao_Id),0);
        if (:Agrup_Id > 0) Then
            Begin
            Agrup_Desc = (Select First 1 Id||'-'||Descricao From TbAgrupamento Where Id = :Agrup_Id);
            Exception "..." 'PERIODO INFORMADO SOBREPONDO PERIODO DE OUTRO AGRUPAMENTO: '||:AGRUP_DESC||
                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
            End
      End

end;

DROP INDEX ITBGP_PERFIL_SKU_01;
DROP INDEX ITBGP_PERFIL_SKU_02;

CREATE OR ALTER trigger ttbgp_perfil_sku_b9u for tbgp_perfil_sku
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;

ALTER TABLE TBGP_PERFIL_SKU ADD OLD_PERFIL VARCHAR(10);
update TBGP_PERFIL_SKU set OLD_PERFIL = PERFIL;
ALTER TABLE TBGP_PERFIL_SKU DROP PERFIL;
ALTER TABLE TBGP_PERFIL_SKU ADD PERFIL VARCHAR(10);
update TBGP_PERFIL_SKU set PERFIL = OLD_PERFIL;
ALTER TABLE TBGP_PERFIL_SKU DROP OLD_PERFIL;


CREATE INDEX ITBGP_PERFIL_SKU_01 ON TBGP_PERFIL_SKU (GP_ID,PERFIL);
CREATE INDEX ITBGP_PERFIL_SKU_02 ON TBGP_PERFIL_SKU (PERFIL);

SET STATISTICS INDEX ITBGP_PERFIL_SKU_01;
SET STATISTICS INDEX ITBGP_PERFIL_SKU_02;

CREATE OR ALTER trigger ttbgp_perfil_sku_b9u for tbgp_perfil_sku
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.MULTIPLICADOR <> NEW.MULTIPLICADOR) then
       BEGIN
       HISTORICO = HISTORICO||'Perfil '||OLD.PERFIL||' Mult.'||OLD.MULTIPLICADOR||'->'||NEW.MULTIPLICADOR;
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBESTEIRA', OLD.GP_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),
       :Historico);
       End
End;



CREATE TABLE TBTEMP_AJUSTE (
    UP_ID                       INTEGER NOT NULL,
    ID                          INTEGER NOT NULL,
    PERFIL_SKU                  VARCHAR(10) DEFAULT '' NOT NULL,
    DESCRICAO                   VARCHAR(20),
    STATUS                      CHAR(1) DEFAULT '1',
    TALAO                       CHAR(1) DEFAULT 'N',
    ORDEM                       INTEGER,
    LARG                        NUMERIC(15,4) DEFAULT 0,
    COMP                        NUMERIC(15,4) DEFAULT 0,
    ALT                         NUMERIC(15,4) DEFAULT 0,
    EM_PRODUCAO                 CHAR(1) DEFAULT '0',
    TALAO_ID                    INTEGER DEFAULT 0,
    INCREMENTO                  INTEGER DEFAULT 0,
    CONTROLE                    INTEGER,
    PROCESSAR_AUTOMATICAMENTE   CHAR(1) DEFAULT '1',
    HABILITA_SETUP_AQUECIMENTO  CHAR(1) DEFAULT '1',
    CCUSTO                      VARCHAR(8),
    DATAHORA_REFEICAO           TIMESTAMP,
    MINUTOS_REFEICAO            NUMERIC(15,4)
);

insert into TBTEMP_AJUSTE
select
    *
FROM TBSUB_UP;

CREATE OR ALTER procedure spc_ferramenta_disponivel (
    i_ferramenta_id integer,
    i_datahora_inicio timestamp)
returns (
    grupo_id integer,
    id integer,
    descricao varchar(200),
    serie varchar(80),
    matriz_id integer,
    matriz_descricao varchar(80),
    linha_id integer,
    tamanho integer,
    largura numeric(18,4),
    comprimento numeric(18,4),
    altura numeric(18,4),
    data date,
    observacao varchar(400),
    tempo_setup numeric(18,4),
    tempo_setup_aquecimento numeric(18,4),
    status_conflito integer)
as
declare variable gp_id integer;
declare variable up_id integer;
declare variable estacao integer;
declare variable first_datahora_inicio timestamp;
declare variable last_datahora_fim timestamp;
BEGIN

end;

CREATE OR ALTER procedure spc_ferramenta_historico (
    i_ferramenta_id integer)
returns (
    ferramenta_tipo varchar(10),
    ferramenta_tipo_descricao varchar(100),
    datahora timestamp,
    usuario varchar(400),
    operador_id integer,
    operador_descricao varchar(80),
    gp_id integer,
    gp_descricao varchar(80),
    up_id integer,
    up_descricao varchar(80),
    estacao integer,
    estacao_descricao varchar(80),
    justificativa_id integer,
    justificativa_descricao varchar(200),
    remessa varchar(40),
    remessa_talao_id varchar(4),
    talao_id integer,
    status varchar(10),
    status_descricao varchar(40))
as
BEGIN

end;

CREATE OR ALTER procedure spc_ferramenta_painel 
returns (
    produto_id integer,
    quantidade numeric(18,4),
    tamanho varchar(50),
    modelo_id integer,
    cor integer,
    remessa varchar(15),
    talao integer,
    modelos varchar(300),
    requisicao varchar(10),
    programacao_id integer,
    talao_id integer,
    gp_id integer,
    gp_descricao varchar(100),
    up_id integer,
    up_descricao varchar(100),
    estacao integer,
    estacao_descricao varchar(100),
    estacao_status varchar(10),
    estacao_status_descricao varchar(500),
    ferramenta_id varchar(50),
    ferramenta_descricao varchar(100),
    ferramenta_serie varchar(20),
    ferramenta_barras varchar(100),
    ferramenta_situacao_talao varchar(10),
    ferramenta_situacao varchar(10),
    ferramenta_status varchar(10),
    ferramenta_enderecamento varchar(50),
    ferramenta_item_detalhe_cod varchar(50),
    navalha_id integer,
    navalha_barras varchar(100),
    datahora_inicio timestamp,
    code varchar(600),
    tempo integer)
as
declare variable descanso_datahora timestamp;
declare variable descanso_datahora_expiracao timestamp;
BEGIN

end;

CREATE OR ALTER procedure spc_ferramenta_programada 
returns (
    produto_id integer,
    quantidade numeric(18,4),
    tamanho varchar(50),
    remessa varchar(20),
    talao integer,
    modelos varchar(300),
    programacao_id integer,
    ferramenta_id integer,
    ferramenta_descricao varchar(200),
    ferramenta_enderecamento varchar(20),
    ferramenta_serie varchar(16),
    ferramenta_gp_id integer,
    ferramenta_gp_descricao varchar(80),
    ferramenta_up_id integer,
    ferramenta_up_descricao varchar(80),
    ferramenta_estacao integer,
    ferramenta_estacao_descricao varchar(80),
    ferramenta_situacao varchar(4),
    ferramenta_situacao_descricao varchar(44),
    datahora_inicio timestamp,
    datahora_fim timestamp,
    gp_id integer,
    gp_descricao varchar(80),
    up_id integer,
    up_descricao varchar(80),
    estacao integer,
    estacao_descricao varchar(80),
    ferramenta_reserva varchar(4),
    ferramenta_reserva_descricao varchar(44))
as
BEGIN

end;

CREATE OR ALTER procedure spc_paradas_estacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(100),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    tempo_parado integer,
    motivo_parada varchar(100),
    iniciado varchar(20),
    parado varchar(20),
    estacao integer,
    marcar integer,
    tipo integer,
    data_hora timestamp,
    operador varchar(100),
    estacao_descricao varchar(100),
    data_inicio timestamp,
    data_fim timestamp)
as
declare variable data1 timestamp;
declare variable data2 timestamp;
declare variable ultimo_registro timestamp;
declare variable data3 timestamp;
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_programacao_tempo_analise (
    estabelecimento_id integer,
    gp_id integer,
    up_id integer,
    estacao integer)
returns (
    programacao_id integer,
    produto_id integer,
    tamanho integer,
    modelo_id integer,
    cor_id integer,
    ferramenta_id integer,
    tempo numeric(15,4),
    tmp_operacional numeric(15,2),
    stp_ferramenta numeric(15,4),
    stp_ferramenta_aquecimento numeric(15,4),
    stp_cor numeric(15,4),
    stp_cor_aprovacao numeric(15,4))
as
declare variable old_ferramenta_id integer;
declare variable old_cor_id integer;
declare variable old_familia_id integer;
declare variable estacao_setup char(1);
declare variable cor_similar integer;
declare variable talao_id integer;
declare variable produto_id1 integer;
declare variable cor_id1 integer;
declare variable familia_id integer;
declare variable datahora_inicio timestamp;
declare variable datahora_fim timestamp;
declare variable quantidade numeric(15,4);
declare variable data date;
declare variable status char(1);
declare variable datahora_finalizado timestamp;
declare variable cor_setup numeric(15,4);
declare variable cor_setup_aprovacao numeric(15,4);
declare variable ferramenta_setup numeric(15,4);
declare variable ferramenta_setup_aquecimento numeric(15,4);
declare variable status_requisicao integer;
BEGIN

end;

CREATE OR ALTER trigger ttbcalendario_up_b3i for tbcalendario_up
active before insert position 3
AS
declare variable ESTACAO INTEGER;
BEGIN

end;

CREATE OR ALTER trigger ttbcalendario_up_b3u for tbcalendario_up
active before update position 3
AS
declare variable ESTACAO INTEGER;
BEGIN

end;


CREATE OR ALTER trigger ttbferramentaria_b2u for tbferramentaria
active before update position 2
AS
DECLARE VARIABLE GP_ID BIGINT;
DECLARE VARIABLE UP_ID BIGINT;
DECLARE VARIABLE ESTACAO BIGINT;
DECLARE VARIABLE OPERADOR_ID BIGINT;
DECLARE VARIABLE FERRAMENTAS_ALOCADAS VARCHAR(3000);
begin

end;

CREATE OR ALTER trigger ttbregistro_parada_b2i for tbregistro_parada
active before insert position 2
AS
declare variable vEMAIL VarChar(500);
declare variable vCORPO_EMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80;
declare variable VJUSTIFICATIVA VarChar(200);
declare variable vOPERADOR_NOME VarChar(20);
declare variable VTEMPOORIGINAL Integer;

declare variable LINHA_ID INTEGER;
declare variable LINHA_DESCRICAO VARCHAR(50);
declare variable MODELO_ID INTEGER;                                                
declare variable MODELO_DESCRICAO VARCHAR(50);
declare variable COR_ID INTEGER;
declare variable COR_DESCRICAO VARCHAR(20);
declare variable TAMANHO INTEGER;
declare variable TAM_DESCRICAO VARCHAR(10);
declare variable FERRAMENTA_ID INTEGER;
declare variable FERRAMENTA_DESCRICAO VARCHAR(100);
declare variable GP_ID INTEGER;
declare variable GP_DESCRICAO VARCHAR(20);
declare variable UP_ID INTEGER;
declare variable UP_DESCRICAO VARCHAR(20);
declare variable ESTACAO INTEGER;
declare variable ESTACAO_DESCRICAO VARCHAR(20);
declare variable REMESSA_ID INTEGER;
declare variable TALAO_ID INTEGER;
declare variable TALAO INTEGER;
declare variable QUANTIDADE NUMERIC(18,4);
declare variable UM VARCHAR(3);

BEGIN


end;

DROP INDEX ITBSUBUP_01;
DROP INDEX ITBSUBUP_02;
DROP INDEX ITBSUBUP_03;
DROP INDEX ITBSUBUP_04;

DROP TRIGGER TTBSUB_UP_B0I;
DROP TRIGGER TBSUB_UP_B1U;
DROP TRIGGER TTBSUB_UP_B1U;
DROP TRIGGER TTBSUB_UP_B9U;
DROP TRIGGER TBSUB_UP_BD0;

DROP TABLE TBSUB_UP;

CREATE TABLE TBSUB_UP (
    UP_ID                       INTEGER NOT NULL,
    ID                          INTEGER NOT NULL,
    PERFIL_SKU                  VARCHAR(10) DEFAULT '' NOT NULL,
    DESCRICAO                   VARCHAR(20),
    STATUS                      CHAR(1) DEFAULT '1',
    TALAO                       CHAR(1) DEFAULT 'N',
    ORDEM                       INTEGER,
    LARG                        NUMERIC(15,4) DEFAULT 0,
    COMP                        NUMERIC(15,4) DEFAULT 0,
    ALT                         NUMERIC(15,4) DEFAULT 0,
    EM_PRODUCAO                 CHAR(1) DEFAULT '0',
    TALAO_ID                    INTEGER DEFAULT 0,
    INCREMENTO                  INTEGER DEFAULT 0,
    CONTROLE                    INTEGER,
    PROCESSAR_AUTOMATICAMENTE   CHAR(1) DEFAULT '1',
    HABILITA_SETUP_AQUECIMENTO  CHAR(1) DEFAULT '1',
    CCUSTO                      VARCHAR(8),
    DATAHORA_REFEICAO           TIMESTAMP,
    MINUTOS_REFEICAO            NUMERIC(15,4)
);

ALTER TABLE TBSUB_UP ADD CONSTRAINT PK_TBSUB_UP PRIMARY KEY (UP_ID, ID, PERFIL_SKU);

CREATE INDEX ITBSUBUP_01 ON TBSUB_UP (ID);
CREATE INDEX ITBSUBUP_02 ON TBSUB_UP (PERFIL_SKU);
CREATE INDEX ITBSUBUP_03 ON TBSUB_UP (UP_ID);
CREATE INDEX ITBSUBUP_04 ON TBSUB_UP (UP_ID, ID);

insert into TBSUB_UP
select
    *
FROM TBTEMP_AJUSTE;

DROP TABLE TBTEMP_AJUSTE;

CREATE OR ALTER trigger ttbregistro_parada_b2i for tbregistro_parada
active before insert position 2
AS
declare variable vEMAIL VarChar(500);
declare variable vCORPO_EMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80;
declare variable VJUSTIFICATIVA VarChar(200);
declare variable vOPERADOR_NOME VarChar(20);
declare variable VTEMPOORIGINAL Integer;

declare variable LINHA_ID INTEGER;
declare variable LINHA_DESCRICAO VARCHAR(50);
declare variable MODELO_ID INTEGER;                                                
declare variable MODELO_DESCRICAO VARCHAR(50);
declare variable COR_ID INTEGER;
declare variable COR_DESCRICAO VARCHAR(20);
declare variable TAMANHO INTEGER;
declare variable TAM_DESCRICAO VARCHAR(10);
declare variable FERRAMENTA_ID INTEGER;
declare variable FERRAMENTA_DESCRICAO VARCHAR(100);
declare variable GP_ID INTEGER;
declare variable GP_DESCRICAO VARCHAR(20);
declare variable UP_ID INTEGER;
declare variable UP_DESCRICAO VARCHAR(20);
declare variable ESTACAO INTEGER;
declare variable ESTACAO_DESCRICAO VARCHAR(20);
declare variable REMESSA_ID INTEGER;
declare variable TALAO_ID INTEGER;
declare variable TALAO INTEGER;
declare variable QUANTIDADE NUMERIC(18,4);
declare variable UM VARCHAR(3);

BEGIN

  if (New.Status > 0 and New.tabela = 'INEFICIENCIA') then -- ID da Justificativa
      Begin

      For
      Select P.Linha_Codigo Linha_Id,
            (Select First 1 L.Descricao From TbModelo_Linha L Where L.Codigo = P.Linha_Codigo) Linha_Descricao,
             P.Modelo_Codigo Modelo_Id,
            (Select First 1 M.Descricao From TbModelo M Where M.Codigo = P.Modelo_Codigo) Modelo_Descricao,
             P.Cor_Codigo Cor_ID,
            (Select First 1 C.Descricao From TbCor C Where C.Codigo = P.Cor_Codigo) Cor_Descricao,
             PR.Tamanho,
            (Select First 1 Tam_Descricao From SP_TAMANHO_GRADE (P.Grade_Codigo,PR.Tamanho)) Tam_Descricao,
             PR.Ferramenta_ID,
            (Select First 1 F.Serie||'-'||F.Descricao From TbFerramentaria F Where F.ID = PR.Ferramenta_ID) Ferramenta_Descricao,
             PR.GP_Id,
            (Select First 1 G.Descricao From TBGP G Where G.ID = PR.Gp_ID) GP_Descricao,
             PR.UP_Id,
            (Select First 1 U.Descricao From TbUP U Where U.ID = PR.UP_ID) UP_Descricao,
             PR.Estacao,
            (Select First 1 S.Descricao From TbSub_UP S Where S.Up_ID = PR.Up_ID and S.ID = PR.Estacao) Estacao_Descricao,
             PR.Remessa_ID,
             PR.Tabela_ID Talao_ID,
            (Select First 1 R.Controle From TbRemessa_Item_Processado R Where R.Id = PR.Tabela_ID) Talao,
             PR.Quantidade, P.UnidadeMedida_Sigla UM
        From TbProgramacao PR, TbProduto P
       Where PR.Produto_ID = P.Codigo
         and PR.ID = :NEW.Tabela_ID
        Into :LINHA_ID,:LINHA_DESCRICAO,:MODELO_ID,:MODELO_DESCRICAO,:COR_ID,
             :COR_DESCRICAO,:TAMANHO,:TAM_DESCRICAO,:FERRAMENTA_ID,
             :FERRAMENTA_DESCRICAO,:GP_ID,:GP_DESCRICAO,:UP_ID,:UP_DESCRICAO,
             :ESTACAO,:ESTACAO_DESCRICAO,:REMESSA_ID,:TALAO_ID,:TALAO,:QUANTIDADE,:UM

          Do Begin

             vEMAIL         = Coalesce((Select First 1 CC.VALOR_EXT from TbControle_N CC Where CC.ID = 239),'');
             vOPERADOR_NOME = Coalesce((Select First 1 O.Nome From TbOperador O Where O.Codigo = New.Operador_ID),'');
             VJUSTIFICATIVA = Coalesce((Select First 1 J.Descricao From TbJustificativa J Where J.ID = New.Status),'');
             VTEMPOORIGINAL = COALESCE((Select First 1 MF.TM from tbup_fluxo pf, TBMODELO_FLUXO_PRODUCAO mf
                                         where mf.fluxo_id  = pf.fluxo_id and pf.up_id = :UP_ID
                                           and mf.modelo_id = :MODELO_ID and mf.cor_id = :COR_ID
                                           and mf.tamanho   = :TAMANHO),0);

             if (vEMAIL <> '') then
                 Begin
                 vCORPO_EMAIL = ' LINHA: '||:LINHA_ID||' - '||:LINHA_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' MODELO: '||:MODELO_ID||' - '||:MODELO_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' COR: '||:COR_ID||' - '||:COR_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' TAMANHO: '||:TAM_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' FERRAMENTA: '||:FERRAMENTA_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' GP/UP/ESTACAO: '||:GP_DESCRICAO||'/'||:UP_DESCRICAO||'/'||:ESTACAO_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' REMESSA/TALAO: '||:REMESSA_ID||' - '||:TALAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' QUANTIDADE: '||Trunc(:QUANTIDADE)||' '||:UM||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' OPERADOR: '||NEW.OPERADOR_ID||' - '||vOPERADOR_NOME||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' DATA/HORA REGISTRO: '||FORMATDATETIME(Current_TimeStamp)||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' TEMPO MAQUINA ATUAL: '||Trunc(:VTEMPOORIGINAL)||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' JUSTIFICATIVA: '||:vJustificativa||': '||NEW.OBSERVACAO
                                --||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ;

                 Insert Into tbemail (email, usuario_id, assunto, corpo, status, datahora)
                 Values (:vEmail, 0, 'GC - REGISTRO DE JUSTIFICATIVA: '||:vJustificativa, :vCORPO_EMAIL, 0, Current_TimeStamp);
                 End
    
             End
      End
End;

CREATE OR ALTER trigger ttbferramentaria_b2u for tbferramentaria
active before update position 2
AS
DECLARE VARIABLE GP_ID BIGINT;
DECLARE VARIABLE UP_ID BIGINT;
DECLARE VARIABLE ESTACAO BIGINT;
DECLARE VARIABLE OPERADOR_ID BIGINT;
DECLARE VARIABLE FERRAMENTAS_ALOCADAS VARCHAR(3000);
begin
    
    IF (
        COALESCE(NEW.GP_ID      ,0) <> COALESCE(OLD.GP_ID      ,0)
     OR COALESCE(NEW.UP_ID      ,0) <> COALESCE(OLD.UP_ID      ,0)
     OR COALESCE(NEW.ESTACAO    ,0) <> COALESCE(OLD.ESTACAO    ,0)
     OR COALESCE(NEW.OPERADOR_ID,0) <> COALESCE(OLD.OPERADOR_ID,0)
     OR COALESCE(NEW.TALAO_ID,0)    <> COALESCE(OLD.TALAO_ID,0)) THEN
    BEGIN

        /* VERIFICA OPERADOR */
        OPERADOR_ID = COALESCE((SELECT FIRST 1 O.CODIGO FROM TBOPERADOR O WHERE O.CODIGO = NEW.OPERADOR_ID AND O.STATUS = '1'),0);

        IF ( NOT (OPERADOR_ID > 0) ) THEN
        BEGIN
            EXCEPTION "..." 'OPERACAO NAO PERMITIDA. OPERADOR DE PROCESSOS INVALIDO';
        END

        IF ( NEW.SITUACAO = 'E' ) THEN
        BEGIN
            NEW.TALAO_ID = 0;

        END

        IF ( NOT(NEW.SITUACAO = 'E') AND NOT(NEW.TALAO_ID > 0) ) THEN
        BEGIN
            EXCEPTION "..." 'ACAO NAO PERMITIDA PARA A FERRAMENTA. TALAO INVALIDO';
        END

        /* REGISTRA ACOES NA FERRAMENTARIA */
        IF  (COALESCE(NEW.GP_ID  ,0) = 0
        AND  COALESCE(NEW.UP_ID  ,0) = 0
        AND  COALESCE(NEW.ESTACAO,0) = 0
        AND (NEW.SITUACAO = 'E' OR NEW.SITUACAO = 'R')
        )THEN
        BEGIN
            NEW.GP_ID = 0;
            NEW.UP_ID = 0;
            NEW.ESTACAO = 0;
    
            /* REGISTRA HISTORICO DE ENTRADA DA FERRAMENTA */
            INSERT INTO TBFERRAMENTARIA_HISTORICO (
                FERRAMENTA_TIPO,
                FERRAMENTA_ID,
                STATUS,
                OPERADOR_ID,
                GP_ID,
                UP_ID,
                ESTACAO,
                TALAO_ID
            ) VALUES (
                'M',
                NEW.ID,
                NEW.SITUACAO,
                NEW.OPERADOR_ID,
                NEW.GP_ID,
                NEW.UP_ID,
                NEW.ESTACAO,
                NEW.TALAO_ID
            );
        END
        ELSE
        /* REGISTRA OUTRAS ACOES */
        IF (
             (COALESCE(NEW.GP_ID      ,0) <> COALESCE(OLD.GP_ID      ,0)
         OR   COALESCE(NEW.UP_ID      ,0) <> COALESCE(OLD.UP_ID      ,0)
         OR   COALESCE(NEW.ESTACAO    ,0) <> COALESCE(OLD.ESTACAO    ,0))
         AND (NEW.GP_ID   > 0
         OR   NEW.UP_ID   > 0
         OR   NEW.ESTACAO > 0)
         AND  NOT (NEW.SITUACAO = '')
        )THEN
        BEGIN
            /* VERIFICA O GRUPO DE PRODUCAO */
            GP_ID = COALESCE((SELECT FIRST 1 G.ID FROM TBGP G WHERE G.ID = NEW.GP_ID AND G.STATUS = '1'),0);

            IF ( NOT (GP_ID > 0) ) THEN
            BEGIN
                EXCEPTION "..." 'ACAO DA FERRAMENTA NAO PERMITIDA. GRUPO DE PRODUCAO INVALIDO';
            END
    
            /* VERIFICA A UNIDADE PRODUTIVA */
            UP_ID = COALESCE((SELECT FIRST 1 U.ID FROM TBUP U WHERE U.ID = NEW.UP_ID AND U.STATUS = '1'),0);
    
            IF ( NOT (UP_ID > 0) ) THEN
            BEGIN
                EXCEPTION "..." 'ACAO DA FERRAMENTA NAO PERMITIDA. UNIDADE PRODUTIVA INVALIDA';
            END

            /* VERIFICA A ESTACAO DE TRABALHO */
            ESTACAO = COALESCE((SELECT FIRST 1 SU.ID FROM TBSUB_UP SU WHERE SU.UP_ID = :UP_ID AND SU.ID = NEW.ESTACAO AND SU.STATUS = '1'),0);
    
            IF ( NOT (ESTACAO > 0) ) THEN
            BEGIN
                EXCEPTION "..." 'ACAO DA FERRAMENTA NAO PERMITIDA. ESTACAO DE TRABALHO INVALIDA';
            END

            FERRAMENTAS_ALOCADAS = COALESCE(
            (SELECT LIST(LPAD(F.SERIE,4,'0') || ' - ' || F.DESCRICAO,', ')
               FROM TBFERRAMENTARIA F
              WHERE F.GP_ID   = :GP_ID
                AND F.UP_ID   = :UP_ID
                AND F.ESTACAO = :ESTACAO
             ),'');

             IF ( FERRAMENTAS_ALOCADAS <> '' ) THEN
             BEGIN
             --   EXCEPTION "..." 'ACAO DA FERRAMENTA NAO PERMITIDA. A ESTACAO ESTA BLOQUEADA COM A SEGUINTE FERRAMENTA: ' || FERRAMENTAS_ALOCADAS;
             END

            /* REGISTRA HISTORICO DE SAIDA DA FERRAMENTA */
            INSERT INTO TBFERRAMENTARIA_HISTORICO (
                FERRAMENTA_TIPO,
                FERRAMENTA_ID,
                STATUS,
                OPERADOR_ID,
                GP_ID,
                UP_ID,
                ESTACAO,
                TALAO_ID
            ) VALUES (
                'M',
                NEW.ID,
                NEW.SITUACAO,
                NEW.OPERADOR_ID,
                NEW.GP_ID,
                NEW.UP_ID,
                NEW.ESTACAO,
                NEW.TALAO_ID
            );
        END
        ELSE
        BEGIN
            EXCEPTION "..." 'OPERACAO DE INVALIDA PARA ESTA FERRAMENTA.';
        END

    END
end;

CREATE OR ALTER trigger ttbcalendario_up_b3u for tbcalendario_up
active before update position 3
AS
declare variable ESTACAO INTEGER;
BEGIN

    IF ( NEW.DATA >= CURRENT_DATE ) THEN
    BEGIN
    
        FOR
            SELECT U.ID
              FROM TBSUB_UP U
             WHERE U.UP_ID = NEW.UP_ID
               AND U.STATUS = '1'
        INTO
            ESTACAO
        DO
        BEGIN
    
            UPDATE OR INSERT INTO TBCALENDARIO_UP_ESTACAO (
                UP_ID,
                ESTACAO,
                DATA,
                MINUTOS,
                HORARIO,
                HORARIO_DESCANSO
            ) VALUES (
                NEW.UP_ID,
                :ESTACAO,
                NEW.DATA,
                NEW.MINUTOS,
                NEW.HORARIO,
                NEW.HORARIO_DESCANSO
            ) MATCHING(UP_ID,ESTACAO,DATA);
        END
    END
END;

CREATE OR ALTER trigger ttbcalendario_up_b3i for tbcalendario_up
active before insert position 3
AS
declare variable ESTACAO INTEGER;
BEGIN
    FOR
        SELECT U.ID
          FROM TBSUB_UP U
         WHERE U.UP_ID = NEW.UP_ID
           AND U.STATUS = '1'
    INTO
        ESTACAO
    DO
    BEGIN
        UPDATE OR INSERT INTO TBCALENDARIO_UP_ESTACAO (
            UP_ID,
            ESTACAO,
            DATA,
            MINUTOS,
            HORARIO,
            HORARIO_DESCANSO
        ) VALUES (
            NEW.UP_ID,
            :ESTACAO,
            NEW.DATA,
            NEW.MINUTOS,
            NEW.HORARIO,
            NEW.HORARIO_DESCANSO
        ) MATCHING (
            UP_ID,
            ESTACAO,
            DATA
        );
    END
END;

CREATE OR ALTER trigger tbsub_up_bd0 for tbsub_up
active before delete position 0
AS
begin
    -- EXCLUI A ESTACAO NA TBUP_ESTACAO
    DELETE FROM TBUP_ESTACAO E
     WHERE E.UP_ID = OLD.UP_ID
       AND E.ID = OLD.ID;
end;

CREATE OR ALTER trigger tbsub_up_b1u for tbsub_up
active before insert position 1
AS
BEGIN
    -- INSERE A ESTACAO NA TBUP_ESTACAO
    UPDATE OR INSERT
    INTO TBUP_ESTACAO (
        UP_ID,
        ID
    ) VALUES (
        NEW.UP_ID,
        NEW.ID
    );
END;

CREATE OR ALTER procedure spc_programacao_tempo_analise (
    estabelecimento_id integer,
    gp_id integer,
    up_id integer,
    estacao integer)
returns (
    programacao_id integer,
    produto_id integer,
    tamanho integer,
    modelo_id integer,
    cor_id integer,
    ferramenta_id integer,
    tempo numeric(15,4),
    tmp_operacional numeric(15,2),
    stp_ferramenta numeric(15,4),
    stp_ferramenta_aquecimento numeric(15,4),
    stp_cor numeric(15,4),
    stp_cor_aprovacao numeric(15,4))
as
declare variable old_ferramenta_id integer;
declare variable old_cor_id integer;
declare variable old_familia_id integer;
declare variable estacao_setup char(1);
declare variable cor_similar integer;
declare variable talao_id integer;
declare variable produto_id1 integer;
declare variable cor_id1 integer;
declare variable familia_id integer;
declare variable datahora_inicio timestamp;
declare variable datahora_fim timestamp;
declare variable quantidade numeric(15,4);
declare variable data date;
declare variable status char(1);
declare variable datahora_finalizado timestamp;
declare variable cor_setup numeric(15,4);
declare variable cor_setup_aprovacao numeric(15,4);
declare variable ferramenta_setup numeric(15,4);
declare variable ferramenta_setup_aquecimento numeric(15,4);
declare variable status_requisicao integer;
BEGIN

    SELECT SU.HABILITA_SETUP_AQUECIMENTO
      FROM TBSUB_UP SU
     WHERE SU.UP_ID = :UP_ID
       AND SU.ID    = :ESTACAO
      INTO ESTACAO_SETUP;

    OLD_FERRAMENTA_ID = 0;
    OLD_COR_ID        = 0;
    OLD_FAMILIA_ID    = 0;

    /* CONSULTA TALOES DA PROGRAMACAO (O ULTIMO FINALIZADO E TODOS EM ABERTO) */
    /* A CONSULTA DO ULTIMO TALAO PRODUDIZDO SERA POR CONTA DA NECESSIDADE DE VERIFICAR O REGISTRO ANTERIOR COM O PROXIMO */
    FOR
        SELECT
            X.ID,
            X.TALAO_ID,
            X.PRODUTO_ID,
            PD.COR_CODIGO COR_ID,
            PD.FAMILIA_CODIGO FAMILIA_ID,
            X.FERRAMENTA_ID,
            X.DATAHORA_INICIO,
            X.DATAHORA_FIM,
            X.QUANTIDADE,
            X.DATA,
            X.STATUS,
            X.STATUS_REQUISICAO,
            X.DATAHORA_FINALIZADO,
            C.TEMPO_SETUP COR_SETUP,
            C.TEMPO_SETUP_APROVACAO COR_SETUP_APROVACAO,
            F.TEMPO_SETUP FERRAMENTA_SETUP,
            F.TEMPO_SETUP_AQUECIMENTO FERRAMENTA_SETUP_AQUECIMENTO
        FROM (
            SELECT
                ID,
                TALAO_ID,
                PRODUTO_ID,
                FERRAMENTA_ID,
                DATAHORA_INICIO,
                DATAHORA_FIM,
                QUANTIDADE,
                TEMPO,
                DATA,
                STATUS,
                DATAHORA_FINALIZADO,
                0 STATUS_REQUISICAO
              FROM (
                SELECT FIRST 1
                       P.ID,
                       P.TABELA_ID TALAO_ID,
                       P.PRODUTO_ID,
                       P.FERRAMENTA_ID,
                       P.DATAHORA_INICIO,
                       P.DATAHORA_FIM, 
                       P.QUANTIDADE,
                       P.TEMPO,
                       P.DATA,
                       P.STATUS,
                       R.DATAHORA DATAHORA_FINALIZADO
                  FROM TBPROGRAMACAO P,
                       TBPROGRAMACAO_REGISTRO R
                 WHERE R.PROGRAMACAO_ID     = P.ID

                   AND R.STATUS             <> 1
                   AND P.status             IN (2,3)
                   AND IIF(P.STATUS = 3, R.DATAHORA >= DATEADD(-90 MINUTE TO CURRENT_TIMESTAMP), TRUE)

                   AND P.TIPO               = 'A'
                   AND P.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                   AND P.GP_ID              = :GP_ID
                   AND P.UP_ID              = :UP_ID
                   AND P.ESTACAO            = :ESTACAO
                 ORDER BY DATAHORA_FINALIZADO DESC
                ) A

            UNION
    
            SELECT P.ID,  
                   P.TABELA_ID TALAO_ID,
                   P.PRODUTO_ID,
                   P.FERRAMENTA_ID,
                   P.DATAHORA_INICIO,
                   P.DATAHORA_FIM, 
                   IIF( STATUS_REQUISICAO = 1,
                    COALESCE(
                       (SELECT SUM(J.QUANTIDADE - V.SOBRAS) QUANTIDADE_REQUISICAO
                          FROM TBREQUISICAO J,
                               TBREMESSA_ITEM_PROCESSADO V
                         WHERE V.REMESSA    = J.REMESSA_GERADA
                           AND V.CONTROLE   = J.TALAO
                           AND J.GP_ID      = P.GP_ID
                           AND J.REMESSA    = P.REMESSA_ID
                           AND J.PRODUTO_ID = P.PRODUTO_ID
                           AND J.TAMANHO    = P.TAMANHO),0),
                    P.QUANTIDADE) QUANTIDADE,
                   P.TEMPO,
                   P.DATA,
                   P.STATUS,
                   CAST('01.01.9999 00:00:00' AS TIMESTAMP),
                   P.STATUS_REQUISICAO
              FROM TBPROGRAMACAO P
             WHERE P.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
               AND P.TIPO               = 'A'
               AND P.GP_ID              = :GP_ID
               AND P.UP_ID              = :UP_ID
               AND P.ESTACAO            = :ESTACAO
               AND P.STATUS            IN ('0','1')
               AND NOT (P.STATUS = 1 AND P.STATUS_REQUISICAO = 1)
        ) X,
        TBPRODUTO PD,
        TBCOR C,
        TBFERRAMENTARIA F

       WHERE PD.CODIGO = X.PRODUTO_ID
         AND C.CODIGO  = PD.COR_CODIGO
         AND F.ID      = X.FERRAMENTA_ID
       ORDER BY DATAHORA_FINALIZADO, DATAHORA_INICIO
    INTO
        :PROGRAMACAO_ID,
        :TALAO_ID,
        :PRODUTO_ID,
        :COR_ID,
        :FAMILIA_ID,
        :FERRAMENTA_ID,
        :DATAHORA_INICIO,
        :DATAHORA_FIM,
        :QUANTIDADE,
        :DATA,
        :STATUS,
        :STATUS_REQUISICAO,
        :DATAHORA_FINALIZADO,
        :COR_SETUP,
        :COR_SETUP_APROVACAO,
        :FERRAMENTA_SETUP,
        :FERRAMENTA_SETUP_AQUECIMENTO
    DO
    BEGIN
        /* VERIFICA SE O TALOES ESTA EM ABERTO/PARADO */
        IF ( STATUS IN ('0','1') ) THEN
        BEGIN

            /* ZERA TODOS OS TEMPO, POIS POR PADRAO NA HAVERA SETUPS */
            TEMPO                      = 0;
            TMP_OPERACIONAL            = 0;
            STP_FERRAMENTA             = 0;
            STP_FERRAMENTA_AQUECIMENTO = 0;
            STP_COR                    = 0;
            STP_COR_APROVACAO          = 0;
              
            /* VERIFICA SE HAVERA SETUP DE FERRAMENTA */
            IF ( FERRAMENTA_ID <> OLD_FERRAMENTA_ID ) THEN
            BEGIN
                --EXCEPTION "..." FERRAMENTA_ID || ' ' || OLD_FERRAMENTA_ID;
                /* APLICA O TEMPO DE SETUP DE FERRAMENTA */
                STP_FERRAMENTA = FERRAMENTA_SETUP;

                /* VERIFICA SE A ESTACAO HABILITA SETUP DE AQUECIMENTO */
                IF ( ESTACAO_SETUP = '1' ) THEN
                BEGIN
                    /* APLICA O TEMPO DE AQUECIMENTO DA FERRAMENTA */
                    STP_FERRAMENTA_AQUECIMENTO = FERRAMENTA_SETUP_AQUECIMENTO;
                END
            END

            /* VERIFICA SE NAO HAVERA SETUP DE FERRAMENTA E EXISTE ALGUM ITEM ANTERIOR */
            /* OBS.: O SETUP DE LIMPEZA DE MATRIZ, SO OCORRE QUANDO NAO HA TROCA DE FERRAMENTA */
            IF ( STP_FERRAMENTA = 0 AND OLD_COR_ID > 0 AND OLD_COR_ID <> COR_ID ) THEN
            BEGIN

                /* APLICA O TEMPO DE LIMPEZA DE FERRAMENTA */
                STP_COR = COR_SETUP;

                /* CONSULTA AS CORES SIMILARES */
                FOR
                    SELECT FIRST 1 S.ID
                      FROM TBCOR_SIMILAR S
                     WHERE S.FAMILIA_ID = :OLD_FAMILIA_ID
                       AND S.COR_ID_1   = :OLD_COR_ID
                       AND S.COR_ID_2   = :COR_ID
                INTO
                    :COR_SIMILAR
                DO
                BEGIN
                    /* LIMPA O TEMPO DE SETUP DE COR (LIMPEZA) SE A COR ANTERIOR FOR SIMILIAR A ATUAL */
                    STP_COR = 0;
                END
            END

            /* VERIFICA SE HAVERA TROCA DE COR */
            IF ( COR_ID <> OLD_COR_ID OR FERRAMENTA_ID <> OLD_FERRAMENTA_ID  ) THEN
            BEGIN
                /* APLICA O TEMPO DE APROVACAO */
                STP_COR_APROVACAO = COR_SETUP_APROVACAO;
            END


            TMP_OPERACIONAL = COALESCE((
                   SELECT
--                        QTD_TALAO,
--                        REQ,
--                        APROV,
--                        EXTRA,
--                        TEMPO,
                        (IIF(REQ = 0,QTD_TALAO+EXTRA-APROV,QTD_TALAO) * TEMPO)
                    FROM (
                        SELECT
                           COALESCE(T1.QUANTIDADE,0) QTD_TALAO, -- TOTAL DO TALAO
                           COALESCE(T1.REQUISICAO_ID,0) REQ,
                           COALESCE((
                            SELECT SUM(S.QUANTIDADE - S.SALDO)
                              FROM TBREQUISICAO_SOBRA S
                             WHERE S.REMESSA = RT.REMESSA_ID
                               AND S.TALAO = RT.REMESSA_TALAO_ID
                               AND S.REQUISICAO_ID = 0), 0.0000) APROV, -- SUBTRACAO DAS SOBRAS APROVEITADAS
    
                            COALESCE((SELECT FIRST 1 QUANTIDADE FROM VWREMESSA_TALAO TE WHERE TE.ID = RT.TALAO_EXTRA),0) EXTRA, -- INCLUSAO DO TALAO EXTRA
                            COALESCE((SELECT FIRST 1 TEMPO FROM SPC_PROGRAMACAO_TEMPO_BOJO(P1.MODELO_CODIGO, T1.TAMANHO, P1.COR_CODIGO, 1)),0) tempo -- TEMPO POR UNIDADEDIGO, 1)),0)
                       FROM TBPRODUTO P1,
                            TBPROGRAMACAO T1,
                            VWREMESSA_TALAO RT
                      WHERE P1.CODIGO    = :PRODUTO_ID
                        AND T1.tabela_id = :TALAO_ID
                        AND T1.tipo      = 'A'
                        AND RT.ID       = T1.TABELA_ID
                        ) X),0);




            --TMP_OPERACIONAL = (0.421 * QUANTIDADE);

            TEMPO = STP_FERRAMENTA + STP_FERRAMENTA_AQUECIMENTO + STP_COR + STP_COR_APROVACAO + TMP_OPERACIONAL;

            TEMPO = IIF(TRUNC(:TEMPO) = :TEMPO, TRUNC(:TEMPO), TRUNC(:TEMPO) + 1);

            IF ( TMP_OPERACIONAL = 0 ) THEN
            BEGIN
                TEMPO                       = 0;
                STP_FERRAMENTA              = 0;
                STP_FERRAMENTA_AQUECIMENTO  = 0;
                STP_COR                     = 0;
                STP_COR_APROVACAO           = 0;
                FERRAMENTA_ID               = 1; -- IDENTIFICACAO DE FERRAMENTA INEXISTENTE
            END
            
            SUSPEND;
        END

        --SUSPEND;

        /* -- INICIO ------ BLOCO QUE ALIMENTA OS VALORES ANTERIORES ---------- */
        OLD_FERRAMENTA_ID = FERRAMENTA_ID;
        OLD_COR_ID        = COR_ID;
        OLD_FAMILIA_ID    = FAMILIA_ID;
        /* --  FIM   ------ BLOCO QUE ALIMENTA OS VALORES ANTERIORES ---------- */
    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 spc_paradas_estacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(100),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    tempo_parado integer,
    motivo_parada varchar(100),
    iniciado varchar(20),
    parado varchar(20),
    estacao integer,
    marcar integer,
    tipo integer,
    data_hora timestamp,
    operador varchar(100),
    estacao_descricao varchar(100),
    data_inicio timestamp,
    data_fim timestamp)
as
declare variable data1 timestamp;
declare variable data2 timestamp;
declare variable ultimo_registro timestamp;
declare variable data3 timestamp;
begin

    for
        select
            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) as DATA1,
            cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 dateadd(second,-1,tt.hora_inicio) from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp) as DATA2,
            cast((select first 1 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) as DATA3
        from rdb$database
    into
        :data1,
        :data2,
        :data3
    do begin end

    if(:I_FLAG = 1)then
    begin
        :data1 = :data3;
        :data2 = dateadd(day,1,dateadd(minute,-1,:data3));
    end

  for
    select * from split(:I_ESTACAO,',')
  into
    :ESTACAO
  do
  begin
     :ultimo_registro = (select first 1 r.datahora_realizado_fim from tbprogramacao_requisicao r, tbprogramacao c
                    
                            where r.datahora_fim <= :data1
                            and r.datahora_inicio >= dateadd(day,-3,:data1)
                            and c.id = r.programacao_id
                            and c.estacao = :ESTACAO
                            and c.gp_id   = :i_gp_id
                            and c.up_id   = :i_up_id
                            
                            order by r.datahora_fim desc);

     if(:ultimo_registro is null)then begin :ultimo_registro = :data1; end

     DATA_HORA = :ultimo_registro;

     for
    
            select
            
                jj.*
            
            from(
                select
                    TEMPO_PARADO,
                    MOTIVO_PARADA,
                    iif(DATAHORA2 is null, null, formatdatetime(DATAHORA2)) as INICIADO,
                    formatdatetime(DATAHORA1) as PARADO,
                    ESTACAO,
                    MARCAR,
                    tipo,
                    OPERADOR,
                    ESTACAO_DESCRICAO
                
                from(
                    select
                
                        iif((y.STATUS1 > 0) and (y.STATUS2 = 0), (select sum(cast(PRODUTIVO as integer))
                        from spc_calendario_estacao(y.up,y.estacao,y.datahora1,y.datahora2)),0) as TEMPO_PARADO,
                    
                        y.*
                    
                    from(
                        select
                        
                            j.descricao as MOTIVO_PARADA,
                            lead(p.status) over (order by p.tabela_id,p.ID ascending) STATUS2,
                            lead(p.hora_registro) over (order by p.tabela_id,p.ID ascending) datahora2,
                            p.status as status1,
                            p.hora_registro as datahora1,
                            p.subvinculo_id as up,
                            p.tabela_id  as estacao,
                            p.vinculo_id as gp_id,
                            p.*,
                            j.marcar,
                            j.tipo,
                            o.codigo||' - '||o.nome as OPERADOR,
                            e.descricao as ESTACAO_DESCRICAO
                        
                        from
                            tbregistro_parada p,
                            tbjustificativa j,
                            tboperador o,
                            tbsub_up e

                        where p.tabela = 'ESTACAO'
                            and p.vinculo_id = :I_GP_ID
                            and p.subvinculo_id = :I_UP_ID
                            and p.tabela_id = :ESTACAO

                            and e.up_id = p.subvinculo_id
                            and e.id = p.tabela_id

                            and o.codigo = p.operador_id
                
                            AND p.hora_registro BETWEEN :DATA_HORA and :DATA2
                        
                            and j.id = p.status
                        
                            order by p.tabela_id,p.ID
                
                    ) y
                ) xx where xx.STATUS1 > 0 and xx.TEMPO_PARADO > 0
            ) jj
      into
        :TEMPO_PARADO,
        :MOTIVO_PARADA,
        :INICIADO,
        :PARADO,
        :ESTACAO,
        :MARCAR,
        :TIPO,
        :OPERADOR,
        :ESTACAO_DESCRICAO
      do
      begin

         :DATA_INICIO = :DATA1;
         :DATA_FIM    = :DATA2;
    
         suspend;
    
      end

  end


end;

CREATE OR ALTER procedure spc_ferramenta_programada 
returns (
    produto_id integer,
    quantidade numeric(18,4),
    tamanho varchar(50),
    remessa varchar(20),
    talao integer,
    modelos varchar(300),
    programacao_id integer,
    ferramenta_id integer,
    ferramenta_descricao varchar(200),
    ferramenta_enderecamento varchar(20),
    ferramenta_serie varchar(16),
    ferramenta_gp_id integer,
    ferramenta_gp_descricao varchar(80),
    ferramenta_up_id integer,
    ferramenta_up_descricao varchar(80),
    ferramenta_estacao integer,
    ferramenta_estacao_descricao varchar(80),
    ferramenta_situacao varchar(4),
    ferramenta_situacao_descricao varchar(44),
    datahora_inicio timestamp,
    datahora_fim timestamp,
    gp_id integer,
    gp_descricao varchar(80),
    up_id integer,
    up_descricao varchar(80),
    estacao integer,
    estacao_descricao varchar(80),
    ferramenta_reserva varchar(4),
    ferramenta_reserva_descricao varchar(44))
as
BEGIN

    FOR
        SELECT      produto_id,
            quantidade,
            fn_tamanho_produto(produto_id,tamanho) as TAMANHO,
            remessa,
            TALAO,

            coalesce((select
                    ''
                    --||''||j.codigo
                    --||''||j.descricao
                    ||''||n.codigo
                    ||' - '||n.descricao
                    --||''||c.codigo
                    ||' ('||c.descricao||')'
                from tbproduto j, tbmodelo n, tbcor c
                where j.codigo = produto_id
                and n.codigo = j.modelo_codigo
                and c.codigo = j.cor_codigo
            ),'') as MODELOS,

            PROGRAMACAO_ID,
            FERRAMENTA_ID,
            FERRAMENTA_DESCRICAO,
            FERRAMENTA_ENDERECAMENTO,
            FERRAMENTA_SERIE,
            FERRAMENTA_GP_ID,
            FERRAMENTA_GP_DESCRICAO,
            FERRAMENTA_UP_ID,
            FERRAMENTA_UP_DESCRICAO,
            FERRAMENTA_ESTACAO,
            FERRAMENTA_ESTACAO_DESCRICAO,
            FERRAMENTA_SITUACAO,
            FERRAMENTA_SITUACAO_DESCRICAO,
            DATAHORA_INICIO,
            DATAHORA_FIM,
            GP_ID,
            GP_DESCRICAO,
            UP_ID,
            UP_DESCRICAO,
            ESTACAO,
            ESTACAO_DESCRICAO,

            TRIM(CASE
            WHEN PROGRAMACAO_STATUS = 2 THEN '1'
            WHEN FERRAMENTA_ESTACAO > 0 AND (PROGRAMACAO_DATAHORA_INICIO > DATEADD(90 MINUTE TO CURRENT_TIMESTAMP) OR PROGRAMACAO_DATAHORA_INICIO IS NULL) THEN '2'
            ELSE '0' END) FERRAMENTA_RESERVA,


            TRIM(CASE
            WHEN PROGRAMACAO_STATUS = 2 THEN 'EM PRODUÇÃO'
            WHEN FERRAMENTA_ESTACAO > 0 AND (PROGRAMACAO_DATAHORA_INICIO > DATEADD(90 MINUTE TO CURRENT_TIMESTAMP) OR PROGRAMACAO_DATAHORA_INICIO IS NULL) THEN 'EM DESUSO'
            ELSE '' END) FERRAMENTA_RESERVA_DESCRICAO
        FROM (
            SELECT
                produto_id,
                quantidade,
                tamanho,
                remessa,
                TALAO,
                PROGRAMACAO_ID,
                FERRAMENTA_ID,
                FERRAMENTA_DESCRICAO,
                FERRAMENTA_ENDERECAMENTO,
                FERRAMENTA_SERIE,
                FERRAMENTA_GP_ID,
                FERRAMENTA_GP_DESCRICAO,
                FERRAMENTA_UP_ID,
                FERRAMENTA_UP_DESCRICAO,
                FERRAMENTA_ESTACAO,
                FERRAMENTA_ESTACAO_DESCRICAO,
                FERRAMENTA_SITUACAO,
                FERRAMENTA_SITUACAO_DESCRICAO,
                DATAHORA_INICIO,
                DATAHORA_FIM,
                GP_ID,
                GP_DESCRICAO,
                UP_ID,
                UP_DESCRICAO,
                ESTACAO,
                ESTACAO_DESCRICAO,
                SUBSTRING(DADOS_EH FROM 1 FOR 1) PROGRAMACAO_STATUS,
                CAST(NULLIF(SUBSTRING(DADOS_EH FROM 2),'X') AS TIMESTAMP) PROGRAMACAO_DATAHORA_INICIO

            FROM (
                SELECT
                    produto_id,
                    quantidade,
                    tamanho,
                    remessa,
                    TALAO,
                    PROGRAMACAO_ID,
                    FERRAMENTA_ID,
                    FERRAMENTA_DESCRICAO,
                    FERRAMENTA_ENDERECAMENTO,
                    FERRAMENTA_SERIE,
                    FERRAMENTA_GP_ID,
                    (SELECT FIRST 1 DESCRICAO FROM TBGP G WHERE G.ID = FERRAMENTA_GP_ID) FERRAMENTA_GP_DESCRICAO,
                    FERRAMENTA_UP_ID,
                    (SELECT FIRST 1 DESCRICAO FROM TBUP U WHERE U.ID = FERRAMENTA_UP_ID) FERRAMENTA_UP_DESCRICAO,
                    FERRAMENTA_ESTACAO,
                    (SELECT FIRST 1 DESCRICAO FROM TBSUB_UP SU WHERE SU.UP_ID = FERRAMENTA_UP_ID AND SU.ID = FERRAMENTA_ESTACAO) FERRAMENTA_ESTACAO_DESCRICAO,
                    TRIM(
                        IIF(
                            IIF(COALESCE(SITUACAO,'') = '','E',SITUACAO) = 'E' OR IIF(COALESCE(SITUACAO,'') = '','E',SITUACAO) = 'R',
                            IIF(COALESCE(SITUACAO,'') = '','E',SITUACAO),'.')
                    ) FERRAMENTA_SITUACAO,
                    TRIM(CASE IIF(COALESCE(SITUACAO,'') = '','E',SITUACAO)
                    WHEN 'E' THEN 'DISPONÃVEL'
                    WHEN 'R' THEN 'SEPARADA'
                    WHEN 'C' THEN 'EM CONSERTO'
                    ELSE 'ALOCADA' END) FERRAMENTA_SITUACAO_DESCRICAO,
                    DATAHORA_INICIO,
                    DATAHORA_FIM,
                    GP_ID,
                    GP_DESCRICAO,
                    UP_ID,
                    UP_DESCRICAO,
                    ESTACAO,
                    ESTACAO_DESCRICAO,
                    IIF(FERRAMENTA_GP_ID > 0,
                    COALESCE((SELECT STATUS||COALESCE(DATAHORA_INICIO,'X') FROM SPC_FERRAMENTA_ESTACAO_HORARIO(FERRAMENTA_GP_ID,FERRAMENTA_UP_ID,FERRAMENTA_ESTACAO,FERRAMENTA_ID)),'0X'),
                    '0X') DADOS_EH
        
                FROM (
                    SELECT
                        produto_id,
                        quantidade,
                        tamanho,
                        remessa,
                        TALAO,
                        PROGRAMACAO_ID,
                        FERRAMENTA_ID,
                        FERRAMENTA_DESCRICAO,
                        SITUACAO,
                        FERRAMENTA_SERIE,
                        FERRAMENTA_ENDERECAMENTO,
                        FERRAMENTA_GP_ID,
                        FERRAMENTA_UP_ID,
                        FERRAMENTA_ESTACAO,
                        DATAHORA_INICIO,
                        DATAHORA_FIM,
                        GP_ID,
                        GP_DESCRICAO,
                        UP_ID,
                        UP_DESCRICAO,
                        ESTACAO,
                        ESTACAO_DESCRICAO,
                        ROW_NUMBER() OVER (PARTITION BY FERRAMENTA_ID, GP_ID, UP_ID, ESTACAO, DATAHORA_FIM ORDER BY GP_ID, UP_ID, ESTACAO, DATAHORA_INICIO) ROW_NUMBER
            
                    FROM (
                        SELECT
                            p.produto_id,
                            p.quantidade,
                            p.tamanho,
                            coalesce((select first 1 r.remessa from tbremessa r where r.numero = p.remessa_id and r.estabelecimento_codigo = p.estabelecimento_id),'') as REMESSA,
                            coalesce((select first 1 s.remessa_talao_id from vwremessa_talao s where s.id = p.tabela_id),0) as TALAO,
                            P.ID PROGRAMACAO_ID,
                            P.FERRAMENTA_ID,
                            F.DESCRICAO FERRAMENTA_DESCRICAO,
                            F.SITUACAO,
                            LPAD(F.SERIE,4,'0')FERRAMENTA_SERIE,
                            F.ENDERECAMENTO FERRAMENTA_ENDERECAMENTO,
                            COALESCE(F.GP_ID,0) FERRAMENTA_GP_ID,
                            COALESCE(F.UP_ID,0) FERRAMENTA_UP_ID,
                            COALESCE(F.ESTACAO,0) FERRAMENTA_ESTACAO,
                            P.DATAHORA_INICIO,
                            (SELECT FIRST 1 DATAHORA_FIM FROM SPC_FERRAMENTA_SEQUENCIA_SETUP(F.ID, P.DATAHORA_INICIO) ORDER BY DATAHORA_FIM DESC) DATAHORA_FIM,
                            P.GP_ID, 
                            G.DESCRICAO GP_DESCRICAO,
                            P.UP_ID,
                            U.DESCRICAO UP_DESCRICAO,
                            P.ESTACAO,
                            SU.DESCRICAO ESTACAO_DESCRICAO
                        FROM
                            TBPROGRAMACAO P,
                            TBFERRAMENTARIA F,
                            TBGP G,
                            TBUP U,
                            TBSUB_UP SU
                        
                        WHERE (P.STATUS = '0' OR P.STATUS = '1' OR P.STATUS = '2')
                        AND P.FERRAMENTA_ID > 0
                        AND F.ID = P.FERRAMENTA_ID
                        AND G.ID = P.GP_ID
                        AND U.ID = P.UP_ID
                        AND SU.UP_ID = U.ID
                        AND SU.ID = P.ESTACAO
                        AND NOT (P.STATUS = '1' AND P.STATUS_REQUISICAO = 1)
                    ) X
                ) Z
                WHERE ROW_NUMBER = 1
            ) W
        ) T
    INTO
        PRODUTO_ID,
        QUANTIDADE,
        TAMANHO,
        REMESSA,
        TALAO,
        MODELOS,
        PROGRAMACAO_ID,
        FERRAMENTA_ID,
        FERRAMENTA_DESCRICAO,
        FERRAMENTA_ENDERECAMENTO,
        FERRAMENTA_SERIE,
        FERRAMENTA_GP_ID,
        FERRAMENTA_GP_DESCRICAO,
        FERRAMENTA_UP_ID,
        FERRAMENTA_UP_DESCRICAO,
        FERRAMENTA_ESTACAO,
        FERRAMENTA_ESTACAO_DESCRICAO,
        FERRAMENTA_SITUACAO,
        FERRAMENTA_SITUACAO_DESCRICAO,
        DATAHORA_INICIO,
        DATAHORA_FIM,
        GP_ID,
        GP_DESCRICAO,
        UP_ID,
        UP_DESCRICAO,
        ESTACAO,
        ESTACAO_DESCRICAO,
        FERRAMENTA_RESERVA,
        FERRAMENTA_RESERVA_DESCRICAO


    DO
    SUSPEND;

END;

CREATE OR ALTER procedure spc_ferramenta_painel 
returns (
    produto_id integer,
    quantidade numeric(18,4),
    tamanho varchar(50),
    modelo_id integer,
    cor integer,
    remessa varchar(15),
    talao integer,
    modelos varchar(300),
    requisicao varchar(10),
    programacao_id integer,
    talao_id integer,
    gp_id integer,
    gp_descricao varchar(100),
    up_id integer,
    up_descricao varchar(100),
    estacao integer,
    estacao_descricao varchar(100),
    estacao_status varchar(10),
    estacao_status_descricao varchar(500),
    ferramenta_id varchar(50),
    ferramenta_descricao varchar(100),
    ferramenta_serie varchar(20),
    ferramenta_barras varchar(100),
    ferramenta_situacao_talao varchar(10),
    ferramenta_situacao varchar(10),
    ferramenta_status varchar(10),
    ferramenta_enderecamento varchar(50),
    ferramenta_item_detalhe_cod varchar(50),
    navalha_id integer,
    navalha_barras varchar(100),
    datahora_inicio timestamp,
    code varchar(600),
    tempo integer)
as
declare variable descanso_datahora timestamp;
declare variable descanso_datahora_expiracao timestamp;
BEGIN

    FERRAMENTA_ID = 0;

    FOR
        SELECT
            produto_id,
            quantidade,
            fn_tamanho_produto(produto_id,tamanho) as TAMANHO,
            modelo_id,
            coalesce((select first 1
                    c.codigo
                from tbproduto j, tbcor c
                where j.codigo = produto_id
                and c.codigo = j.cor_codigo
            ),'') as COR,
            remessa,
            TALAO,

            coalesce((select
                    ''
                    --||''||j.codigo
                    --||''||j.descricao
                    ||''||n.codigo
                    ||' - '||n.descricao
                    --||''||c.codigo
                    ||' ('||c.descricao||')'
                from tbproduto j, tbmodelo n, tbcor c
                where j.codigo = produto_id
                and n.codigo = j.modelo_codigo
                and c.codigo = j.cor_codigo
            ),'') as MODELOS,

            CODE,   
            REQUISICAO,
            PROGRAMACAO_ID,
            TALAO_ID,
            DATAHORA_INICIO,
            GP_ID,
            GP_DESCRICAO,
            UP_ID,
            UP_DESCRICAO,
            ESTACAO,
            ESTACAO_DESCRICAO,
            ESTACAO_STATUS,
            (SELECT FIRST 1 J.DESCRICAO FROM TBJUSTIFICATIVA J WHERE J.ID = ESTACAO_STATUS)ESTACAO_STATUS_DESCRICAO,
            FERRAMENTA_ID,
            FERRAMENTA_DESCRICAO,
            FERRAMENTA_SERIE,
            FERRAMENTA_BARRAS,
            FERRAMENTA_SITUACAO,
            FERRAMENTA_SITUACAO_TALAO,
            FERRAMENTA_STATUS,
            FERRAMENTA_ENDERECAMENTO,
            FERRAMENTA_ITEM_DETALHE_COD,
            NAVALHA_ID,
            FERRAMENTA_ITEM_DETALHE_COD NAVALHA_BARRAS,
            TEMPO
        
        FROM (
            SELECT FIRST 100
                p.produto_id,
                p.quantidade,
                p.tamanho,
                t.modelo_id,
                coalesce((select first 1 r.remessa from tbremessa r where r.numero = p.remessa_id and r.estabelecimento_codigo = p.estabelecimento_id),'') as REMESSA,
                coalesce((select first 1 s.remessa_talao_id from vwremessa_talao s where s.id = p.tabela_id),0) as TALAO,

                (P.GP_ID || '-' || P.UP_ID || '-' || P.ESTACAO || '-' || P.FERRAMENTA_ID || '-' || DATAHORA_INICIO || '-' || R.REQUISICAO || '-' || COALESCE(ENDERECAMENTO,'') || '-' || COALESCE(P.FERRAMENTA_ITEM_DETALHE_ID,0) ) CODE,
                IIF(P.STATUS_REQUISICAO = 1 AND P.STATUS <> 1,'1','0') REQUISICAO,
                P.ID PROGRAMACAO_ID,
                T.ID TALAO_ID,
                P.DATAHORA_INICIO,
                P.GP_ID,
                G.DESCRICAO GP_DESCRICAO,
                P.UP_ID, 
                U.DESCRICAO UP_DESCRICAO,
                P.ESTACAO,
                SU.DESCRICAO ESTACAO_DESCRICAO,
                COALESCE((SELECT FIRST 1 S.STATUS
                            FROM TBREGISTRO_PARADA S
                           WHERE S.TABELA_ID     = P.ESTACAO
                             AND S.TABELA        = 'ESTACAO'
                             AND S.VINCULO_ID    = P.GP_ID
                             AND S.SUBVINCULO_ID = P.UP_ID
                           ORDER BY S.ID DESC),0) ESTACAO_STATUS,
            
                LPAD(P.FERRAMENTA_ID,4,'0') FERRAMENTA_ID,
                F.DESCRICAO FERRAMENTA_DESCRICAO,
                LPAD(F.SERIE,4,'0') FERRAMENTA_SERIE,
                F.CODBARRAS FERRAMENTA_BARRAS,
                COALESCE(F.SITUACAO,'E') FERRAMENTA_SITUACAO,
                IIF(F.ID = P.FERRAMENTA_ID AND F.TALAO_ID = T.ID,F.SITUACAO,'E') FERRAMENTA_SITUACAO_TALAO,
                F.STATUS FERRAMENTA_STATUS,
                F.ENDERECAMENTO FERRAMENTA_ENDERECAMENTO,
                P.FERRAMENTA_ITEM_DETALHE_ID NAVALHA_ID,
                (SELECT FIRST 1 D.CODBARRAS
                   FROM TBFERRAMENTARIA_ITEM_DETALHE D
                  WHERE D.ID = P.FERRAMENTA_ITEM_DETALHE_ID) FERRAMENTA_ITEM_DETALHE_COD,
                0 TEMPO
            
            FROM
                TBPROGRAMACAO P,
                TBFERRAMENTARIA F,
                TBGP G,
                TBUP U,
                TBSUB_UP SU,
                VWREMESSA_TALAO T,
                VWREMESSA R
            
            WHERE
                P.FERRAMENTA_ID          > 1
            AND P.TEMPO_SETUP_FERRAMENTA > 0
            AND P.STATUS                 < 2  
            AND P.TIPO                   = 'A'
            AND F.ID                     = P.FERRAMENTA_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 T.ID                     = P.TABELA_ID
            AND R.REMESSA_ID             = T.REMESSA_ID
            --AND R.DATA_DISPONIBILIDADE  <= CAST(DATEADD(1 HOUR TO CURRENT_TIMESTAMP) AS DATE)
            AND (IIF(F.ID = P.FERRAMENTA_ID AND F.TALAO_ID = T.ID,F.SITUACAO,'E') IN ('E','R') OR F.TALAO_ID <> T.ID)
            --NAO MOSTRAR TALOES PARADOS AGUARDANDO REQUISICAO
            AND NOT (P.STATUS = 1 AND P.STATUS_REQUISICAO = 1)
            --AND P.DATAHORA_INICIO <= DATEADD(3 HOUR TO CURRENT_TIMESTAMP)
            AND G.ID NOT IN (241,9,5,244)
            
            ORDER BY
                DATAHORA_INICIO,
                GP_DESCRICAO,
                UP_DESCRICAO,
                ESTACAO_DESCRICAO
        ) X

    INTO
        PRODUTO_ID,
        QUANTIDADE,
        TAMANHO,
        MODELO_ID,
        COR,
        REMESSA,
        TALAO,
        MODELOS,
        CODE,
        REQUISICAO,
        PROGRAMACAO_ID,
        TALAO_ID,
        DATAHORA_INICIO,
        GP_ID,
        GP_DESCRICAO,
        UP_ID,
        UP_DESCRICAO,
        ESTACAO,
        ESTACAO_DESCRICAO,
        ESTACAO_STATUS,
        ESTACAO_STATUS_DESCRICAO,
        FERRAMENTA_ID,
        FERRAMENTA_DESCRICAO,
        FERRAMENTA_SERIE,
        FERRAMENTA_BARRAS,
        FERRAMENTA_SITUACAO,
        FERRAMENTA_SITUACAO_TALAO,
        FERRAMENTA_STATUS,
        FERRAMENTA_ENDERECAMENTO,
        FERRAMENTA_ITEM_DETALHE_COD,
        NAVALHA_ID,
        NAVALHA_BARRAS,
        TEMPO

    DO
    SUSPEND;
END;

CREATE OR ALTER procedure spc_ferramenta_historico (
    i_ferramenta_id integer)
returns (
    ferramenta_tipo varchar(10),
    ferramenta_tipo_descricao varchar(100),
    datahora timestamp,
    usuario varchar(400),
    operador_id integer,
    operador_descricao varchar(80),
    gp_id integer,
    gp_descricao varchar(80),
    up_id integer,
    up_descricao varchar(80),
    estacao integer,
    estacao_descricao varchar(80),
    justificativa_id integer,
    justificativa_descricao varchar(200),
    remessa varchar(40),
    remessa_talao_id varchar(4),
    talao_id integer,
    status varchar(10),
    status_descricao varchar(40))
as
BEGIN
    FOR
        SELECT
            H.FERRAMENTA_TIPO,
            CASE H.FERRAMENTA_TIPO
            WHEN 'M' THEN 'MATRIZ'
            WHEN 'N' THEN 'NAVALHA'
            ELSE 'INDEFINIDO' END FERRAMENTA_TIPO_DESCRICAO,
            H.DATAHORA,
            COALESCE((SELECT FIRST 1 UPPER(NOME) FROM TBUSUARIO U WHERE U.USUARIO = H.USUARIO),H.USUARIO) USUARIO,
            OPERADOR_ID,
            (SELECT FIRST 1 O.NOME FROM TBOPERADOR O WHERE O.CODIGO = H.OPERADOR_ID) OPERADOR_DESCRICAO,
            H.GP_ID,
            (SELECT FIRST 1 DESCRICAO FROM TBGP G WHERE G.ID = H.GP_ID) GP_DESCRICAO,
            H.UP_ID,
            (SELECT FIRST 1 DESCRICAO FROM TBUP U WHERE U.ID = H.GP_ID) UP_DESCRICAO,
            H.ESTACAO,
            (SELECT FIRST 1 DESCRICAO FROM TBSUB_UP SU WHERE SU.UP_ID = H.UP_ID AND SU.ID = H.ESTACAO) ESTACAO_DESCRICAO,
            H.MOTIVO_PARADA JUSTIFICATIVA_ID,
            (SELECT FIRST 1 J.DESCRICAO FROM TBJUSTIFICATIVA J WHERE J.ID = H.MOTIVO_PARADA) JUSTIFICATIVA_DESCRICAO,
            (SELECT FIRST 1 REMESSA FROM VWREMESSA R1 WHERE R1.REMESSA_ID = T.REMESSA_ID) REMESSA,
            LPAD(T.REMESSA_TALAO_ID,4,'0') REMESSA_TALAO_ID,
            H.TALAO_ID,
            H.STATUS,
            CASE H.STATUS
                WHEN 'E' THEN 'ENTRADA'
                WHEN 'R' THEN 'SEPARAÇÃO'
                WHEN 'S' THEN 'SAÍDA'
                WHEN 'I' THEN 'TALÃO INICIADO'
                WHEN 'P' THEN 'TALÃO PARADO'
                WHEN 'F' THEN 'TALÃO FINALIZADO'
                ELSE 'INDEFINIDO' END STATUS_DESCRICAO
        
        FROM
            TBFERRAMENTARIA_HISTORICO H
            LEFT JOIN VWREMESSA_TALAO T ON (T.ID = H.TALAO_ID)
        
        WHERE
            H.FERRAMENTA_ID = :I_FERRAMENTA_ID
        
        ORDER BY DATAHORA DESC
    INTO
        FERRAMENTA_TIPO,
        FERRAMENTA_TIPO_DESCRICAO,
        DATAHORA,
        USUARIO,
        OPERADOR_ID,
        OPERADOR_DESCRICAO,
        GP_ID,
        GP_DESCRICAO,
        UP_ID,
        UP_DESCRICAO,
        ESTACAO,
        ESTACAO_DESCRICAO,
        JUSTIFICATIVA_ID,
        JUSTIFICATIVA_DESCRICAO,
        REMESSA,
        REMESSA_TALAO_ID,
        TALAO_ID,
        STATUS,
        STATUS_DESCRICAO
    DO SUSPEND;


END;

CREATE OR ALTER procedure spc_ferramenta_disponivel (
    i_ferramenta_id integer,
    i_datahora_inicio timestamp)
returns (
    grupo_id integer,
    id integer,
    descricao varchar(200),
    serie varchar(80),
    matriz_id integer,
    matriz_descricao varchar(80),
    linha_id integer,
    tamanho integer,
    largura numeric(18,4),
    comprimento numeric(18,4),
    altura numeric(18,4),
    data date,
    observacao varchar(400),
    tempo_setup numeric(18,4),
    tempo_setup_aquecimento numeric(18,4),
    status_conflito integer)
as
declare variable gp_id integer;
declare variable up_id integer;
declare variable estacao integer;
declare variable first_datahora_inicio timestamp;
declare variable last_datahora_fim timestamp;
BEGIN

    SELECT
        GP_ID,
        UP_ID,
        ESTACAO,
        FIRST_DATAHORA_INICIO,
        LAST_DATAHORA_FIM
    FROM (
    
    SELECT FIRST 1
           P.GP_ID, 
           P.UP_ID, 
           P.ESTACAO,
           X.ID FIRST_ID,
           FIRST_VALUE(X.ID) OVER(ORDER BY X.DATAHORA_INICIO DESC) LAST_ID,
           X.DATAHORA_INICIO FIRST_DATAHORA_INICIO,
           FIRST_VALUE(X.DATAHORA_FIM) OVER(ORDER BY X.DATAHORA_INICIO DESC) LAST_DATAHORA_FIM
      FROM SPC_FERRAMENTA_SEQUENCIA_SETUP(:I_FERRAMENTA_ID,:I_DATAHORA_INICIO) X,
           TBPROGRAMACAO P
     WHERE P.ID = X.ID
     ORDER BY X.DATAHORA_INICIO)
     INTO
        :GP_ID,
        :UP_ID,
        :ESTACAO,
        :FIRST_DATAHORA_INICIO,
        :LAST_DATAHORA_FIM;
        

    FOR
        SELECT
            GRUPO_ID,
            ID,
            DESCRICAO,
            SERIE,
            MATRIZ_ID,
            MATRIZ_DESCRICAO,
            LINHA_ID,
            TAMANHO,
            LARGURA,
            COMPRIMENTO,
            ALTURA,
            DATA,
            OBSERVACAO,
            TEMPO_SETUP,
            TEMPO_SETUP_AQUECIMENTO,
            STATUS_CONFLITO
        
        FROM (
            SELECT
                F.GRUPO_ID,
                F.ID,
                F.DESCRICAO,
                F.SERIE,
                F.MATRIZ_ID,
                (SELECT FIRST 1 M.DESCRICAO
                   FROM TBMATRIZ M
                  WHERE M.CODIGO = F.MATRIZ_ID) MATRIZ_DESCRICAO,  
                LPAD(I.LINHA_ID,4,'0') LINHA_ID,
                I.TAMANHO,
                F.LARG LARGURA,
                F.COMP COMPRIMENTO,
                F.ALT ALTURA,
                F.DATA,
                F.OBSERVACAO,
                F.TEMPO_SETUP,
                F.TEMPO_SETUP_AQUECIMENTO,
                COALESCE((SELECT FIRST 1 DATAHORA_INICIO
                   FROM TBPROGRAMACAO P
                  WHERE P.FERRAMENTA_ID = F.ID
                    AND P.DATAHORA_INICIO > '01.01.2010'
                    AND P.STATUS IN ('0','1') ORDER BY DATAHORA_INICIO),CAST('01.01.2000 00:00' AS TIMESTAMP)) DATAHORA_INICIO,
            
                COALESCE((SELECT FIRST 1 1
                     FROM TBPROGRAMACAO W
                    WHERE W.FERRAMENTA_ID = F.ID
                      AND W.STATUS IN (0,2)
                      AND ( FO.DATAHORA_INICIO BETWEEN W.DATAHORA_INICIO AND W.DATAHORA_FIM
                       OR   FO.DATAHORA_FIM    BETWEEN W.DATAHORA_INICIO AND W.DATAHORA_FIM
                       OR  W.DATAHORA_INICIO   BETWEEN FO.DATAHORA_INICIO AND FO.DATAHORA_FIM
                       OR  W.DATAHORA_FIM      BETWEEN FO.DATAHORA_INICIO AND FO.DATAHORA_FIM)
            
                ),0) AS STATUS_CONFLITO
            
            FROM
                TBFERRAMENTARIA F,
                TBFERRAMENTARIA_ITEM I,
                (SELECT
                    X.LINHA_ID,
                    I.TAMANHO,
                    X.MATRIZ_ID,
                    X.UP_ID,
                    X.ESTACAO,
                    X.FERRAMENTA_ID,
                    X.LARGURA,
                    X.COMPRIMENTO,
                    X.ALTURA,
                    X.DATAHORA_INICIO,
                    X.DATAHORA_FIM
                FROM (
                    SELECT
                        SU.UP_ID,
                        SU.ID ESTACAO,
                        F.MATRIZ_ID,
                        DH.DATAHORA_INICIO,
                        DH.DATAHORA_FIM,
                        F.ID FERRAMENTA_ID,
                        SU.LARG LARGURA,
                        SU.COMP COMPRIMENTO,
                        SU.ALT ALTURA,
                        (SELECT FIRST 1 M.LINHA_CODIGO LINHA_ID
                           FROM TBPROGRAMACAO P, VWREMESSA_TALAO T, TBMODELO M
                          WHERE M.CODIGO           = T.MODELO_ID
                            AND P.TIPO             = 'A'
                            AND P.TABELA_ID        = T.ID
                            AND P.DATAHORA_INICIO >= DH.DATAHORA_INICIO
                            AND P.DATAHORA_FIM    <= DH.DATAHORA_FIM
                            AND P.UP_ID            = :UP_ID
                            AND P.ESTACAO          = :ESTACAO
                            and p.ferramenta_id    = f.id
                            )LINHA_ID
                    FROM TBFERRAMENTARIA F, TBSUB_UP SU,
                        (SELECT FIRST 1
                         CAST(:FIRST_DATAHORA_INICIO AS TIMESTAMP)DATAHORA_INICIO,
                         CAST(:LAST_DATAHORA_FIM AS TIMESTAMP)DATAHORA_FIM FROM RDB$DATABASE) DH
                    WHERE F.ID     = :I_FERRAMENTA_ID
                      AND SU.UP_ID = :UP_ID
                      AND SU.ID    = :ESTACAO) X,
                      TBFERRAMENTARIA_ITEM I
                WHERE
                    I.FERRAMENTARIA_ID = X.FERRAMENTA_ID
                AND I.LINHA_ID = X.LINHA_ID) FO
            
            WHERE
                F.STATUS = '1'
            --AND COALESCE(F.SITUACAO,'E') = 'E'
            AND F.ID = I.FERRAMENTARIA_ID
            AND F.ID <> FO.FERRAMENTA_ID
            AND I.LINHA_ID = FO.LINHA_ID
            AND I.TAMANHO = FO.TAMANHO
            --AND F.MATRIZ_ID = FO.MATRIZ_ID
            AND F.LARG <= FO.LARGURA
            AND F.COMP <= FO.COMPRIMENTO
            AND F.ALT  <= FO.ALTURA
            AND F.LARG  > 0
            AND F.COMP  > 0
            AND F.ALT   > 0
            
            ORDER BY LARG DESC, COMP DESC, ALT DESC, SERIE
        ) Z
    INTO
        :GRUPO_ID,
        :ID,
        :DESCRICAO,
        :SERIE,
        :MATRIZ_ID,
        :MATRIZ_DESCRICAO,
        :LINHA_ID,
        :TAMANHO,
        :LARGURA,
        :COMPRIMENTO,
        :ALTURA,
        :DATA,
        :OBSERVACAO,
        :TEMPO_SETUP,
        :TEMPO_SETUP_AQUECIMENTO,
        :STATUS_CONFLITO
    DO
    BEGIN  
        SUSPEND;

    END

END;


CREATE OR ALTER TRIGGER TBSUB_UP_B1U FOR TBSUB_UP
ACTIVE BEFORE INSERT POSITION 1
AS
BEGIN
    -- INSERE A ESTACAO NA TBUP_ESTACAO
    UPDATE OR INSERT
    INTO TBUP_ESTACAO (
        UP_ID,
        ID
    ) VALUES (
        NEW.UP_ID,
        NEW.ID
    );
END;

CREATE OR ALTER TRIGGER TBSUB_UP_BD0 FOR TBSUB_UP
ACTIVE BEFORE DELETE POSITION 0
AS
begin
    -- EXCLUI A ESTACAO NA TBUP_ESTACAO
    DELETE FROM TBUP_ESTACAO E
     WHERE E.UP_ID = OLD.UP_ID
       AND E.ID = OLD.ID;
end;

CREATE OR ALTER TRIGGER TTBSUB_UP_B0I FOR TBSUB_UP
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.controle is null) then
    new.controle = gen_id(gtbSUB_UP,1);
end;

CREATE OR ALTER TRIGGER TTBSUB_UP_B1U FOR TBSUB_UP
INACTIVE BEFORE UPDATE POSITION 1
AS
begin

   if (OLD.TALAO_ID > 0 and NEW.TALAO_ID > 0 and OLD.TALAO_ID <> NEW.TALAO_ID) then
       BEGIN
       Exception "..." 'JA EXISTE TALAO EM PRODUCAO NA UNIDADE PRODUTIVA E ESTACAO SELECIONADA! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
       END ELSE

   if (OLD.TALAO_ID = 0 and NEW.TALAO_ID = 0 AND NEW.INCREMENTO > 0) then
       BEGIN
       Exception "..." 'TALAO JA ESTA PARADO OU FOI FINALIZADO! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
       END ELSE

   if (NEW.TALAO_ID > 0) then
       BEGIN
       NEW.EM_PRODUCAO = '1';
       END ELSE

   if (NEW.TALAO_ID = 0) then
       BEGIN
       NEW.EM_PRODUCAO = '0';
       END

    NEW.INCREMENTO = 0;
end;

CREATE OR ALTER TRIGGER TTBSUB_UP_B9U FOR TBSUB_UP
ACTIVE BEFORE UPDATE POSITION 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = 'Estacao '||OLD.DESCRICAO;

   if (OLD.DESCRICAO <> NEW.DESCRICAO) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.->'||NEW.DESCRICAO;
       END

   if (OLD.PERFIL_SKU <> NEW.PERFIL_SKU) then
       BEGIN
       HISTORICO = HISTORICO||' Perfil '||OLD.PERFIL_SKU||'->'||NEW.PERFIL_SKU;
       END

   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Status Inativado';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Status Ativado';
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBSETOR', OLD.UP_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),
       'Estacao alterada: '||:Historico);
       End

end;

COMMENT ON COLUMN TBSUB_UP.INCREMENTO IS
'Campo que confirma a alteração do campo TALAO_ID
Para confirmar a alteração no campo TALAO_ID, este campo deverá sempre ser maior que 0';

COMMENT ON COLUMN TBSUB_UP.PROCESSAR_AUTOMATICAMENTE IS
'- Permite processar automaticamente taloes para a estacao
1 = Sim
0 = Nao';

COMMENT ON COLUMN TBSUB_UP.HABILITA_SETUP_AQUECIMENTO IS
'Verifica se a estacao recebe setup de aquecimento
1 = SIM
0 = NAO';

COMMENT ON COLUMN TBSUB_UP.DATAHORA_REFEICAO IS
'Data e Hora da solicitacao de trabalho durante a refeicao';

COMMENT ON COLUMN TBSUB_UP.MINUTOS_REFEICAO IS
'Minutos que serao trabalhados durante a refeicao';


SET STATISTICS INDEX ITBSUBUP_01;
SET STATISTICS INDEX ITBSUBUP_02;
SET STATISTICS INDEX ITBSUBUP_03;
SET STATISTICS INDEX ITBSUBUP_04;
SET STATISTICS INDEX PK_TBSUB_UP;

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

end;

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

end;

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

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;

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 ttbsetor_b9u for tbsetor
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;

CREATE OR ALTER procedure spc_minutos_disponiveis (
    familia_id integer,
    gp_id varchar(10),
    perfil_up char(1),
    mes integer,
    ano integer)
returns (
    estacoes integer,
    dias integer,
    minutos integer,
    minutos_dia integer,
    minutos_noite integer,
    total_minutos_dia integer,
    total_minutos_noite integer)
as
declare variable data_inicio date;
declare variable data_fim date;
begin

end;

CREATE OR ALTER procedure spc_minutos_disponiveis2 (
    familia_id integer,
    gp_id varchar(10),
    perfil_up char(1),
    mes1 integer,
    ano1 integer,
    mes2 integer,
    ano2 integer)
returns (
    estacoes integer,
    dias integer,
    minutos integer,
    minutos_dia integer,
    minutos_noite integer,
    total_minutos_dia integer,
    total_minutos_noite integer)
as
declare variable data_inicio date;
declare variable data_fim date;
declare variable data_inicio2 date;
begin

end;

CREATE OR ALTER VIEW TBUP(
    ID,
    DESCRICAO,
    FAMILIA_ID,
    STATUS,
    CODIGO1,
    CCUSTO,
    PLANO_MESTRE,
    PERFIL)
AS
Select Codigo, Descricao, Familia_Codigo,
       Status, Codigo1, CCUSTO, Plano_Mestre, '' as Perfil
From TbSetor
;



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

CREATE OR ALTER VIEW TBUP(
    ID,
    DESCRICAO,
    FAMILIA_ID,
    STATUS,
    CODIGO1,
    CCUSTO,
    PLANO_MESTRE,
    PERFIL)
AS
Select Codigo, Descricao, Familia_Codigo,
       Status, Codigo1, CCUSTO, Plano_Mestre, Perfil
From TbSetor
;

CREATE OR ALTER procedure spc_minutos_disponiveis2 (
    familia_id integer,
    gp_id varchar(10),
    perfil_up char(1),
    mes1 integer,
    ano1 integer,
    mes2 integer,
    ano2 integer)
returns (
    estacoes integer,
    dias integer,
    minutos integer,
    minutos_dia integer,
    minutos_noite integer,
    total_minutos_dia integer,
    total_minutos_noite integer)
as
declare variable data_inicio date;
declare variable data_fim date;
declare variable data_inicio2 date;
begin

  data_inicio = Cast('01.'||mes1||'.'||ano1 as Date);

  data_inicio2 = Cast('01.'||mes2||'.'||ano2 as Date);
  data_fim = Cast(FN_END_OF_MONTH(data_inicio2) as Date);


for
Select
    ESTACOES,
    DIAS,
    MINUTOS,
    MINUTOS_DIA,
    MINUTOS_NOITE,
    MINUTOS_DIA * DIAS TOTAL_MINUTOS_DIA,
    MINUTOS_NOITE * DIAS TOTAL_MINUTOS_NOITE
From (
Select COUNT(ESTACAO_ID) ESTACOES, TRUNC(AVG(DIAS)) DIAS, SUM(MINUTOS) MINUTOS,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'528') as Integer) From TbControle_N N Where Id = 108) Minutos_Dia,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'486') as Integer) From TbControle_N N Where Id = 109) Minutos_Noite
From (
Select GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID, Count(DATA) Dias, Sum(MINUTOS) MINUTOS
From (
Select Distinct C.GP_ID, E.Descricao Gp_Descricao, C.Up_Id, U.Descricao Up_Descricao, U.Perfil, C.Estacao_Id, CE.Data, CE.Minutos
  From TBCALENDARIO_ESTACAO C, TbSetor U, TbEsteira E, TbCalendario_Esteira CE
 Where C.DATA Between :data_inicio and :data_fim
   and C.Up_Id = U.Codigo
   and E.Codigo = C.Gp_Id
   and CE.Esteira_id = C.GP_ID
   and C.Data = CE.Data
   and CE.Minutos > 0
   and E.Familia_Codigo = :Familia_Id
   and C.Gp_Id like Replace(:Gp_Id,'*','%')
   and U.Perfil like Replace(:Perfil_Up,'*','%') 
) Group By GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID
)
)
  into
    :ESTACOES,
    :DIAS,
    :MINUTOS,
    :MINUTOS_DIA,
    :MINUTOS_NOITE,
    :TOTAL_MINUTOS_DIA,
    :TOTAL_MINUTOS_NOITE

  do
  begin
  post_event 'Connection attempt by blocked user.';
    suspend;
  end
end;

CREATE OR ALTER procedure spc_minutos_disponiveis (
    familia_id integer,
    gp_id varchar(10),
    perfil_up char(1),
    mes integer,
    ano integer)
returns (
    estacoes integer,
    dias integer,
    minutos integer,
    minutos_dia integer,
    minutos_noite integer,
    total_minutos_dia integer,
    total_minutos_noite integer)
as
declare variable data_inicio date;
declare variable data_fim date;
begin

  data_inicio = Cast('01.'||mes||'.'||ano as Date);
  data_fim = Cast(FN_END_OF_MONTH(Data_Inicio) as Date);


for
Select
    ESTACOES,
    DIAS,
    MINUTOS,
    MINUTOS_DIA,
    MINUTOS_NOITE,
    MINUTOS_DIA * DIAS TOTAL_MINUTOS_DIA,
    MINUTOS_NOITE * DIAS TOTAL_MINUTOS_NOITE
From (
Select COUNT(ESTACAO_ID) ESTACOES, TRUNC(AVG(DIAS)) DIAS, SUM(MINUTOS) MINUTOS,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'528') as Integer) From TbControle_N N Where Id = 108) Minutos_Dia,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'486') as Integer) From TbControle_N N Where Id = 109) Minutos_Noite
From (
Select GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID, Count(DATA) Dias, Sum(MINUTOS) MINUTOS
From (
Select Distinct C.GP_ID, E.Descricao Gp_Descricao, C.Up_Id, U.Descricao Up_Descricao, U.Perfil, C.Estacao_Id, CE.Data, CE.Minutos
  From TBCALENDARIO_ESTACAO C, TbSetor U, TbEsteira E, TbCalendario_Esteira CE
 Where C.DATA Between :data_inicio and :data_fim
   and C.Up_Id = U.Codigo
   and E.Codigo = C.Gp_Id
   and CE.Esteira_id = C.GP_ID
   and C.Data = CE.Data
   and CE.Minutos > 0
   and E.Familia_Codigo = :Familia_Id
   and C.Gp_Id like Replace(:Gp_Id,'*','%')
   and U.Perfil like Replace(:Perfil_Up,'*','%') 
) Group By GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID
)
)
  into
    :ESTACOES,
    :DIAS,
    :MINUTOS,
    :MINUTOS_DIA,
    :MINUTOS_NOITE,
    :TOTAL_MINUTOS_DIA,
    :TOTAL_MINUTOS_NOITE

  do
  begin
  post_event 'Connection attempt by blocked user.';
    suspend;
  end
end;

CREATE OR ALTER trigger ttbsetor_b9u for tbsetor
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.DESCRICAO <> NEW.DESCRICAO) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.'||OLD.DESCRICAO||'->'||NEW.DESCRICAO;
       END

   if (OLD.Esteira_Codigo <> NEW.Esteira_Codigo) then
       BEGIN
       HISTORICO = HISTORICO||' GP.'||OLD.Esteira_Codigo||'->'||NEW.Esteira_Codigo;
       END

   if (OLD.Codigo1 <> NEW.Codigo1) then
       BEGIN
       HISTORICO = HISTORICO||' CÃ³d.Bar.'||OLD.Codigo1||'->'||NEW.Codigo1;
       END

   if (OLD.PLANO_MESTRE <> NEW.PLANO_MESTRE) then
       BEGIN
       HISTORICO = HISTORICO||' Pl.Mestre:'||OLD.PLANO_MESTRE||'->'||NEW.PLANO_MESTRE;
       END

   if (OLD.FAMILIA_CODIGO <> NEW.FAMILIA_CODIGO) then
       BEGIN
       HISTORICO = HISTORICO||' Familia Codigo:'||OLD.FAMILIA_CODIGO||'->'||NEW.FAMILIA_CODIGO;
       END

   if (OLD.CCUSTO <> NEW.CCUSTO) then
       BEGIN
       HISTORICO = HISTORICO||' Centro de Custo:'||OLD.CCUSTO||'->'||NEW.CCUSTO;
       END

   if (OLD.PERFIL <> NEW.PERFIL) then
       BEGIN
       HISTORICO = HISTORICO||' Perfil:'||OLD.PERFIL||'->'||NEW.PERFIL;
       END

   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Status Inativado';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Status Ativado';
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBSETOR', OLD.CODIGO,
      (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),
       'UP alterada: '||:Historico);
       End
end;


CREATE OR ALTER trigger ttbsac_defeito_b01u for tbsac_defeito
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

end;


ALTER TABLE TBSAC_DEFEITO ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBSAC_DEFEITO set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBSAC_DEFEITO DROP CLASSIFICACAO;
ALTER TABLE TBSAC_DEFEITO ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBSAC_DEFEITO set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBSAC_DEFEITO DROP OLD_PERFIL;


CREATE OR ALTER trigger ttbsac_defeito_b01u for tbsac_defeito
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( OLD.DESCRICAO <> NEW.DESCRICAO) THEN
    BEGIN
        HISTORICO = HISTORICO||' Descricao do Defeito: '||OLD.CODIGO||', Alterada: '|| OLD.DESCRICAO||'->'||NEW.DESCRICAO;
    END

    IF ( OLD.STATUS <> NEW.STATUS) THEN
    BEGIN
        HISTORICO = HISTORICO||' Status do Defeito: '||OLD.CODIGO||', Alterado: '|| OLD.STATUS||'->'||NEW.STATUS;
    END

    IF ( OLD.SETOR <> NEW.SETOR) THEN
    BEGIN
        HISTORICO = HISTORICO||' Setor do Defeito: '||OLD.CODIGO||', Alterado: '|| OLD.SETOR||'->'||NEW.SETOR;
    END

    IF ( OLD.FAMILIA_ID <> NEW.FAMILIA_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||' Familia do Defeito: '||OLD.CODIGO||', Alterada: '|| OLD.FAMILIA_ID||'->'||NEW.FAMILIA_ID;
    END

    IF ( OLD.QUALIDADE <> NEW.QUALIDADE) THEN
    BEGIN
        HISTORICO = HISTORICO||' Defeito de Qualidade no: '||OLD.CODIGO||', Alterado: '|| OLD.QUALIDADE||'->'||NEW.QUALIDADE;
    END

    IF ( OLD.ESTOQUE <> NEW.ESTOQUE) THEN
    BEGIN
        HISTORICO = HISTORICO||' Estoque de Estragado no: '||OLD.CODIGO||', Alterado: '|| OLD.ESTOQUE||'->'||NEW.ESTOQUE;
    END

    IF ( OLD.CONFORMACAO <> NEW.CONFORMACAO) THEN
    BEGIN
        HISTORICO = HISTORICO||' Conformacao no Defeito: '||OLD.CODIGO||', Alterado: '|| OLD.CONFORMACAO||'->'||NEW.CONFORMACAO;
    END

    IF ( OLD.CLASSIFICACAO <> NEW.CLASSIFICACAO) THEN
    BEGIN
        HISTORICO = HISTORICO||' Classificacao no Defeito: '||OLD.CODIGO||', Alterada: '|| OLD.CLASSIFICACAO||'->'||NEW.CLASSIFICACAO;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBSAC_DEFEITO', NEW.CODIGO, HISTORICO);
    END
end;
CREATE OR ALTER trigger ttbrevisao_ob_b9u for tbrevisao_ob
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;

CREATE OR ALTER procedure rel_posicao_pecas (
    localizacao integer,
    familia integer,
    cores varchar(400),
    obs varchar(400),
    produto integer,
    data_1 date,
    data_2 date,
    classif char(1))
returns (
    produto_id integer,
    produto_descricao varchar(130),
    tamanho integer,
    tam_descricao varchar(10),
    estoque varchar(30),
    quantidade varchar(30),
    saldo varchar(30),
    tara varchar(30),
    remessa_talao varchar(20),
    peca varchar(15),
    ob varchar(15),
    enderecamento varchar(15),
    nf_empresa varchar(120),
    operador varchar(50),
    datahora_registro varchar(20),
    tipo_registro varchar(30),
    classificacao char(1),
    observacao blob sub_type 1 segment size 80)
as
declare variable vtipo char(1);
declare variable vproduto_id integer;
declare variable vproduto_descricao varchar(130);
declare variable vtamanho integer;
declare variable vtam_descricao varchar(10);
declare variable vestoque varchar(30);
declare variable vtara varchar(30);
declare variable vquantidade varchar(30);
declare variable vsaldo varchar(30);
declare variable vremessa_talao varchar(20);
declare variable vpeca varchar(15);
declare variable vob varchar(15);
declare variable venderecamento varchar(15);
declare variable vnf_empresa varchar(120);
declare variable voperador varchar(50);
declare variable vdatahora_registro varchar(20);
declare variable vtipo_registro varchar(30);
declare variable vchave varchar(20);
declare variable vestoq varchar(30);
declare variable vclassificacao char(1);
BEGIN

end;

CREATE OR ALTER procedure spc_talao_pecas_disponiveis (
    talao_id integer)
returns (
    referencia_tipo varchar(4),
    referencia_id integer,
    produto_id integer,
    remessa varchar(20),
    remessa_id integer,
    remessa_talao_id integer,
    remessa_talao_detalhe_id integer,
    enderecamento varchar(64),
    saldo numeric(18,4),
    observacao varchar(500))
as
declare variable consumo_produto_id integer;
declare variable consumo_tamanho integer;
declare variable consumo_quantidade numeric(15,4);
BEGIN

end;

ALTER TABLE TBREVISAO_OB ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBREVISAO_OB set OLD_PERFIL = CLASSIFICACAO;
ALTER TABLE TBREVISAO_OB DROP CLASSIFICACAO;
ALTER TABLE TBREVISAO_OB ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBREVISAO_OB set CLASSIFICACAO = OLD_PERFIL;
ALTER TABLE TBREVISAO_OB DROP OLD_PERFIL;


CREATE OR ALTER procedure spc_talao_pecas_disponiveis (
    talao_id integer)
returns (
    referencia_tipo varchar(4),
    referencia_id integer,
    produto_id integer,
    remessa varchar(20),
    remessa_id integer,
    remessa_talao_id integer,
    remessa_talao_detalhe_id integer,
    enderecamento varchar(64),
    saldo numeric(18,4),
    observacao varchar(500))
as
declare variable consumo_produto_id integer;
declare variable consumo_tamanho integer;
declare variable consumo_quantidade numeric(15,4);
BEGIN
    
    FOR
        SELECT
            C.PRODUTO_ID,
            COALESCE(C.TAMANHO,0)TAMANHO,
            MAX(C.QUANTIDADE)
        
        FROM
            VWREMESSA_TALAO T,
            VWREMESSA_CONSUMO C
        
        WHERE T.ID               = :TALAO_ID
        AND C.REMESSA_ID       = T.REMESSA_ID
        AND C.REMESSA_TALAO_ID = T.REMESSA_TALAO_ID
        AND C.COMPONENTE       = '0'
        AND C.STATUS           = '0'
        
        GROUP BY 1,2
    INTO
        CONSUMO_PRODUTO_ID,
        CONSUMO_TAMANHO,
        CONSUMO_QUANTIDADE
    DO
    BEGIN

        FOR
            SELECT FIRST 5
                REFERENCIA_TIPO,
                REFERENCIA_ID,
                PRODUTO_ID,
                CAST(SUBSTRING(REMESSA_DADOS FROM  1 FOR 15) AS INTEGER)REMESSA,
                CAST(SUBSTRING(REMESSA_DADOS FROM 16 FOR 15) AS INTEGER)REMESSA_TALAO_ID,  
                CAST(SUBSTRING(REMESSA_DADOS FROM 31 FOR 15) AS INTEGER)REMESSA_TALAO_DETALHE_ID,
                ENDERECAMENTO,
                SALDO,
                OBSERVACAO
            FROM (
                SELECT
                    'R' REFERENCIA_TIPO,
                    R.ID REFERENCIA_ID,
                    R.PRODUTO_ID,
            
                    (SELECT FIRST 1
                            LPAD(D.REMESSA_ID       ,15)||
                            LPAD(D.REMESSA_TALAO_ID ,15)||
                            LPAD(D.ID               ,15)
                       FROM VWREMESSA_TALAO_DETALHE D
                      WHERE D.ID = R.TALAO_ID)REMESSA_DADOS,
        
                    (SELECT FIRST 1 E.GRUPO || '/' || E.SUBGRUPO
                       FROM TBENDERECAMENTO E
                      WHERE E.ID = R.ENDERECAMENTO_ID) ENDERECAMENTO,
            
                    (R.SALDO -
                    COALESCE(
                        (SELECT SUM(V.QUANTIDADE)
                           FROM TBREMESSA_TALAO_VINCULO V
                          WHERE V.TIPO = 'R'
                            AND V.TABELA_ID = R.ID
                            AND V.STATUS = '0'),0)
                    ) SALDO,

                    (SELECT FIRST 1 IIF(O.OB <> 0,  'OB: ' || O.OB, '') || IIF(O.CLASSIFICACAO <> '',' CLASSIF.: ' || O.CLASSIFICACAO,'')
                       FROM TBREVISAO_OB O
                      WHERE O.OB = R.OB) OBSERVACAO
            
                FROM 
                    TBREVISAO R
                
                WHERE R.PRODUTO_ID          = :CONSUMO_PRODUTO_ID
                AND COALESCE(R.TAMANHO,0) = :CONSUMO_TAMANHO
                AND R.SALDO               > 0
        
                ORDER BY
                    R.SALDO
            ) X
            WHERE
                X.SALDO >= :CONSUMO_QUANTIDADE

            UNION

            SELECT FIRST 5
                REFERENCIA_TIPO,
                REFERENCIA_ID,
                PRODUTO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                NULL ENDERECAMENTO,
                SALDO,
                NULL OBSERVACAO
            FROM (
                SELECT
                    'D' REFERENCIA_TIPO,
                    D.ID REFERENCIA_ID,
                    D.PRODUTO_ID,
                    D.REMESSA_ID,
                    D.REMESSA_TALAO_ID,
                    D.ID REMESSA_TALAO_DETALHE_ID,
                    (D.QUANTIDADE_SALDO -
                    COALESCE(
                        (SELECT SUM(V.QUANTIDADE)
                           FROM TBREMESSA_TALAO_VINCULO V
                          WHERE V.TIPO = 'D'
                            AND V.TABELA_ID = D.ID
                            AND V.STATUS = '0'),0)
                    ) SALDO,

                    (SELECT FIRST 1 CV.ID
                       FROM TBREMESSA_CONSUMO_VINCULO CV
                      WHERE CV.REMESSA_TALAO_DETALHE_ID = D.ID) VINCULO

                FROM
                    VWREMESSA_TALAO_DETALHE D

                WHERE D.PRODUTO_ID          = :CONSUMO_PRODUTO_ID
                AND COALESCE(D.TAMANHO,0) = :CONSUMO_TAMANHO
                AND D.QUANTIDADE_SALDO > 0
                          
                ORDER BY
                    D.QUANTIDADE_SALDO
            ) X
            WHERE X.VINCULO IS NULL
            AND X.SALDO >= :CONSUMO_QUANTIDADE
        INTO
            REFERENCIA_TIPO,
            REFERENCIA_ID,
            PRODUTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            REMESSA_TALAO_DETALHE_ID,
            ENDERECAMENTO,
            SALDO,
            OBSERVACAO
        DO
        BEGIN
            REMESSA = (SELECT FIRST 1 REMESSA FROM VWREMESSA R WHERE R.REMESSA_ID = :REMESSA_ID);
            SUSPEND;
        END



    END



END;

CREATE OR ALTER procedure rel_posicao_pecas (
    localizacao integer,
    familia integer,
    cores varchar(400),
    obs varchar(400),
    produto integer,
    data_1 date,
    data_2 date,
    classif char(1))
returns (
    produto_id integer,
    produto_descricao varchar(130),
    tamanho integer,
    tam_descricao varchar(10),
    estoque varchar(30),
    quantidade varchar(30),
    saldo varchar(30),
    tara varchar(30),
    remessa_talao varchar(20),
    peca varchar(15),
    ob varchar(15),
    enderecamento varchar(15),
    nf_empresa varchar(120),
    operador varchar(50),
    datahora_registro varchar(20),
    tipo_registro varchar(30),
    classificacao char(1),
    observacao blob sub_type 1 segment size 80)
as
declare variable vtipo char(1);
declare variable vproduto_id integer;
declare variable vproduto_descricao varchar(130);
declare variable vtamanho integer;
declare variable vtam_descricao varchar(10);
declare variable vestoque varchar(30);
declare variable vtara varchar(30);
declare variable vquantidade varchar(30);
declare variable vsaldo varchar(30);
declare variable vremessa_talao varchar(20);
declare variable vpeca varchar(15);
declare variable vob varchar(15);
declare variable venderecamento varchar(15);
declare variable vnf_empresa varchar(120);
declare variable voperador varchar(50);
declare variable vdatahora_registro varchar(20);
declare variable vtipo_registro varchar(30);
declare variable vchave varchar(20);
declare variable vestoq varchar(30);
declare variable vclassificacao char(1);
BEGIN

  vChave = '';

FOR
  SELECT TIPO, PRODUTO_ID, LPAD(PRODUTO_ID,5,'0')||' - '||PRODUTO_DESCRICAO||IIF(TAMANHO>0,' - '||TAM_DESCRICAO,'') PRODUTO_DESCRICAO, TAMANHO, TAM_DESCRICAO,
       ESTOQUE, TARA, QUANTIDADE, SALDO, REMESSA_TALAO, PECA, OB,
       ENDERECAMENTO, NF_EMPRESA, OPERADOR, FORMATDATETIME(DATAHORA_REGISTRO) DATAHORA_REGISTRO,

       IIF(AVULSO='1','PEÇA IMPLANTADA',
       IIF(AVULSO='1','PEÇA IMPLANTADA',
       IIF(STATUS_OB='2','PESADO/LIBERADO S/REVISAO',
       IIF(STATUS_OB='3','PESADO/REPROVADO S/REVISAO',
       IIF(STATUS_OB='9','PRODUZIDO',
       IIF(RESULTADO = 'R','PESADO/REVISADO/APROVADO',
       IIF(RESULTADO = 'D','PESADO/REVISADO/REPROVADO',''))))))) TIPO_REGISTRO, CLASSIFICACAO, OBSERVACAO

FROM (
SELECT TIPO, PECA, PRODUTO_ID, PRODUTO_DESCRICAO, '' NF_EMPRESA,
       TARA, QUANTIDADE, SALDO, ESTOQUE,
       DATAHORA_REGISTRO, OB, RESULTADO, ENDERECAMENTO, OPERADOR,
       TAMANHO, TAM_DESCRICAO, AVULSO, STATUS_OB, CLASSIFICACAO, REMESSA_TALAO, OBSERVACAO
FROM (
SELECT '0' TIPO, '' PECA, P.CODIGO PRODUTO_ID, P.DESCRICAO PRODUTO_DESCRICAO, 0 NUMERO_NOTAFISCAL,
       '' EMPRESA, '' TARA, '' QUANTIDADE, '' SALDO,

       CAST((SELECT IIF(GS.TAMANHO = 0,ES.SALDO,
               IIF(GS.TAMANHO = 1,ES.T01_SALDO,IIF(GS.TAMANHO = 2,ES.T02_SALDO,
               IIF(GS.TAMANHO = 3,ES.T03_SALDO,IIF(GS.TAMANHO = 4,ES.T04_SALDO,
               IIF(GS.TAMANHO = 5,ES.T05_SALDO,IIF(GS.TAMANHO = 6,ES.T06_SALDO,
               IIF(GS.TAMANHO = 7,ES.T07_SALDO,IIF(GS.TAMANHO = 8,ES.T08_SALDO,
               IIF(GS.TAMANHO = 9,ES.T09_SALDO,IIF(GS.TAMANHO =10,ES.T10_SALDO,
               IIF(GS.TAMANHO =11,ES.T11_SALDO,IIF(GS.TAMANHO =12,ES.T12_SALDO,
               IIF(GS.TAMANHO =13,ES.T13_SALDO,IIF(GS.TAMANHO =14,ES.T14_SALDO,
               IIF(GS.TAMANHO =15,ES.T15_SALDO,IIF(GS.TAMANHO =16,ES.T16_SALDO,
               IIF(GS.TAMANHO =17,ES.T17_SALDO,IIF(GS.TAMANHO =18,ES.T18_SALDO,
               IIF(GS.TAMANHO =19,ES.T19_SALDO,IIF(GS.TAMANHO =20,ES.T20_SALDO,0)))))))))))))))))))))
          FROM TBESTOQUE_SALDO ES
         WHERE ES.ESTABELECIMENTO_CODIGO = 1
           AND ES.LOCALIZACAO_CODIGO = :LOCALIZACAO
           AND ES.PRODUTO_CODIGO = P.CODIGO) AS NUMERIC(15,2)) ESTOQUE,

       CURRENT_TIMESTAMP DATAHORA_REGISTRO, '' OB, '' RESULTADO,
       '' ENDERECAMENTO, '' OPERADOR,
        GS.TAMANHO,
       COALESCE((SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,GS.TAMANHO)),'') TAM_DESCRICAO,
       '' AVULSO, '' STATUS_OB, '' CLASSIFICACAO, '' REMESSA_TALAO, '' as OBSERVACAO


FROM TBPRODUTO P, TBGRADE_SEQ GS
WHERE P.FAMILIA_CODIGO = :FAMILIA
  AND P.STATUS = '1'
  AND ((P.GRADE_CODIGO > 0 AND GS.TAMANHO > 0) OR (P.GRADE_CODIGO = 0 AND GS.TAMANHO = 0))
  AND IIF( :PRODUTO > 0, P.CODIGO = :PRODUTO, TRUE)
) X WHERE X.ESTOQUE > 0

UNION

SELECT '1' TIPO, A.ID PECA, A.PRODUTO_ID, P.DESCRICAO PRODUTO_DESCRICAO,
          COALESCE(LPAD(A.NUMERO_NOTAFISCAL,7,'0')||' - '||
          (SELECT FIRST 1 E.NOMEFANTASIA FROM TBEMPRESA E WHERE E.CODIGO = A.EMPRESA_ID),'') NF_EMPRESA,
           CAST(A.TARA AS NUMERIC(15,2))  TARA,
           CAST(A.PESO_LIQUIDO AS NUMERIC(15,2))  QUANTIDADE,
           CAST(A.SALDO AS NUMERIC(15,2)) SALDO, '' ESTOQUE,
           A.DATAHORA DATAHORA_REGISTRO, A.OB, A.RESULTADO,
          COALESCE((SELECT FIRST 1 E.GRUPO||E.SUBGRUPO FROM TBENDERECAMENTO E WHERE E.ID = A.ENDERECAMENTO_ID),'') ENDERECAMENTO,
          COALESCE((SELECT FIRST 1 O.NOME FROM TBOPERADOR O WHERE O.CODIGO = A.OPERADOR_ID),
                   (SELECT FIRST 1 U.NOME FROM TBUSUARIO U WHERE U.CODIGO = A.USUARIO_ID)) OPERADOR, A.TAMANHO,
          COALESCE((SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,A.TAMANHO)),'') TAM_DESCRICAO,
          A.AVULSO,
          COALESCE(RO.STATUS,'') STATUS_OB,
          COALESCE(RO.CLASSIFICACAO,'') CLASSIFICACAO,
          '' REMESSA_TALAO, a.observacao

FROM  TBPRODUTO P, TBREVISAO A LEFT JOIN TBREVISAO_OB RO ON (RO.NFE_ID = A.NFE_ID AND RO.OB = A.OB)

WHERE A.PRODUTO_ID = P.CODIGO
  AND A.ESTABELECIMENTO_ID = 1
  AND A.LOCALIZACAO_ENTRADA = :LOCALIZACAO
  AND A.SALDO > 0
  AND P.FAMILIA_CODIGO = :FAMILIA
  AND IIF(:OBs = '0', TRUE, A.OB IN (SELECT * FROM SPLIT(:OBs,',')))
  AND IIF(:CORES = '0', TRUE, P.COR_CODIGO IN (SELECT * FROM SPLIT(:CORES,',')))
  AND IIF( :PRODUTO > 0, P.CODIGO = :PRODUTO , TRUE)
  AND A.datahora BETWEEN :DATA_1 AND :DATA_2

UNION

SELECT '2' TIPO, A.CONTROLE PECA,
       A.PRODUTO_CODIGO PRODUTO_ID, P.DESCRICAO PRODUTO_DESCRICAO, '' NF_EMPRESA,
       0 TARA,
       CAST(A.QUANTIDADE_PRODUCAO AS NUMERIC(15,2)) QUANTIDADE,
       CAST(A.QUANTIDADE_SALDO AS NUMERIC(15,2)) SALDO, '' ESTOQUE,
       A.HORA_PRODUCAO DATAHORA_REGISTRO, '' OB, '' RESULTADO,
       '' ENDERECAMENTO,
      (SELECT FIRST 1 O.NOME FROM TBOPERADOR O WHERE O.CODIGO = A.OPERADOR) OPERADOR, A.TAMANHO,
       COALESCE((SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,A.TAMANHO)),'') TAM_DESCRICAO,
       '' AVULSO, '9' STATUS_OB, '' CLASSIFICACAO,
       R.REMESSA||'-'||A.REMESSA_ACUMULADO_CONTROLE REMESSA_TALAO, '' as OBSERVACAO

FROM TBPEDIDO_ITEM_PROCESSADO A, TBPRODUTO P, TBREMESSA R

 WHERE A.PRODUTO_CODIGO = P.CODIGO
  AND A.REMESSA = R.NUMERO
  AND A.LOCALIZACAO_CODIGO = :LOCALIZACAO
  AND A.ESTABELECIMENTO_CODIGO = 1
  AND A.QUANTIDADE_SALDO > 0
  AND A.SITUACAO >= 2
  AND P.FAMILIA_CODIGO = :FAMILIA
  AND A.ESTOQUE_ID > 0
  AND IIF( :PRODUTO > 0, P.CODIGO = :PRODUTO , TRUE)
  AND A.DATA_PRODUCAO BETWEEN :DATA_1 AND :DATA_2
) X

 WHERE CLASSIFICACAO LIKE :CLASSIF

 ORDER BY
 X.PRODUTO_DESCRICAO, X.PRODUTO_ID, X.TAM_DESCRICAO, X.TIPO, X.PECA

 INTO :vTIPO,:vPRODUTO_ID,:vPRODUTO_DESCRICAO,:vTAMANHO,:vTAM_DESCRICAO,:vESTOQUE,:vTARA,
:vQUANTIDADE,:vSALDO,:vREMESSA_TALAO,:vPECA,:vOB,:vENDERECAMENTO,:vNF_EMPRESA,
:vOPERADOR,:vDATAHORA_REGISTRO,:vTIPO_REGISTRO,:vCLASSIFICACAO, OBSERVACAO

 DO

   --OBSERVACAO =  coalesce(OBSERVACAO,'');

   if (:vTIPO = '0') Then
       begin
       :vestoq = :vESTOQUE;
        vChave = :vPRODUTO_ID||'-'||:vTAMANHO;
       end else
   if (:vTIPO = '1' or :vTIPO = '2') Then
       Begin
        :PRODUTO_ID = :vPRODUTO_ID;
        :PRODUTO_DESCRICAO = :vPRODUTO_DESCRICAO;
        :TAMANHO = :vTAMANHO;
        :TAM_DESCRICAO = :vTAM_DESCRICAO;
        if (:vChave = :vPRODUTO_ID||'-'||:vTAMANHO) then
            Begin
            :ESTOQUE = :vESTOQ;
            End else
            Begin
            :ESTOQUE = '';
            End
        :TARA = :vTARA;
        :QUANTIDADE = :vQUANTIDADE;
        :SALDO = :vSALDO;
        :REMESSA_TALAO = :vREMESSA_TALAO;
        :PECA = :vPECA;
        :OB = :vOB;
        :ENDERECAMENTO = :vENDERECAMENTO;
        :NF_EMPRESA = :vNF_EMPRESA;
        :OPERADOR = :vOPERADOR;
        :DATAHORA_REGISTRO = :vDATAHORA_REGISTRO;
        :TIPO_REGISTRO = :vTIPO_REGISTRO;
        :vESTOQ = '';
        :vChave = '';
        :CLASSIFICACAO = :vCLASSIFICACAO;
        SUSPEND;
       End

END;

CREATE OR ALTER trigger ttbrevisao_ob_b9u for tbrevisao_ob
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

    HISTORICO = '';
    if (New.ID > 0) then
       Begin
    
           if (OLD.NFE_ID <> NEW.NFE_ID) then
               BEGIN
               HISTORICO = HISTORICO||' ID Doc.Fis.'||OLD.NFE_ID||'->'||NEW.NFE_ID;
               END
           if (OLD.EMPRESA_ID <> NEW.EMPRESA_ID) then
               BEGIN
               HISTORICO = HISTORICO||' Empresa '||OLD.EMPRESA_ID||'->'||NEW.EMPRESA_ID;
               END
           if (OLD.OB <> NEW.OB) then
               BEGIN
               HISTORICO = HISTORICO||' OB '||OLD.OB||'->'||NEW.OB;
               END
           if (OLD.UP_ID <> NEW.UP_ID) then
               BEGIN
               HISTORICO = HISTORICO||' UP '||OLD.UP_ID||'->'||NEW.UP_ID;
               END
           if (OLD.DATA <> NEW.DATA) then
               BEGIN
               HISTORICO = HISTORICO||' Data '||OLD.DATA||'->'||NEW.DATA;
               END
           if (OLD.CLASSIFICACAO <> NEW.CLASSIFICACAO) then
               BEGIN
               HISTORICO = HISTORICO||' Class.'||OLD.CLASSIFICACAO||'->'||NEW.CLASSIFICACAO;
               END
           if (OLD.OBSERVACAO <> NEW.OBSERVACAO) then
               BEGIN
               HISTORICO = HISTORICO||' Obs.'||OLD.OBSERVACAO||'->'||NEW.OBSERVACAO;
               END
           if (OLD.STATUS <> NEW.STATUS) then
               BEGIN
               if (NEW.STATUS = '0') Then
                   Begin
                   HISTORICO = HISTORICO||' Status alterado: -> OB PENDENTE';
                   End else
               if (NEW.STATUS = '1') Then
                   Begin
                   HISTORICO = HISTORICO||' Status alterado: -> OB LIBERADA PARA REVISAO';
                   End else
               if (NEW.STATUS = '2') Then
                   Begin
                   HISTORICO = HISTORICO||' Status alterado: -> OB LIBERADA SEM REVISAO';
                   End else
               if (NEW.STATUS = '3') Then
                   Begin
                   HISTORICO = HISTORICO||' Status alterado: -> OB REPROVADA';
                   End
               END

               if (Old.STATUS_REVISAO_DOCUMENTO = '0' AND New.STATUS_REVISAO_DOCUMENTO = '1') then
                   Begin
                   HISTORICO = :HISTORICO||' DOC.FISCAL ENCERRADO.';
                   End
               if (Old.STATUS_REVISAO_DOCUMENTO = '1' AND New.STATUS_REVISAO_DOCUMENTO = '0') then
                   Begin
                   HISTORICO = :HISTORICO||' DOC.FISCAL REATIVADO PARA PESAGEM.';
                   End
         
       if (HISTORICO <> '') then
           Begin
           INSERT INTO TBHISTORICO
                      (
                      TABELA,
                      TABELA_ID,
                      USUARIO, IP,
                      HISTORICO
                      )
               VALUES(
                      'TBREVISAO_OB',
                      Old.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),
                      :Historico
                      );
           End  
       End

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 ttbrequisicao_b9u for tbrequisicao
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

end;

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

CREATE OR ALTER trigger ttbrequisicao_b9u for tbrequisicao
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';
   if (OLD.ESTABELECIMENTO_ID <> NEW.ESTABELECIMENTO_ID) then
       BEGIN
       HISTORICO = HISTORICO||' Est:'||OLD.ESTABELECIMENTO_ID||'->'||NEW.ESTABELECIMENTO_ID;
       END
   if (OLD.GP_ID <> NEW.GP_ID) then
       BEGIN
       HISTORICO = HISTORICO||'GP.'||OLD.GP_ID||'->'||NEW.GP_ID;
       END
   if (OLD.OPERADOR_ID <> NEW.OPERADOR_ID) then
       BEGIN
       HISTORICO = HISTORICO||'Oper.'||OLD.OPERADOR_ID||'->'||NEW.OPERADOR_ID;
       END
   if (OLD.REMESSA <> NEW.REMESSA) then
       BEGIN
       HISTORICO = HISTORICO||' Rem.'||OLD.REMESSA||'->'||NEW.REMESSA;
       END
   if (OLD.REMESSA_GERADA <> NEW.REMESSA_GERADA) then
       BEGIN
       HISTORICO = HISTORICO||' Rem.Ger.'||OLD.REMESSA_GERADA||'->'||NEW.REMESSA_GERADA;
       END

   if (OLD.DATA <> NEW.DATA) then
       BEGIN
       HISTORICO = HISTORICO||' Data:'||OLD.DATA||'->'||NEW.DATA;
       END
   if (OLD.Perfil <> NEW.Perfil) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.'||OLD.Perfil||'->'||NEW.Perfil;
       END
   if (OLD.PRODUTO_ID <> NEW.PRODUTO_ID) then
       BEGIN
       HISTORICO = HISTORICO||' Prod.'||OLD.PRODUTO_ID||'->'||NEW.PRODUTO_ID;
       END
   if (OLD.TAMANHO <> NEW.TAMANHO) then
       BEGIN
       HISTORICO = HISTORICO||' Tam'||OLD.TAMANHO||'->'||NEW.TAMANHO;
       END
   if (OLD.QUANTIDADE <> NEW.QUANTIDADE) then
       BEGIN
       HISTORICO = HISTORICO||' Quant'||OLD.QUANTIDADE||'->'||NEW.QUANTIDADE;
       END
   if (OLD.JUSTIFICATIVA <> NEW.JUSTIFICATIVA) then
       BEGIN
       HISTORICO = HISTORICO||' Just.'||OLD.JUSTIFICATIVA||'->'||NEW.JUSTIFICATIVA;
       END

   if (OLD.CCUSTO <> NEW.CCUSTO) then
       BEGIN
       HISTORICO = HISTORICO||' C.Custo:'||OLD.CCUSTO||'->'||NEW.CCUSTO;
       END
   if (OLD.CONSUMO <> NEW.CONSUMO) then
       BEGIN
       HISTORICO = HISTORICO||' Cons.'||OLD.CONSUMO||'->'||NEW.CONSUMO;
       END
   if (OLD.DENSIDADE <> NEW.DENSIDADE) then
       BEGIN
       HISTORICO = HISTORICO||' Dens.'||OLD.DENSIDADE||'->'||NEW.DENSIDADE;
       END
   if (OLD.ESPESSURA <> NEW.ESPESSURA) then
       BEGIN
       HISTORICO = HISTORICO||' Esp.'||OLD.ESPESSURA||'->'||NEW.ESPESSURA;
       END
   if (OLD.Quebra <> NEW.Quebra) then
       BEGIN
       HISTORICO = HISTORICO||' Queb.'||OLD.Quebra||'->'||NEW.Quebra;
       END

   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Stat.Pendente';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Stat.Autorizado';
       if (NEW.STATUS = '2') then
           HISTORICO = HISTORICO||' Stat.Rem.Gerada';
       if (NEW.STATUS = '3') then
           HISTORICO = HISTORICO||' Talão Excluído';
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBREQUISICAO', OLD.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),
       :Historico);
       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 ttbremessa_item_processado_b1i for tbremessa_item_processado
active before insert position 1
AS
begin

end;

CREATE OR ALTER procedure spi_remessa_consumo_matriz_v7 (
    i_remessa_id integer,
    i_remessa_talao_id integer)
as
declare variable estabelecimento_id integer;
declare variable remessa_id integer;
declare variable remessa_talao_id integer;
declare variable densidade smallint;
declare variable espessura numeric(18,2);
declare variable talao_quantidade numeric(18,5);
declare variable consumo_medio numeric(18,5);
declare variable familia_id integer;
declare variable produto_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable tamanho smallint;
declare variable fator_divisor numeric(18,8);
declare variable fator_multiplicador numeric(18,1);
declare variable localizacao_id integer;
declare variable um_alternativa varchar(12);
declare variable quantidade numeric(18,4);
declare variable quanitdade_alternativa numeric(18,4);
declare variable perfil_id integer;
declare variable colecao varchar(10);
declare variable consumo_produto_status integer;
begin

end;

CREATE OR ALTER procedure spi_remessa_talao_extra (
    i_remessa_id integer)
as
declare variable estabelecimento_id integer;
declare variable familia_id integer;
declare variable remessa_id integer;
declare variable remessa_talao_id integer;
declare variable matriz_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable status varchar(4);
declare variable perfil_sku varchar(10);
declare variable gp_id integer;
declare variable quantidade_total_taloes numeric(18,4);
declare variable percentual numeric(18,4);
declare variable quantidade numeric(18,4);
BEGIN

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

end;

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

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 procedure spi_remessa_consumo_matriz_v7 (
    i_remessa_id integer,
    i_remessa_talao_id integer)
as
declare variable estabelecimento_id integer;
declare variable remessa_id integer;
declare variable remessa_talao_id integer;
declare variable densidade smallint;
declare variable espessura numeric(18,2);
declare variable talao_quantidade numeric(18,5);
declare variable consumo_medio numeric(18,5);
declare variable familia_id integer;
declare variable produto_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable tamanho smallint;
declare variable fator_divisor numeric(18,8);
declare variable fator_multiplicador numeric(18,1);
declare variable localizacao_id integer;
declare variable um_alternativa varchar(12);
declare variable quantidade numeric(18,4);
declare variable quanitdade_alternativa numeric(18,4);
declare variable perfil_id integer;
declare variable colecao varchar(10);
declare variable consumo_produto_status integer;
begin

    PERFIL_ID = COALESCE((SELECT FIRST 1 P.CONTROLE FROM TBPERFIL P WHERE P.TABELA = 'SKU' AND P.ID = (
        SELECT FIRST 1 T.PERFIL
          FROM TBREMESSA_ITEM_PROCESSADO T
         WHERE T.REMESSA = :I_REMESSA_ID
           AND T.CONTROLE = :I_REMESSA_TALAO_ID)),0);
    COLECAO = COALESCE((SELECT FIRST 1 VALOR FROM TBPARAMETRO_DETALHE D WHERE D.PARAMETRO_ID = 523 AND D.TABELA_ID = :PERFIL_ID),1);

    FOR
        SELECT
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            DENSIDADE,
            ESPESSURA,
            TALAO_QUANTIDADE,
            CONSUMO_MEDIO,
            FAMILIA_ID,
            PRODUTO_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            FATOR_DIVISOR,
            FATOR_MULTIPLICADOR,
            LOCALIZACAO_ID,
            UM_ALTERNATIVA,
            round(CAST(((CONSUMO_MEDIO * FATOR_MULTIPLICADOR) / FATOR_DIVISOR) AS NUMERIC(15,4))/COLECAO_DIVISOR,1) QUANTIDADE,
            IIF(TRIM(UM_ALTERNATIVA) = 'M',CAST((CONSUMO_MEDIO * FATOR_MULTIPLICADOR) AS NUMERIC(15,4)),0)/COLECAO_DIVISOR QUANITDADE_ALTERNATIVA,
            CONSUMO_PRODUTO_STATUS
        
        FROM (
            SELECT
                T.ESTABELECIMENTO_ID,
                T.REMESSA_ID, 
                T.REMESSA_TALAO_ID,
                T.DENSIDADE,
                T.ESPESSURA,
                (T.QUANTIDADE + T.QUANTIDADE_SOBRA) TALAO_QUANTIDADE,
                T.CONSUMO_MEDIO,
                C.CONSUMO_FAMILIA_ID FAMILIA_ID,
                C.CONSUMO_PRODUTO_ID PRODUTO_ID,
                C.CONSUMO_MODELO_ID MODELO_ID,
                C.CONSUMO_COR_ID COR_ID,
                C.CONSUMO_TAMANHO TAMANHO,
                C.CONSUMO_QUANTIDADE QUANTIDADE,
                C.CONSUMO_FATOR_DIVISOR FATOR_DIVISOR, /*CONVERSAO*/
                C.CONSUMO_FATOR_MULTIPLICADOR FATOR_MULTIPLICADOR, /*MATRIZ*/
                C.CONSUMO_LOCALIZACAO_ID LOCALIZACAO_ID,
                C.CONSUMO_UM_ALTERNATIVA UM_ALTERNATIVA,
                IIF(:COLECAO = '3' AND (T.REMESSA_TALAO_ID BETWEEN 0001 AND 0999 OR T.REMESSA_TALAO_ID BETWEEN 7001 AND 9999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999),1,1) COLECAO_DIVISOR,
                c.CONSUMO_PRODUTO_STATUS
            FROM
                VWREMESSA_TALAO T
                LEFT JOIN TBPRODUTO P ON P.CODIGO = T.PRODUTO_ID
                LEFT JOIN VWMODELO_FICHA_CONSUMO C
                       ON C.MODELO_ID = T.MODELO_ID
                      AND C.TAMANHO = T.TAMANHO
                      AND (C.COR_ID = P.COR_CODIGO OR C.COR_ID IS NULL),
                TBFAMILIA_MODELO_ALOCACAO A
            WHERE
                T.REMESSA_ID = :I_REMESSA_ID
            AND T.REMESSA_TALAO_ID = :I_REMESSA_TALAO_ID
            AND C.HABILITA_GERAR_CONSUMO = '1'           
            --AND C.CONSUMO_PRODUTO_STATUS = '1'
            AND A.FAMILIA_ID = C.FAMILIA_ID
            AND A.FAMILIA_MODELO_ID = C.CONSUMO_FAMILIA_ID
            AND
                IIF ( :COLECAO = '1',TRUE,
                IIF(  :COLECAO = '3',
                --    IIF( T.REMESSA_TALAO_ID BETWEEN 0001 AND 0999 OR T.REMESSA_TALAO_ID BETWEEN 7001 AND 9999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999 ,C.TIPO = '1',
                    IIF( T.REMESSA_TALAO_ID BETWEEN 6001 AND 6999 OR T.REMESSA_TALAO_ID BETWEEN 60001 AND 69999 , C.TIPO = '2', FALSE)/*)*/,FALSE
                )
                )


            UNION ALL

            SELECT FIRST 1
                T.ESTABELECIMENTO_ID,
                T.REMESSA_ID, 
                T.REMESSA_TALAO_ID,
                T.DENSIDADE,
                T.ESPESSURA,
                (T.QUANTIDADE + T.QUANTIDADE_SOBRA) TALAO_QUANTIDADE,
                T.CONSUMO_MEDIO,
                IIF(T.REMESSA_TALAO_ID BETWEEN 7001 AND 7999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999,COALESCE(LEAD(C.CONSUMO_FAMILIA_ID) OVER(),C.CONSUMO_FAMILIA_ID),C.CONSUMO_FAMILIA_ID) FAMILIA_ID,
                IIF(T.REMESSA_TALAO_ID BETWEEN 7001 AND 7999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999,COALESCE(LEAD(C.CONSUMO_PRODUTO_ID) OVER(),C.CONSUMO_PRODUTO_ID),C.CONSUMO_PRODUTO_ID) PRODUTO_ID,
                IIF(T.REMESSA_TALAO_ID BETWEEN 7001 AND 7999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999,COALESCE(LEAD(C.CONSUMO_MODELO_ID) OVER(),C.CONSUMO_MODELO_ID),C.CONSUMO_MODELO_ID) MODELO_ID,
                IIF(T.REMESSA_TALAO_ID BETWEEN 7001 AND 7999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999,COALESCE(LEAD(C.CONSUMO_COR_ID) OVER(),C.CONSUMO_COR_ID),C.CONSUMO_COR_ID) COR_ID,
                IIF(T.REMESSA_TALAO_ID BETWEEN 7001 AND 7999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999,COALESCE(LEAD(C.CONSUMO_TAMANHO) OVER(),C.CONSUMO_TAMANHO),C.CONSUMO_TAMANHO) TAMANHO,
                IIF(T.REMESSA_TALAO_ID BETWEEN 7001 AND 7999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999,COALESCE(LEAD(C.CONSUMO_QUANTIDADE) OVER(),C.CONSUMO_QUANTIDADE),C.CONSUMO_QUANTIDADE) QUANTIDADE,
                IIF(T.REMESSA_TALAO_ID BETWEEN 7001 AND 7999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999,COALESCE(LEAD(C.CONSUMO_FATOR_DIVISOR) OVER(),C.CONSUMO_FATOR_DIVISOR),C.CONSUMO_FATOR_DIVISOR) FATOR_DIVISOR, /*CONVERSAO*/
                IIF(T.REMESSA_TALAO_ID BETWEEN 7001 AND 7999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999,COALESCE(LEAD(C.CONSUMO_FATOR_MULTIPLICADOR) OVER(),C.CONSUMO_FATOR_MULTIPLICADOR),C.CONSUMO_FATOR_MULTIPLICADOR) FATOR_MULTIPLICADOR, /*MATRIZ*/
                IIF(T.REMESSA_TALAO_ID BETWEEN 7001 AND 7999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999,COALESCE(LEAD(C.CONSUMO_LOCALIZACAO_ID) OVER(),C.CONSUMO_LOCALIZACAO_ID),C.CONSUMO_LOCALIZACAO_ID) LOCALIZACAO_ID,
                IIF(T.REMESSA_TALAO_ID BETWEEN 7001 AND 7999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999,COALESCE(LEAD(C.CONSUMO_UM_ALTERNATIVA) OVER(),C.CONSUMO_UM_ALTERNATIVA),C.CONSUMO_UM_ALTERNATIVA) UM_ALTERNATIVA,
                1 COLECAO_DIVISOR,
                c.CONSUMO_PRODUTO_STATUS
            FROM
                VWREMESSA_TALAO T
                LEFT JOIN TBPRODUTO P ON P.CODIGO = T.PRODUTO_ID
                LEFT JOIN VWMODELO_FICHA_CONSUMO C
                       ON C.MODELO_ID = T.MODELO_ID
                      AND C.TAMANHO = T.TAMANHO
                      AND C.COR_ID = P.COR_CODIGO,
                TBFAMILIA_MODELO_ALOCACAO A
            WHERE
                T.REMESSA_ID = :I_REMESSA_ID
            AND T.REMESSA_TALAO_ID = :I_REMESSA_TALAO_ID
            AND C.HABILITA_GERAR_CONSUMO = '1'           
            --AND C.CONSUMO_PRODUTO_STATUS= '1'
            AND A.FAMILIA_ID = C.FAMILIA_ID
            AND A.FAMILIA_MODELO_ID = C.CONSUMO_FAMILIA_ID
            AND IIF( :COLECAO = '2' or (:COLECAO = '3' and (T.REMESSA_TALAO_ID BETWEEN 0001 AND 0999 OR T.REMESSA_TALAO_ID BETWEEN 7001 AND 9999 OR T.REMESSA_TALAO_ID BETWEEN 70001 AND 79999)) , TRUE,FALSE)

            ) X
        INTO
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            DENSIDADE,
            ESPESSURA,
            TALAO_QUANTIDADE,
            CONSUMO_MEDIO,
            FAMILIA_ID,
            PRODUTO_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            FATOR_DIVISOR,
            FATOR_MULTIPLICADOR,
            LOCALIZACAO_ID,
            UM_ALTERNATIVA,
            QUANTIDADE,
            QUANITDADE_ALTERNATIVA,
            CONSUMO_PRODUTO_STATUS
        DO
        BEGIN

            IF ( :CONSUMO_PRODUTO_STATUS = 0 ) THEN
            BEGIN
                EXCEPTION "..." 'Produto de consumo esta inativo, TALAO: ' || :I_REMESSA_TALAO_ID || ',  Produto:'||:PRODUTO_ID||' - '||coalesce((select first 1 p.descricao from tbproduto p where p.codigo = :PRODUTO_ID),'') ;
            END


            IF ( QUANTIDADE > 0 ) THEN
            BEGIN
                INSERT INTO TBREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    FAMILIA_ID,
                    REMESSA,
                    TALAO,
                    PRODUTO_ID,
                    TAMANHO,
                    LOCALIZACAO_ID,
                    DENSIDADE,
                    ESPESSURA,
                    COR_ID,
                    FATOR_CONVERSAO,
                    QUANTIDADE,
                    CONSUMO_KG,
                    CONSUMO_ML
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :FAMILIA_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :LOCALIZACAO_ID,
                    :DENSIDADE,
                    :ESPESSURA,
                    :COR_ID,
                    :FATOR_DIVISOR,
                    :TALAO_QUANTIDADE,
                    :QUANTIDADE,
                    :QUANITDADE_ALTERNATIVA);
            END
        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 spi_remessa_talao_extra (
    i_remessa_id integer)
as
declare variable estabelecimento_id integer;
declare variable familia_id integer;
declare variable remessa_id integer;
declare variable remessa_talao_id integer;
declare variable matriz_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable status varchar(4);
declare variable perfil_sku varchar(10);
declare variable gp_id integer;
declare variable quantidade_total_taloes numeric(18,4);
declare variable percentual numeric(18,4);
declare variable quantidade numeric(18,4);
BEGIN

    FOR
        SELECT           
            ESTABELECIMENTO_ID, 
            FAMILIA_ID,
            REMESSA_ID,
            8000 + ROW_NUMBER() OVER() REMESSA_TALAO_ID,
            MATRIZ_ID,
            MODELO_ID,    
            COR_ID,
            PRODUTO_ID,
            TAMANHO,
            STATUS,
            PERFIL_SKU,
            GP_ID,
            QUANTIDADE_TOTAL_TALOES,
            PERCENTUAL,
            QUANTIDADE

        FROM (
            SELECT         
                ESTABELECIMENTO_ID, 
                FAMILIA_ID,     
                REMESSA_ID,
                MODELO_ID,
                MATRIZ_ID,
                PRODUTO_ID,
                COR_ID,
                TAMANHO,
                STATUS,
                PERFIL_SKU,
                GP_ID,
                QUANTIDADE_TOTAL_TALOES,
                PERCENTUAL,
                FN_ARRENDONDAR_PARA_CIMA(QUANTIDADE_TOTAL_TALOES * PERCENTUAL) QUANTIDADE
            
            FROM (
                SELECT
                    T.REMESSA                AS REMESSA_ID,
                    T.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                    T.FAMILIA_CODIGO         AS FAMILIA_ID,
                    P.MODELO_CODIGO          AS MODELO_ID,
                    T.MATRIZ_CODIGO          AS MATRIZ_ID,
                    T.PRODUTO_CODIGO         AS PRODUTO_ID,
                    P.COR_CODIGO             AS COR_ID,
                    T.TAMANHO                AS TAMANHO,
                    '1'                      AS STATUS,
                    T.PERFIL                 AS PERFIL_SKU,
                    T.PROGRAMACAO_ESTEIRA    AS GP_ID,
                    SUM(T.QUANTIDADE)        AS QUANTIDADE_TOTAL_TALOES,
                    (SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT (P.MODELO_CODIGO,P.COR_CODIGO,T.TAMANHO,T.REMESSA,0,'1')) PERCENTUAL
                
                FROM
                    TBREMESSA_ITEM_PROCESSADO T,
                    TBPRODUTO P
                
                WHERE T.REMESSA = :I_REMESSA_ID
                AND P.CODIGO  = T.PRODUTO_CODIGO
                
                GROUP BY 1,2,3,4,5,6,7,8,9,10,11
                ) X
            ) Y
        WHERE Y.QUANTIDADE > 0
    INTO    
        ESTABELECIMENTO_ID,   
        FAMILIA_ID,
        REMESSA_ID,
        REMESSA_TALAO_ID,     
        MATRIZ_ID,
        MODELO_ID,  
        COR_ID,
        PRODUTO_ID,
        TAMANHO,
        STATUS,
        PERFIL_SKU,
        GP_ID,
        QUANTIDADE_TOTAL_TALOES,
        PERCENTUAL,
        QUANTIDADE
    DO
    BEGIN
        INSERT INTO TBREMESSA_ITEM_PROCESSADO (
            ESTABELECIMENTO_CODIGO,   
            FAMILIA_CODIGO,  
            REMESSA,
            CONTROLE,
            MATRIZ_CODIGO,
            MODELO_CODIGO,
            PRODUTO_CODIGO,
            TAMANHO,
            QUANTIDADE,
            SITUACAO,
            PERFIL,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            PERCENTUAL_TALAO_EXTRA
        ) VALUES (        
            :ESTABELECIMENTO_ID, 
            :FAMILIA_ID,
            :REMESSA_ID,
            :REMESSA_TALAO_ID, 
            :MATRIZ_ID,
            :MODELO_ID,
            :PRODUTO_ID,
            :TAMANHO,
            :QUANTIDADE,
            :STATUS,
            :PERFIL_SKU,
            :GP_ID,
            0,
            :PERCENTUAL
        );
    END

END;



CREATE OR ALTER VIEW VWREMESSA(
    ESTABELECIMENTO_ID,
    FAMILIA_ID,
    FAMILIA_ID_MP,
    REMESSA_ID,
    REMESSA,
    DATA,
    PERFIL,
    STATUS,
    COMPONENTE,
    WEB,
    TIPO,
    REQUISICAO,
    GP_ID,
    USUARIO_ID,
    AMOSTRA,
    DESCRICAO,
    DATA_DISPONIBILIDADE,
    DATAHORA,
    OBSERVACAO)
AS
SELECT
    R.ESTABELECIMENTO_CODIGO,
    R.FAMILIA_CODIGO,
    R.FAMILIA_MP,
    R.NUMERO,
    R.REMESSA,
    R.DATA,
    '' as PERFIL,
    R.STATUS,
    R.COMPONENTE,
    R.WEB,
    R.TIPO,
    R.REQUISICAO,
    R.GP_ID,
    R.USUARIO_CODIGO,
    R.AMOSTRA,
    R.DESCRICAO,
    DATA_DISPONIBILIDADE,
    R.DATAHORA,
    R.OBSERVACAO
FROM
    TBREMESSA R
;

CREATE OR ALTER trigger ttbremessa_b9u for tbremessa
active before update position 9
AS
/*****************************
 *                           *
 *       REGISTRA LOG        *
 *       DE ALTERAÇÃO        *
 *                           *
 *****************************/

DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

end;

CREATE OR ALTER trigger ttbremessa_consumo_a1i for tbremessa_consumo
active after insert position 1
AS
declare variable vPerfil Char(1);
declare variable Remessa_Req Char(1);
declare variable vId_Req Integer;
Begin

end;

CREATE OR ALTER trigger ttbremessa_consumo_b1i for tbremessa_consumo
active before insert position 1
AS

declare variable vPerfil Char(1);
declare variable Seguranca Numeric(15,4);
declare variable vRemessa Integer;
declare variable vPedido Integer;
declare variable vPed_Item_Id Integer;
declare variable Remessa_Req Char(1);
declare variable vQuantidade Numeric(15,4);
Begin

end;

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


ALTER TABLE TBREMESSA ADD OLD_PERFIL2 VARCHAR(10) DEFAULT '';
update TBREMESSA set OLD_PERFIL2 = CLASSIFICACAO;
ALTER TABLE TBREMESSA DROP CLASSIFICACAO;
ALTER TABLE TBREMESSA ADD CLASSIFICACAO VARCHAR(10) DEFAULT '';
update TBREMESSA set CLASSIFICACAO = OLD_PERFIL2;
ALTER TABLE TBREMESSA DROP OLD_PERFIL2;

CREATE OR ALTER trigger ttbremessa_consumo_b1i for tbremessa_consumo
active before insert position 1
AS

declare variable vPerfil Char(1);
declare variable Seguranca Numeric(15,4);
declare variable vRemessa Integer;
declare variable vPedido Integer;
declare variable vPed_Item_Id Integer;
declare variable Remessa_Req Char(1);
declare variable vQuantidade Numeric(15,4);
Begin

if (Coalesce(NEW.COMPONENTE,'') = '') Then
    begin
    vPerfil = Coalesce((Select First 1 Perfil From TbRemessa Where Numero = New.Remessa),'');
    
    if (vPerfil = '') then -- Processar as regras abaixo somente nas remessas de bojos
        begin
    
        if (New.Requisicao_Id > 0) Then
            Begin
            Remessa_Req = '1';
            End else
            Begin
            Remessa_Req = (Coalesce((Select First 1 Requisicao From TbRemessa Where Numero = New.Remessa),'1'));
            End
    
        if (:Remessa_Req = '0') then
            Begin
            Seguranca = (Coalesce((Select First 1 Seguranca From TbProduto Where Codigo = New.Produto_Id),0));
            NEW.SEGURANCA = New.Consumo_Kg * (:Seguranca / 100.0000);
                /*
                For Select  RIA.Tabela_Id, RIA.Tab_Item_Id, Sum(RIA.Quantidade)
                      From TbRemessa_Item_Alocacao RIA, TbPedido_Item_Processado PIP
                     Where RIA.estabelecimento_id = New.Estabelecimento_Id
                       and RIA.Remessa = New.Remessa
                       and RIA.Remessa = PIP.Remessa
                       and RIA.Talao = PIP.Controle
                       and PIP.Remessa_Acumulado_Controle = New.Talao
                     Group By 1,2
                 Into :vPedido, :vPed_Item_Id, :vQuantidade
                 Do
                   Begin
    
                   if (:vPedido > 0) then
                       Begin
                          Update TbPedido_Consumo A Set
                          A.Pedido_Quantidade = A.Pedido_Quantidade - :vQuantidade
                          Where A.Pedido_Id = :vPedido
                            and A.Pedido_Item_Id = :vPed_Item_Id
                            and A.Tipo = 'C';
                       End
                   End */
            End
    
        --Baixa saldo reservado para requisição
        if (:Remessa_Req = '1') then
            Begin -- Localiza a remessa original da requisição
              For Select First 1 RQ.Remessa
                    From TbRequisicao RQ
                   Where RQ.Remessa_Gerada = New.Remessa
                     and RQ.Talao = New.Talao
                    Into :vRemessa
                      Do
                  Begin
                  if (:vRemessa > 0) then
                      Begin
                        Update TbRemessa_Consumo_Req Set
                        Saldo = Saldo - New.Consumo_Kg
                        Where Estabelecimento_Id = New.Estabelecimento_Id
                          and Localizacao_Id = New.Localizacao_ID
                          and Remessa = :vRemessa
                          and Produto_Id = New.Produto_Id
                          and Tamanho = New.Tamanho;
                      End
                  End
            End
    
        End
    End
END;

CREATE OR ALTER trigger ttbremessa_consumo_a1i for tbremessa_consumo
active after insert position 1
AS
declare variable vPerfil Char(1);
declare variable Remessa_Req Char(1);
declare variable vId_Req Integer;
Begin

if (Coalesce(NEW.COMPONENTE,'') = '') Then
    begin

    vPerfil = Coalesce((Select First 1 Perfil From TbRemessa Where Numero = New.Remessa),'');
    if (vPerfil = '') then -- Processar as regras abaixo somente nas remessas de bojos
        begin

            if (New.Requisicao_Id > 0) Then
                Begin
                Remessa_Req = '1';
                End else
                Begin
                Remessa_Req = (Coalesce((Select First 1 Requisicao From TbRemessa Where Numero = New.Remessa),'1'));
                End
        
            --Aloca no estoque
            Execute Procedure Spi_Remessa_Consumo (New.Estabelecimento_Id,
            New.Localizacao_Id, New.Produto_Id, New.Tamanho, New.Remessa, New.Id);
        
            if (:Remessa_Req = '0' and NEW.SEGURANCA > 0) then
                Begin
                --Reserva saldo para requisição
                    vID_Req = (Coalesce((Select First 1 ID From TbRemessa_Consumo_Req
                                          Where Remessa = New.Remessa
                                            and Produto_Id = New.Produto_Id
                                            and Tamanho = New.Tamanho),0));
        
                    if (vID_Req = 0) then
                        Begin
                            Insert Into TbRemessa_Consumo_Req (Estabelecimento_Id,
                            Remessa,Localizacao_Id,Produto_Id,Tamanho,Quantidade,Saldo)
                            Values (New.Estabelecimento_Id,New.Remessa,New.Localizacao_Id,
                            New.Produto_Id,New.Tamanho,New.Seguranca,New.Seguranca);
                        End else
                        Begin
                            Update TbRemessa_Consumo_Req Set
                            Quantidade = Quantidade + NEW.SEGURANCA,
                            Saldo = Saldo + NEW.SEGURANCA
                            Where Estabelecimento_Id = New.Estabelecimento_Id
                              and Localizacao_Id = New.Localizacao_ID
                              and Remessa = New.Remessa
                              and Produto_Id = New.Produto_Id
                              and Tamanho = New.Tamanho;
                        End
        
                End
        End
    End
End;


CREATE OR ALTER trigger ttbremessa_b9u for tbremessa
active before update position 9
AS
/*****************************
 *                           *
 *       REGISTRA LOG        *
 *       DE ALTERAÇÃO        *
 *                           *
 *****************************/

DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

      HISTORICO = '';

   IF (OLD.ESTABELECIMENTO_CODIGO <> NEW.ESTABELECIMENTO_CODIGO) THEN
       BEGIN
       HISTORICO = HISTORICO||' ESTAB.: '||OLD.ESTABELECIMENTO_CODIGO||'->'||NEW.ESTABELECIMENTO_CODIGO;
       END
   IF (OLD.NUMERO <> NEW.NUMERO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CÓD.REM.: '||OLD.NUMERO||'->'||NEW.NUMERO;
       END
   IF (OLD.FAMILIA_CODIGO <> NEW.FAMILIA_CODIGO) THEN
       BEGIN
       HISTORICO = HISTORICO||' FAMILIA: '||OLD.FAMILIA_CODIGO||'->'||NEW.FAMILIA_CODIGO;
       END
   IF (OLD.TURNO_CODIGO <> NEW.TURNO_CODIGO) THEN
       BEGIN
       HISTORICO = HISTORICO||' TURNO: '||OLD.TURNO_CODIGO||'->'||NEW.TURNO_CODIGO;
       END
   IF (OLD.DATA <> NEW.DATA) THEN
       BEGIN
       HISTORICO = HISTORICO||' DATA: '||OLD.DATA||'->'||NEW.DATA;
       END
   IF (OLD.TIPO <> NEW.TIPO) THEN
       BEGIN
       HISTORICO = HISTORICO||' TIPO: '||OLD.TIPO||'->'||NEW.TIPO;
       END
   IF (OLD.TONALIDADE <> NEW.TONALIDADE) THEN
       BEGIN
       HISTORICO = HISTORICO||' TONALID.: '||OLD.TONALIDADE||'->'||NEW.TONALIDADE;
       END
   IF (OLD.PROJECAO <> NEW.PROJECAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' PROJECAO: '||OLD.PROJECAO||'->'||NEW.PROJECAO;
       END
   IF (OLD.OC <> NEW.OC) THEN
       BEGIN
       HISTORICO = HISTORICO||' OC: '||OLD.OC||'->'||NEW.OC;
       END
   IF (OLD.CLASSIFICACAO <> NEW.CLASSIFICACAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CLASSIF.: '||OLD.CLASSIFICACAO||'->'||NEW.CLASSIFICACAO;
       END
   IF (OLD.BLOQ <> NEW.BLOQ) THEN
       BEGIN
       HISTORICO = HISTORICO||' BLOQ.: '||OLD.BLOQ||'->'||NEW.BLOQ;
       END
   IF (OLD.STATUS <> NEW.STATUS) THEN
       BEGIN
       HISTORICO = HISTORICO||' STATUS: '||OLD.STATUS||'->'||NEW.STATUS;
       END
   IF (OLD.PERFIL <> NEW.PERFIL) THEN
       BEGIN
       HISTORICO = HISTORICO||' PERFIL: '||OLD.PERFIL||'->'||NEW.PERFIL;
       END
   IF (OLD.REMESSA <> NEW.REMESSA) THEN
       BEGIN
       HISTORICO = HISTORICO||' REMESSA: '||OLD.REMESSA||'->'||NEW.REMESSA;
       END
   IF (OLD.AGRUPAMENTO_ID <> NEW.AGRUPAMENTO_ID) THEN
       BEGIN
       HISTORICO = HISTORICO||' AGRUPAM.: '||OLD.AGRUPAMENTO_ID||'->'||NEW.AGRUPAMENTO_ID;
       END
   IF (OLD.FAMILIA_MP <> NEW.FAMILIA_MP) THEN
       BEGIN
       HISTORICO = HISTORICO||' FAM.MP.: '||OLD.FAMILIA_MP||'->'||NEW.FAMILIA_MP;
       END
   IF (OLD.REQUISICAO <> NEW.REQUISICAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' REQ.: '||OLD.REQUISICAO||'->'||NEW.REQUISICAO;
       END
   IF (OLD.DESCRICAO <> NEW.DESCRICAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' DESC.: '||OLD.DESCRICAO||'->'||NEW.DESCRICAO;
       END
   IF (OLD.DATA_BSC <> NEW.DATA_BSC) THEN
       BEGIN
       HISTORICO = HISTORICO||' DATA BSC: '||OLD.DATA_BSC||'->'||NEW.DATA_BSC;
       END
   IF (OLD.DATAHORA <> NEW.DATAHORA) THEN
       BEGIN
       HISTORICO = HISTORICO||' DATA/HORA: '||OLD.DATAHORA||'->'||NEW.DATAHORA;
       END
   IF (OLD.GP_ID <> NEW.GP_ID) THEN
       BEGIN
       HISTORICO = HISTORICO||' GP.: '||OLD.GP_ID||'->'||NEW.GP_ID;
       END
   IF (OLD.CONTROLE_TALAO <> NEW.CONTROLE_TALAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CTRL.TALAO: '||OLD.CONTROLE_TALAO||'->'||NEW.CONTROLE_TALAO;
       END
   IF (OLD.COMPONENTE <> NEW.COMPONENTE) THEN
       BEGIN
       HISTORICO = HISTORICO||' COMPONENTE: '||OLD.COMPONENTE||'->'||NEW.COMPONENTE;
       END
   IF (OLD.WEB <> NEW.WEB) THEN
       BEGIN
       HISTORICO = HISTORICO||' WEB: '||OLD.WEB||'->'||NEW.WEB;
       END

        IF (HISTORICO <> '') THEN
        BEGIN
            EXECUTE PROCEDURE SPI_HISTORICO('TBREMESSA',NEW.NUMERO,:HISTORICO);
        END
END;



CREATE OR ALTER VIEW VWREMESSA(
    ESTABELECIMENTO_ID,
    FAMILIA_ID,
    FAMILIA_ID_MP,
    REMESSA_ID,
    REMESSA,
    DATA,
    PERFIL,
    STATUS,
    COMPONENTE,
    WEB,
    TIPO,
    REQUISICAO,
    GP_ID,
    USUARIO_ID,
    AMOSTRA,
    DESCRICAO,
    DATA_DISPONIBILIDADE,
    DATAHORA,
    OBSERVACAO)
AS
SELECT
    R.ESTABELECIMENTO_CODIGO,
    R.FAMILIA_CODIGO,
    R.FAMILIA_MP,
    R.NUMERO,
    R.REMESSA,
    R.DATA,
    R.PERFIL,
    R.STATUS,
    R.COMPONENTE,
    R.WEB,
    R.TIPO,
    R.REQUISICAO,
    R.GP_ID,
    R.USUARIO_CODIGO,
    R.AMOSTRA,
    R.DESCRICAO,
    DATA_DISPONIBILIDADE,
    R.DATAHORA,
    R.OBSERVACAO
FROM
    TBREMESSA R
;

CREATE OR ALTER function fn_programacao_tempo_novo (
    modelo_id integer,
    cor_id integer,
    tam integer,
    tipo integer)
returns numeric(14,4)
as
declare variable totalsetup2 integer;
declare variable totalsetup1 integer;
declare variable totalsetup3 numeric(14,4);
declare variable resultado numeric(14,4);
declare variable totalprocesso1 numeric(14,4);
declare variable totalprocesso2 integer;
declare variable totalprocesso3 integer;
declare variable id integer;
declare variable familia_producao integer;
declare variable sequencia integer;
declare variable familia_id integer;
declare variable gp_id varchar(40);
declare variable perfil_up char(4);
declare variable up_padrao1 integer;
declare variable up_padrao2 integer;
declare variable calculo_rebobinamento char(4);
declare variable calculo_conformacao char(4);
declare variable ccusto varchar(40);
declare variable fator numeric(18,2);
declare variable status char(4);
declare variable remessas_defeito integer;
begin

end;

CREATE OR ALTER procedure spu_custo_despesa (
    familia_id integer,
    data_1 date,
    data_2 date,
    meses integer)
returns (
    ret_contas numeric(18,8),
    total_contas numeric(18,8))
as
declare variable cliente_id integer;
declare variable data date;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable est_min char(1);
declare variable quantidade numeric(15,4);
declare variable ano integer;
declare variable mes integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable c numeric(18,8);
declare variable co numeric(18,8);
declare variable cs numeric(18,8);
declare variable cip numeric(18,8);
declare variable cia numeric(18,8);
declare variable perda numeric(18,8);
declare variable tributos decimal(15,4);
declare variable frete numeric(15,4);
declare variable comissao numeric(15,4);
declare variable preco_venda numeric(15,4);
declare variable preco_venda2 numeric(15,4);
declare variable contas numeric(18,8);
declare variable gp_id varchar(10);
declare variable perfil_up varchar(10);
declare variable minutos integer;
declare variable faturamento_familia numeric(18,4);
declare variable mercado integer;
declare variable ts numeric(18,8);
declare variable top numeric(18,8);
declare variable percentual_ir numeric(18,8);
declare variable fator_setup integer;
declare variable data_despesa1 timestamp;
declare variable data_despesa2 timestamp;
declare variable new_var integer;
declare variable valor_conta numeric(18,8);
declare variable n_produto integer;
declare variable l_produto integer;
declare variable ano0 integer;
declare variable mes0 integer;
declare variable valor_frete numeric(18,4);
declare variable margem numeric(18,8);
declare variable nfs_controle varchar(1000);
declare variable custo_frete_rateado numeric(18,4);
declare variable valor_frete2 numeric(18,2);
declare variable tipo_frete integer;
declare variable quantidade_nota numeric(18,8);
declare variable perc_frete numeric(18,8);
declare variable cont_frete integer;
declare variable moeda varchar(3);
declare variable taxa_dolar numeric(15,4);
declare variable calculo_frete varchar(1000);
declare variable tipo_frete3 integer;
declare variable tipo_calculo integer;
Begin

end;

CREATE OR ALTER procedure spu_custo_minuto (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
declare variable nivel integer;
declare variable tamanho integer;
declare variable tratar integer;
Begin

end;


CREATE OR ALTER procedure spu_modelos_perdas (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
Begin

end;

CREATE OR ALTER procedure spu_pedido_margem_contrib_v2 (
    familia_id integer,
    data_1 date,
    data_2 date,
    meses integer,
    imodelo_id integer = 0,
    tipo_calculo integer = 0)
as
declare variable cliente_id integer;
declare variable data date;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable est_min char(1);
declare variable quantidade numeric(15,4);
declare variable ano integer;
declare variable mes integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable c numeric(18,8);
declare variable co numeric(18,8);
declare variable cs numeric(18,8);
declare variable cip numeric(18,8);
declare variable cia numeric(18,8);
declare variable perda numeric(18,8);
declare variable tributos decimal(15,4);
declare variable frete numeric(15,4);
declare variable comissao numeric(15,4);
declare variable preco_venda numeric(15,4);
declare variable preco_venda2 numeric(15,4);
declare variable contas numeric(18,4);
declare variable gp_id varchar(10);
declare variable perfil_up varchar(10);
declare variable minutos integer;
declare variable faturamento_familia numeric(18,4);
declare variable mercado integer;
declare variable ts numeric(18,8);
declare variable top numeric(18,8);
declare variable percentual_ir numeric(18,8);
declare variable fator_setup integer;
declare variable data_despesa1 timestamp;
declare variable data_despesa2 timestamp;
declare variable new_var integer;
declare variable valor_conta numeric(18,8);
declare variable n_produto integer;
declare variable l_produto integer;
declare variable ano0 integer;
declare variable mes0 integer;
declare variable valor_frete numeric(18,4);
declare variable margem numeric(18,8);
declare variable nfs_controle varchar(1000);
declare variable custo_frete_rateado numeric(18,4);
declare variable valor_frete2 numeric(18,2);
declare variable tipo_frete integer;
declare variable quantidade_nota numeric(18,8);
declare variable perc_frete numeric(18,8);
declare variable cont_frete integer;
declare variable moeda varchar(3);
declare variable taxa_dolar numeric(15,4);
declare variable calculo_frete varchar(1000);
declare variable tipo_frete3 integer;
declare variable percentual_contas numeric(15,2);
declare variable old_contas numeric(18,4);
Begin

end;

CREATE OR ALTER procedure spu_pedido_margem_contrib_v3 (
    familia_id integer,
    data_1 date,
    data_2 date,
    meses integer,
    imodelo_id integer = 0,
    tipo_calculo integer = 0)
as
declare variable cliente_id integer;
declare variable data date;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable est_min char(1);
declare variable quantidade numeric(15,4);
declare variable ano integer;
declare variable mes integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable c numeric(18,8);
declare variable co numeric(18,8);
declare variable cs numeric(18,8);
declare variable cip numeric(18,8);
declare variable cia numeric(18,8);
declare variable perda numeric(18,8);
declare variable tributos decimal(15,4);
declare variable frete numeric(15,4);
declare variable comissao numeric(15,4);
declare variable preco_venda numeric(15,4);
declare variable contas numeric(18,4);
declare variable gp_id varchar(10);
declare variable perfil_up varchar(10);
declare variable minutos integer;
declare variable faturamento_familia numeric(18,4);
declare variable mercado integer;
declare variable ts numeric(18,8);
declare variable top numeric(18,8);
declare variable percentual_ir numeric(18,8);
declare variable fator_setup integer;
declare variable data_despesa1 timestamp;
declare variable data_despesa2 timestamp;
declare variable new_var integer;
declare variable valor_conta numeric(18,8);
declare variable n_produto integer;
declare variable l_produto integer;
declare variable ano0 integer;
declare variable mes0 integer;
declare variable valor_frete numeric(18,4);
declare variable margem numeric(18,8);
declare variable nfs_controle varchar(1000);
declare variable custo_frete_rateado numeric(18,4);
declare variable valor_frete2 numeric(18,2);
declare variable tipo_frete integer;
declare variable quantidade_nota numeric(18,8);
declare variable perc_frete numeric(18,8);
declare variable cont_frete integer;
Begin

end;


CREATE OR ALTER procedure spu_tempomedio_modelos (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
Begin

end;

CREATE OR ALTER procedure spu_tempomedio_modelos2 (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
Begin

end;

CREATE OR ALTER procedure spu_tempomedio_modelos3 (
    estabelecimento_id integer,
    data date)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
Begin


end;

CREATE OR ALTER procedure spu_tempomedio_modelos_v2 (
    estabelecimento_id integer,
    data date,
    imodelo_id integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
declare variable tipo integer;
declare variable linha_id integer;
Begin

end;

CREATE OR ALTER procedure spu_tempomedio_produto (
    estabelecimento_id integer,
    data date,
    familia_producao integer,
    itamanho integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
declare variable nivel integer;
declare variable tamanho integer;
declare variable tratar integer;
Begin


end;

ALTER TABLE TBREGRA_CALCULO_CUSTO ADD OLD_PERFIL VARCHAR(10) DEFAULT '%';
update TBREGRA_CALCULO_CUSTO set OLD_PERFIL = PERFIL_UP;
ALTER TABLE TBREGRA_CALCULO_CUSTO DROP PERFIL_UP;
ALTER TABLE TBREGRA_CALCULO_CUSTO ADD PERFIL_UP VARCHAR(10) DEFAULT '%';
update TBREGRA_CALCULO_CUSTO set PERFIL_UP = OLD_PERFIL;
ALTER TABLE TBREGRA_CALCULO_CUSTO DROP OLD_PERFIL;

CREATE OR ALTER procedure spu_tempomedio_produto (
    estabelecimento_id integer,
    data date,
    familia_producao integer,
    itamanho integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
declare variable nivel integer;
declare variable tamanho integer;
declare variable tratar integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);

  UPDATE tmpcusto_produto SET
    "TO"          = 0,
    TS            = 0,
    PERDA         = 0,
    CUSTO_MINUTO  = 0,
    MOI_PROPRIO   = 0,
    MOI_ABSORVIDO = 0
  WHERE MES = :MES AND ANO = :ANO;

  FOR
  Select FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
         CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
         REMESSAS_DEFEITO, count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    From TBREGRA_CALCULO_CUSTO h
   Where FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
     and Status = '1'
     --and h.familia_id = 3
  Order By Sequencia
  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

             PERCENTUAL_PERDA = 0;

             --Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             --From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             --INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;

             Select
                CUSTO_MINUTO,
                MOI_PROPRIO,
                MOI_ABSORVIDO,
                ESTACOES,
                MINUTOS_DIA,
                MINUTOS_NOITE,
                MINUTOS_TOTAL
             From tbcusto_minuto m
                where m.ccusto = :vCCUSTO
                and m.ano = :ANO
                and m.mes = :MES

             INTO :CUSTO_MINUTO,
                  :MOI_PROPRIO,
                  :MOI_ABSORVIDO,
                  :vestacoes,
                  :vtotal_minutos_dia,
                  :vtotal_minutos_noite,
                  :vtotal_minutos;
        
              --Custo Operacional por Minuto
              --CUSTO_MINUTO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos_dia,:vCCUSTO);       -- MAO DE OBRA DIRETA
              --MOI_PROPRIO   = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              --MOI_ABSORVIDO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)

              For
                  select
                    *
                  from(
                    select
                        j.nivel,
                        j.tamanho_consumo,
                        p.modelo_codigo,
                        p.cor_codigo,
                        j.produto_consumo,
                        count(p.codigo) over() as N_PRODUTO,
                        row_number() over() as L_PRODUTO,
                        coalesce((select count(e.produto_consumo) from tmpcusto_produto e where e.produto_consumo = j.produto_consumo and e.nivel < j.nivel and e.ano = :ano and e.mes = :mes),0) AS TRATAR
                    from tmpcusto_produto j,  tbproduto p
                    where j.produto_consumo = p.codigo
                    and p.familia_codigo = :vFAMILIA_ID
                    and j.ano = :ano
                    and j.mes = :mes
                    and j.flag_tamanho = :ITAMANHO
                  ) where TRATAR = 0

              Into :nivel, :TAMANHO, :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO , :TRATAR
              do Begin

                 UPDATE tmpcusto_produto SET CUSTO_MINUTO = coalesce(:CUSTO_MINUTO,0), MOI_PROPRIO = coalesce(:MOI_PROPRIO,0), MOI_ABSORVIDO = coalesce(:MOI_ABSORVIDO,0) WHERE MES = :MES AND ANO = :ANO AND PRODUTO_CONSUMO = :PRODUTO_ID and NIVEL = :NIVEL;

                 if (:vREMESSAS_DEFEITO > 0) then
                      Begin
                      PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT(:Modelo_Id, :Cor_Id, :TAMANHO, 0, 3, '1')),0);
                      End

                 Delete from Tmp22040 Where True;
                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :TAMANHO, 1);
                 if (:vCALCULO_REBOBINAMENTO = '1') then
                     Begin
                     INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :TAMANHO, 0);
                     End

                SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;

                UPDATE tmpcusto_produto SET "TO" = :TOTALPROCESSO, TS = :TOTALSETUP, PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_CONSUMO = :PRODUTO_ID and NIVEL = :NIVEL;

                 if (:vUP_PADRAO2 > 0) then
                     Begin

                     Delete from Tmp22040 Where True;
                     INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :TAMANHO, 1);
                     if (:vCALCULO_REBOBINAMENTO = '1') then
                         Begin
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :TAMANHO, 0);
                         End
            
                         SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;

                         UPDATE tmpcusto_produto SET "TO" = "TO" + :TOTALPROCESSO, TS = TS + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_CONSUMO = :PRODUTO_ID and NIVEL = :NIVEL;
                     End

                 if (:vCALCULO_CONFORMACAO = '1') then
                     Begin

                         SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :TAMANHO, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                         UPDATE tmpcusto_produto SET "TO" = "TO" + :TOTALPROCESSO, TS = TS + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_CONSUMO = :PRODUTO_ID and NIVEL = :NIVEL;

                     END

               END
       END
END;


CREATE OR ALTER procedure spu_tempomedio_modelos_v2 (
    estabelecimento_id integer,
    data date,
    imodelo_id integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
declare variable tipo integer;
declare variable linha_id integer;
Begin

  MES  = EXTRACT(MONTH FROM :DATA);
  ANO  = EXTRACT(YEAR  FROM :DATA);

  DATA = fn_end_of_month(DATA);

  DELETE FROM TBFICHA_TEMPO WHERE MES = :MES AND ANO = :ANO and iif(:IMODELO_ID > 0, modelo_id = :IMODELO_ID, true);

  --DELETE FROM TBFICHA_TEMPO pm WHERE pm.MES = :MES AND pm.ANO = :ANO and pm.produto_id in (
  --  select p.codigo from tbproduto p where p.familia_codigo = 133
  --);

  delete from tblog_procedure h where h.tabela = 'MODELOS - '||:DATA;

  FOR
    SELECT
        FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
        CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR, REMESSAS_DEFEITO,
        Count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    FROM (
        Select DISTINCT FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
                 CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
                 REMESSAS_DEFEITO
            From TBREGRA_CALCULO_CUSTO h
           Where Status = '1'
           and iif(:IMODELO_ID > 0, h.familia_id = (select m.familia_codigo from tbmodelo m where m.codigo = :IMODELO_ID), true)
          Order By ID
    ) A

  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

        --in autonomous transaction do
        --begin

             PERCENTUAL_PERDA = 0;

             Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;
        
              --Custo Operacional por Minuto
              CUSTO_MINUTO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos_dia,:vCCUSTO);       -- MAO DE OBRA DIRETA
              MOI_PROPRIO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              MOI_ABSORVIDO= FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)
        
              For   select * from
                    (select
                         a.*
                     from SPC_PRODUTOS_CUSTO_V2(:vFamilia_id, :ANO, :MES, :IMODELO_ID) a) where iif(:IMODELO_ID > 0, modelo_id = :IMODELO_ID, true)
              Into :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO, :linha_id
              do Begin

              --in autonomous transaction do
              --begin

                 if(vFATOR > 1)then
                 begin
                    vFATOR = fn_parametro('TBMODELO_LINHA.FATOR_CONVERSAO', linha_id);
                 end

                 execute procedure SPU_LOG_PROCEDURE( 'MODELOS - '||:DATA, 'Tratando Familia:'||:L_FAMILIA||'/'||:N_FAMILIA||'  Produto:'||:L_PRODUTO||'/'||:N_PRODUTO);

                 INSERT INTO TBFICHA_TEMPO (MES, ANO, MODELO_ID, COR_ID, PRODUTO_ID, TO00, TS00, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO) Values
                 (:MES, :ANO, :MODELO_ID, :COR_ID, :PRODUTO_ID, 0, 0, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                              PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT
                                                          (:Modelo_Id, :Cor_Id, :Tam, 0, :vREMESSAS_DEFEITO, '1')),0);
                              End

                         Delete from Tmp22040 Where True;
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
                         if (:vCALCULO_REBOBINAMENTO = '1') then
                             Begin
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :Tam, 0);
                             End
    
                             SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO(1) INTO :TOTALPROCESSO, :TOTALSETUP;
        
                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = :TOTALPROCESSO, TS00 = :TOTALSETUP, PERDA00 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = :TOTALPROCESSO, TS01 = :TOTALSETUP, PERDA01 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = :TOTALPROCESSO, TS02 = :TOTALSETUP, PERDA02 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = :TOTALPROCESSO, TS03 = :TOTALSETUP, PERDA03 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = :TOTALPROCESSO, TS04 = :TOTALSETUP, PERDA04 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = :TOTALPROCESSO, TS05 = :TOTALSETUP, PERDA05 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = :TOTALPROCESSO, TS06 = :TOTALSETUP, PERDA06 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = :TOTALPROCESSO, TS07 = :TOTALSETUP, PERDA07 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = :TOTALPROCESSO, TS08 = :TOTALSETUP, PERDA08 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = :TOTALPROCESSO, TS09 = :TOTALSETUP, PERDA09 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = :TOTALPROCESSO, TS10 = :TOTALSETUP, PERDA10 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = :TOTALPROCESSO, TS11 = :TOTALSETUP, PERDA11 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = :TOTALPROCESSO, TS12 = :TOTALSETUP, PERDA12 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = :TOTALPROCESSO, TS13 = :TOTALSETUP, PERDA13 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = :TOTALPROCESSO, TS14 = :TOTALSETUP, PERDA14 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = :TOTALPROCESSO, TS15 = :TOTALSETUP, PERDA15 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = :TOTALPROCESSO, TS16 = :TOTALSETUP, PERDA16 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = :TOTALPROCESSO, TS17 = :TOTALSETUP, PERDA17 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = :TOTALPROCESSO, TS18 = :TOTALSETUP, PERDA18 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = :TOTALPROCESSO, TS19 = :TOTALSETUP, PERDA19 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = :TOTALPROCESSO, TS20 = :TOTALSETUP, PERDA20 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                         if (:vUP_PADRAO2 > 0) then
                             Begin

                             Delete from Tmp22040 Where True;
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
                             if (:vCALCULO_REBOBINAMENTO = '1') then
                                 Begin
                                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :Tam, 0);
                                 End
                    
                                 SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO(1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End
                             End
    
                         if (:vCALCULO_CONFORMACAO = '1') then
                             Begin

                                 SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                             END
                        END
                  --END
           END
     END
END;

CREATE OR ALTER procedure spu_tempomedio_modelos3 (
    estabelecimento_id integer,
    data date)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);

  delete from tblog_procedure h where h.tabela = 'MODELOS - '||:DATA;

  FOR
  SELECT FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
    CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR, REMESSAS_DEFEITO,
    Count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    FROM (
    Select DISTINCT  FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
             CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
             REMESSAS_DEFEITO
        From TBREGRA_CALCULO_CUSTO h
       Where Status = '1'
       --AND FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
       and h.familia_id = 133
      Order By ID
    ) A

  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

             PERCENTUAL_PERDA = 0;

             Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;
        
              --Custo Operacional por Minuto
              CUSTO_MINUTO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos_dia,:vCCUSTO);       -- MAO DE OBRA DIRETA
              MOI_PROPRIO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              MOI_ABSORVIDO= FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)
        
              For
