CREATE TABLE TBTEMP_AJUSTE (
    TABELA                VARCHAR(20) NOT NULL,
    ID                    varchar(10) NOT NULL,
    DESCRICAO             VARCHAR(20),
    CAP_PRODUTIVA         NUMERIC(15,4) DEFAULT 0,
    LOCALIZACAO_ID        INTEGER DEFAULT 0,
    TRATAMENTO_PEDIDO_MP  CHAR(1) DEFAULT 0,
    CONTROLE              INTEGER DEFAULT 0,
    DESCRICAO_COMPLETA    VARCHAR(100) DEFAULT '',
    QTD_MIN               INTEGER DEFAULT 0,
    QTD_MULT              INTEGER DEFAULT 0,
    QTD_TIPO              CHAR(1) DEFAULT '',
    AGRUPAMENTO           VARCHAR(10),
    EFIC_MINIMA           INTEGER DEFAULT 100,
    PONTO_REPOSICAO       INTEGER DEFAULT 0,
    FAMILIA_ID            INTEGER DEFAULT 0,
    COR_DIFERENCIADA      INTEGER DEFAULT 0,
    COR_SOBENCOMENDA      INTEGER DEFAULT 0,
    QTD_MIN_SOBENC        INTEGER DEFAULT 0,
    QTD_MULT_SOBENC       INTEGER DEFAULT 0,
    PZO1_PED_D1           INTEGER DEFAULT 0,
    PZO1_PED_D2           INTEGER DEFAULT 0,
    PZO1_PED_D3           INTEGER DEFAULT 0,
    PZO1_PED_D4           INTEGER DEFAULT 0,
    PZO1_PED_D5           INTEGER DEFAULT 0,
    PZO1_PED_D6           INTEGER DEFAULT 0,
    PZO1_PED_D7           INTEGER DEFAULT 0,
    PZO2_PED_D1           INTEGER DEFAULT 0,
    PZO2_PED_D2           INTEGER DEFAULT 0,
    PZO2_PED_D3           INTEGER DEFAULT 0,
    PZO2_PED_D4           INTEGER DEFAULT 0,
    PZO2_PED_D5           INTEGER DEFAULT 0,
    PZO2_PED_D6           INTEGER DEFAULT 0,
    PZO2_PED_D7           INTEGER DEFAULT 0,
    PZOD1_PED_D1          INTEGER DEFAULT 0,
    PZOD1_PED_D2          INTEGER DEFAULT 0,
    PZOD1_PED_D3          INTEGER DEFAULT 0,
    PZOD1_PED_D4          INTEGER DEFAULT 0,
    PZOD1_PED_D5          INTEGER DEFAULT 0,
    PZOD1_PED_D6          INTEGER DEFAULT 0,
    PZOD1_PED_D7          INTEGER DEFAULT 0,
    PZOD2_PED_D1          INTEGER DEFAULT 0,
    PZOD2_PED_D2          INTEGER DEFAULT 0,
    PZOD2_PED_D3          INTEGER DEFAULT 0,
    PZOD2_PED_D4          INTEGER DEFAULT 0,
    PZOD2_PED_D5          INTEGER DEFAULT 0,
    PZOD2_PED_D6          INTEGER DEFAULT 0,
    PZOD2_PED_D7          INTEGER DEFAULT 0,
    PZOS1_PED_D1          INTEGER DEFAULT 0,
    PZOS1_PED_D2          INTEGER DEFAULT 0,
    PZOS1_PED_D3          INTEGER DEFAULT 0,
    PZOS1_PED_D4          INTEGER DEFAULT 0,
    PZOS1_PED_D5          INTEGER DEFAULT 0,
    PZOS1_PED_D6          INTEGER DEFAULT 0,
    PZOS1_PED_D7          INTEGER DEFAULT 0,
    PZOS2_PED_D1          INTEGER DEFAULT 0,
    PZOS2_PED_D2          INTEGER DEFAULT 0,
    PZOS2_PED_D3          INTEGER DEFAULT 0,
    PZOS2_PED_D4          INTEGER DEFAULT 0,
    PZOS2_PED_D5          INTEGER DEFAULT 0,
    PZOS2_PED_D6          INTEGER DEFAULT 0,
    PZOS2_PED_D7          INTEGER DEFAULT 0,
    TRATAMENTO_PEDIDO     CHAR(1) DEFAULT '2',
    AGRUPAMENTO2          VARCHAR(10) DEFAULT '',
    PZOE1_PED_D1          INTEGER DEFAULT 0,
    PZOE1_PED_D2          INTEGER DEFAULT 0,
    PZOE1_PED_D3          INTEGER DEFAULT 0,
    PZOE1_PED_D4          INTEGER DEFAULT 0,
    PZOE1_PED_D5          INTEGER DEFAULT 0,
    PZOE1_PED_D6          INTEGER DEFAULT 0,
    PZOE1_PED_D7          INTEGER DEFAULT 0,
    PZOE2_PED_D1          INTEGER DEFAULT 0,
    PZOE2_PED_D2          INTEGER DEFAULT 0,
    PZOE2_PED_D3          INTEGER DEFAULT 0,
    PZOE2_PED_D4          INTEGER DEFAULT 0,
    PZOE2_PED_D5          INTEGER DEFAULT 0,
    PZOE2_PED_D6          INTEGER DEFAULT 0,
    PZOE2_PED_D7          INTEGER DEFAULT 0,
    EFIC_A                NUMERIC(15,4) DEFAULT 0,
    EFIC_B                NUMERIC(15,4) DEFAULT 0,
    PERDA_A               NUMERIC(15,4) DEFAULT 0,
    PERDA_B               NUMERIC(15,4) DEFAULT 0,
    ENDERECAMENTO_SOBRA   VARCHAR(3) DEFAULT 'MCT',
    TIPO_REPOSICAO        CHAR(1) DEFAULT '1',
    COR_BASICA            INTEGER DEFAULT 0,
    PZOI1_PED_D1          INTEGER DEFAULT 0,
    PZOI1_PED_D2          INTEGER DEFAULT 0,
    PZOI1_PED_D3          INTEGER DEFAULT 0,
    PZOI1_PED_D4          INTEGER DEFAULT 0,
    PZOI1_PED_D5          INTEGER DEFAULT 0,
    PZOI1_PED_D6          INTEGER DEFAULT 0,
    PZOI1_PED_D7          INTEGER DEFAULT 0,
    PZOI2_PED_D1          INTEGER DEFAULT 0,
    PZOI2_PED_D2          INTEGER DEFAULT 0,
    PZOI2_PED_D3          INTEGER DEFAULT 0,
    PZOI2_PED_D4          INTEGER DEFAULT 0,
    PZOI2_PED_D5          INTEGER DEFAULT 0,
    PZOI2_PED_D6          INTEGER DEFAULT 0,
    PZOI2_PED_D7          INTEGER DEFAULT 0,
    ALOCAR_MULTIPLO       CHAR(1) DEFAULT '0',
    TELA_ADD_PEDIDO       INTEGER DEFAULT 1,
    AMOSTRA               INTEGER DEFAULT 0,
    FAMILIA_PEDIDO        INTEGER DEFAULT 0
);

insert into TBTEMP_AJUSTE
select
    *
FROM TBPERFIL;

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(10),
    perfil_cor char(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,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
BEGIN

END;

CREATE OR ALTER procedure spu_trata_ped_item_estoque3 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    modelo_codigo integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    qtd_mult integer,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
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 char(10),
    perfil_cor char(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_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 char(10),
    perfil_cor char(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_estoque4 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    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_sobra_bojo (
    i_id integer,
    estabelecimento_id integer,
    gp_id integer,
    remessa_id integer,
    produto_id integer,
    tamanho integer,
    quantidade numeric(15,4),
    operador_id integer,
    data date = null,
    hora varchar(5) = null)
returns (
    id integer,
    enderecamento varchar(100))
as
declare variable familia_id integer;
declare variable enderecamento_id integer;
declare variable localizacao_id integer;
declare variable grupo varchar(10);
declare variable subgrupo varchar(10);
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable perfil_enderecamento_sobra varchar(12);
declare variable enderecamento_localizacao_id integer;
BEGIN

END;

CREATE OR ALTER procedure 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 char(10);
declare variable perfil_cor char(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_indicador3 (
    pestabelecimento_1 integer,
    pdata1 date,
    pdata2 date,
    flag_1 integer,
    tipo_1 integer,
    gp_id_1 varchar(3000))
returns (
    vquant integer,
    vefic_a numeric(10,4),
    vefic_b numeric(10,4),
    vperda_a numeric(10,4),
    vperda_b numeric(10,4))
as
declare variable vgp_id integer;
BEGIN

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

end;


CREATE OR ALTER procedure spc_producao_conformacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(500),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    perdas_perc numeric(15,2),
    eficiencia numeric(15,2),
    setup_previsto numeric(15,2),
    setup_realizado numeric(15,2),
    cor_efic integer,
    justificativa varchar(1000),
    programacao_id integer,
    requisicao_id integer,
    gp_id integer,
    gp_descricao varchar(500),
    up_id integer,
    up_descricao varchar(500),
    estacao integer,
    estacao_descricao varchar(500),
    remessa integer,
    remessa_id integer,
    remessa_data date,
    remessa_talao_id integer,
    talao_id integer,
    produto_id integer,
    produto_descricao varchar(500),
    modelo_id integer,
    modelo_descricao varchar(500),
    cor_id integer,
    cor_descricao varchar(500),
    tamanho integer,
    tamanho_descricao varchar(500),
    quantidade numeric(15,2),
    um varchar(500),
    ferramenta_id integer,
    ferramenta_descicao varchar(500),
    datahora_realizado_inicio varchar(20),
    datahora_realizado_fim varchar(20),
    tempo_previsto numeric(15,2),
    tempo_realizado numeric(15,2),
    tempo_previsto_operacional numeric(15,2),
    tempo_previsto_ferramenta numeric(15,2),
    tempo_previsto_aquecimento numeric(15,2),
    tempo_previsto_aprovacao numeric(15,2),
    tempo_realizado_operacional numeric(15,2),
    tempo_realizado_ferramenta numeric(15,2),
    tempo_realizado_aquecimento numeric(15,2),
    tempo_realizado_aprovacao numeric(15,2),
    perfil_sku varchar(10),
    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

   suspend;

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 trigger ttbesteira_b0iu_01 for tbesteira
active before insert or update position 0
AS
DECLARE VARIABLE ID INTEGER;
begin

end;

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

end;

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

end;

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

End;

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

End;

CREATE OR ALTER trigger 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;

DROP TRIGGER TTBPEFIL_B0I_01;
DROP TRIGGER TTBPERFIL_B9U;
DROP TRIGGER TTBPERFIL_999;
DROP VIEW VWESTOQUE_TRANSACAO_REGRA;
DROP VIEW VWREGISTRO_DEFEITO_DIA;
DROP VIEW VWREGISTRO_PRODUCAO_DIA;
DROP TABLE TBPERFIL;

CREATE TABLE TBPERFIL (
    TABELA                VARCHAR(20) NOT NULL,
    ID                    varchar(10) NOT NULL,
    DESCRICAO             VARCHAR(20),
    CAP_PRODUTIVA         NUMERIC(15,4) DEFAULT 0,
    LOCALIZACAO_ID        INTEGER DEFAULT 0,
    TRATAMENTO_PEDIDO_MP  CHAR(1) DEFAULT 0,
    CONTROLE              INTEGER DEFAULT 0,
    DESCRICAO_COMPLETA    VARCHAR(100) DEFAULT '',
    QTD_MIN               INTEGER DEFAULT 0,
    QTD_MULT              INTEGER DEFAULT 0,
    QTD_TIPO              CHAR(1) DEFAULT '',
    AGRUPAMENTO           VARCHAR(10),
    EFIC_MINIMA           INTEGER DEFAULT 100,
    PONTO_REPOSICAO       INTEGER DEFAULT 0,
    FAMILIA_ID            INTEGER DEFAULT 0,
    COR_DIFERENCIADA      INTEGER DEFAULT 0,
    COR_SOBENCOMENDA      INTEGER DEFAULT 0,
    QTD_MIN_SOBENC        INTEGER DEFAULT 0,
    QTD_MULT_SOBENC       INTEGER DEFAULT 0,
    PZO1_PED_D1           INTEGER DEFAULT 0,
    PZO1_PED_D2           INTEGER DEFAULT 0,
    PZO1_PED_D3           INTEGER DEFAULT 0,
    PZO1_PED_D4           INTEGER DEFAULT 0,
    PZO1_PED_D5           INTEGER DEFAULT 0,
    PZO1_PED_D6           INTEGER DEFAULT 0,
    PZO1_PED_D7           INTEGER DEFAULT 0,
    PZO2_PED_D1           INTEGER DEFAULT 0,
    PZO2_PED_D2           INTEGER DEFAULT 0,
    PZO2_PED_D3           INTEGER DEFAULT 0,
    PZO2_PED_D4           INTEGER DEFAULT 0,
    PZO2_PED_D5           INTEGER DEFAULT 0,
    PZO2_PED_D6           INTEGER DEFAULT 0,
    PZO2_PED_D7           INTEGER DEFAULT 0,
    PZOD1_PED_D1          INTEGER DEFAULT 0,
    PZOD1_PED_D2          INTEGER DEFAULT 0,
    PZOD1_PED_D3          INTEGER DEFAULT 0,
    PZOD1_PED_D4          INTEGER DEFAULT 0,
    PZOD1_PED_D5          INTEGER DEFAULT 0,
    PZOD1_PED_D6          INTEGER DEFAULT 0,
    PZOD1_PED_D7          INTEGER DEFAULT 0,
    PZOD2_PED_D1          INTEGER DEFAULT 0,
    PZOD2_PED_D2          INTEGER DEFAULT 0,
    PZOD2_PED_D3          INTEGER DEFAULT 0,
    PZOD2_PED_D4          INTEGER DEFAULT 0,
    PZOD2_PED_D5          INTEGER DEFAULT 0,
    PZOD2_PED_D6          INTEGER DEFAULT 0,
    PZOD2_PED_D7          INTEGER DEFAULT 0,
    PZOS1_PED_D1          INTEGER DEFAULT 0,
    PZOS1_PED_D2          INTEGER DEFAULT 0,
    PZOS1_PED_D3          INTEGER DEFAULT 0,
    PZOS1_PED_D4          INTEGER DEFAULT 0,
    PZOS1_PED_D5          INTEGER DEFAULT 0,
    PZOS1_PED_D6          INTEGER DEFAULT 0,
    PZOS1_PED_D7          INTEGER DEFAULT 0,
    PZOS2_PED_D1          INTEGER DEFAULT 0,
    PZOS2_PED_D2          INTEGER DEFAULT 0,
    PZOS2_PED_D3          INTEGER DEFAULT 0,
    PZOS2_PED_D4          INTEGER DEFAULT 0,
    PZOS2_PED_D5          INTEGER DEFAULT 0,
    PZOS2_PED_D6          INTEGER DEFAULT 0,
    PZOS2_PED_D7          INTEGER DEFAULT 0,
    TRATAMENTO_PEDIDO     CHAR(1) DEFAULT '2',
    AGRUPAMENTO2          VARCHAR(10) DEFAULT '',
    PZOE1_PED_D1          INTEGER DEFAULT 0,
    PZOE1_PED_D2          INTEGER DEFAULT 0,
    PZOE1_PED_D3          INTEGER DEFAULT 0,
    PZOE1_PED_D4          INTEGER DEFAULT 0,
    PZOE1_PED_D5          INTEGER DEFAULT 0,
    PZOE1_PED_D6          INTEGER DEFAULT 0,
    PZOE1_PED_D7          INTEGER DEFAULT 0,
    PZOE2_PED_D1          INTEGER DEFAULT 0,
    PZOE2_PED_D2          INTEGER DEFAULT 0,
    PZOE2_PED_D3          INTEGER DEFAULT 0,
    PZOE2_PED_D4          INTEGER DEFAULT 0,
    PZOE2_PED_D5          INTEGER DEFAULT 0,
    PZOE2_PED_D6          INTEGER DEFAULT 0,
    PZOE2_PED_D7          INTEGER DEFAULT 0,
    EFIC_A                NUMERIC(15,4) DEFAULT 0,
    EFIC_B                NUMERIC(15,4) DEFAULT 0,
    PERDA_A               NUMERIC(15,4) DEFAULT 0,
    PERDA_B               NUMERIC(15,4) DEFAULT 0,
    ENDERECAMENTO_SOBRA   VARCHAR(3) DEFAULT 'MCT',
    TIPO_REPOSICAO        CHAR(1) DEFAULT '1',
    COR_BASICA            INTEGER DEFAULT 0,
    PZOI1_PED_D1          INTEGER DEFAULT 0,
    PZOI1_PED_D2          INTEGER DEFAULT 0,
    PZOI1_PED_D3          INTEGER DEFAULT 0,
    PZOI1_PED_D4          INTEGER DEFAULT 0,
    PZOI1_PED_D5          INTEGER DEFAULT 0,
    PZOI1_PED_D6          INTEGER DEFAULT 0,
    PZOI1_PED_D7          INTEGER DEFAULT 0,
    PZOI2_PED_D1          INTEGER DEFAULT 0,
    PZOI2_PED_D2          INTEGER DEFAULT 0,
    PZOI2_PED_D3          INTEGER DEFAULT 0,
    PZOI2_PED_D4          INTEGER DEFAULT 0,
    PZOI2_PED_D5          INTEGER DEFAULT 0,
    PZOI2_PED_D6          INTEGER DEFAULT 0,
    PZOI2_PED_D7          INTEGER DEFAULT 0,
    ALOCAR_MULTIPLO       CHAR(1) DEFAULT '0',
    TELA_ADD_PEDIDO       INTEGER DEFAULT 1,
    AMOSTRA               INTEGER DEFAULT 0,
    FAMILIA_PEDIDO        INTEGER DEFAULT 0
);

ALTER TABLE TBPERFIL ADD PRIMARY KEY (TABELA, ID);

insert into TBPERFIL
select
    *
FROM TBTEMP_AJUSTE;

DROP TABLE TBTEMP_AJUSTE;

CREATE OR ALTER TRIGGER TTBPEFIL_B0I_01 FOR TBPERFIL
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.CONTROLE IS NULL) THEN
    NEW.CONTROLE = GEN_ID(GTBPERFIL,1);
END;

CREATE OR ALTER TRIGGER TTBPERFIL_999 FOR TBPERFIL
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 999
AS
begin

  update tbreplica_tabela set Status = '0'
  Where tabela = 'TBPERFIL'
    and Status = '1';

end;

CREATE OR ALTER TRIGGER TTBPERFIL_B9U FOR TBPERFIL
ACTIVE BEFORE UPDATE POSITION 9
AS
begin

   if (OLD.CONTROLE <> NEW.CONTROLE) then
       BEGIN
       Exception "..." 'INCLUSAO NAO PERMITIDA, JA HA OUTRO PERFIL COM O CODIGO INFORMADO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
       END
 

end;

COMMENT ON COLUMN TBPERFIL.TELA_ADD_PEDIDO IS
'identifica qual a tela para inserir itens no pedido';

COMMENT ON COLUMN TBPERFIL.AMOSTRA IS
'1 - perfil de amostra
0 - nao';

COMMENT ON COLUMN TBPERFIL.FAMILIA_PEDIDO IS
'grava familia no pedido?
1 - sim
0 - Nao';

CREATE OR ALTER VIEW VWESTOQUE_TRANSACAO_REGRA(
    ID,
    REGRA_TIPO,
    REGRA_DESCRICAO_COMPLETA,
    REGRA_DESCRICAO_RESUMO,
    GP_ID,
    GP_DESCRICAO,
    PERFIL_UP,
    PERFIL_UP_DESCRICAO,
    FAMILIA_ID,
    FAMILIA_DESCRICAO,
    OPERACAO_SAIDA,
    OPERACAO_SAIDA_DESCRICAO,
    OPERACAO_ESTOQUE_ENTRADA,
    OPERACAO_ENTRADA_DESCRICAO,
    LOCALIZACAO_ID_SAIDA,
    LOCALIZACAO_SAIDA_DESCRICAO,
    LOCALIZACAO_ID_ENTRADA,
    LOCALIZACAO_ENTRADA_DESCRICAO,
    CONFERENCIA,
    CONFERENCIA_DESCRICAO,
    STATUS)
AS
SELECT
    R.ID,
    R.TIPO REGRA_TIPO,
    CASE R.TIPO
    WHEN 1 THEN 'WEB15080 - KANBAN ELETRÔNICO'
    WHEN 2 THEN 'WEB15070 - TRANSAÇÕES DE CONSUMOS DE REMESSAS'
    WHEN 3 THEN 'CONSUMO DE PRODUÇÃO (TBREMESSA_CONSUMO)'
    WHEN 4 THEN 'SOLICITAÇÃO DE MATERIAIS'
    WHEN 5 THEN 'PRODUÇÃO DE PRODUTOS (TBPEDIDO_ITEM_PROCESSADO)'
    ELSE '#N/D' END REGRA_DESCRICAO_COMPLETA,

    CASE R.TIPO
    WHEN 1 THEN 'KANBAN'
    WHEN 2 THEN 'DEMANDA'
    WHEN 3 THEN 'CONSUMO'
    WHEN 4 THEN 'SOLICIT.'
    WHEN 5 THEN 'PRODUÇÃO'
    ELSE '#N/D' END REGRA_DESCRICAO_RESUMO,

    R.GP_ID,

    (SELECT FIRST 1 DESCRICAO
       FROM TBGP G
      WHERE G.ID = R.GP_ID) GP_DESCRICAO,

    R.PERFIL_UP,

    (SELECT FIRST 1 P.DESCRICAO
       FROM TBPERFIL P
      WHERE P.TABELA = 'UP'
        AND P.ID     = R.PERFIL_UP) PERFIL_UP_DESCRICAO,

    R.FAMILIA_ID,

    (SELECT FIRST 1 DESCRICAO
       FROM TBFAMILIA F
      WHERE F.CODIGO = R.FAMILIA_ID) FAMILIA_DESCRICAO,

    R.OPERACAO_ESTOQUE_SAIDA OPERACAO_SAIDA,

    (SELECT FIRST 1 DESCRICAO
       FROM TBOPERACAO
      WHERE CODIGO = R.OPERACAO_ESTOQUE_SAIDA) OPERACAO_SAIDA_DESCRICAO,

    R.OPERACAO_ESTOQUE_ENTRADA,
    
    (SELECT FIRST 1 DESCRICAO
       FROM TBOPERACAO
      WHERE CODIGO = R.OPERACAO_ESTOQUE_ENTRADA) OPERACAO_ENTRADA_DESCRICAO,

                 
    R.LOCALIZACAO_ID_SAIDA,

    IIF (R.LOCALIZACAO_ID_SAIDA BETWEEN 0000 AND 1000,'LOCALIZACAÇÃO CONFIGURADA NA REGRA',
    IIF (R.LOCALIZACAO_ID_SAIDA       = 1001,         'LOCALIZACAO PADRAO DO FAMILIA DO PRODUTO',
    IIF (R.LOCALIZACAO_ID_SAIDA       = 1002,         'LOCALIZACAO PADRAO DO PRODUTO',
    IIF (R.LOCALIZACAO_ID_SAIDA       = 1003,         'LOCALIZACAO DO CADASTRO DE ESTOQUE MINIMO DO PRODUTO (GC5075)',
    IIF (R.LOCALIZACAO_ID_SAIDA       = 1004,         'LOCALIZACAO DA PECA (TBPEDIDO_ITEM_PRCESSADO.LOCALIZACAO_CODIGO / TBREVISAO.LOCALIZACAO_SAIDA)',
    IIF (R.LOCALIZACAO_ID_SAIDA BETWEEN 2000 AND 2999,'LOCALIZACAO DA FAMILIA E UNIDADE PRODUTIVA DO TIPO:' ||
        (SELECT FIRST 1 DESCRICAO FROM TBLOCALIZACAO_TIPO FT WHERE FT.ID = (R.LOCALIZACAO_ID_SAIDA - 2000)),'')))))) LOCALIZACAO_SAIDA_DESCRICAO,
                
    R.LOCALIZACAO_ID_ENTRADA,

    IIF (R.LOCALIZACAO_ID_ENTRADA BETWEEN 0000 AND 1000,'LOCALIZACAÇÃO CONFIGURADA NA REGRA',
    IIF (R.LOCALIZACAO_ID_ENTRADA       = 1001,         'LOCALIZACAO PADRAO DO FAMILIA DO PRODUTO',
    IIF (R.LOCALIZACAO_ID_ENTRADA       = 1002,         'LOCALIZACAO PADRAO DO PRODUTO',
    IIF (R.LOCALIZACAO_ID_ENTRADA       = 1003,         'LOCALIZACAO DO CADASTRO DE ESTOQUE MINIMO DO PRODUTO (GC5075)',
    IIF (R.LOCALIZACAO_ID_ENTRADA       = 1004,         'LOCALIZACAO DA PECA (TBPEDIDO_ITEM_PRCESSADO.LOCALIZACAO_CODIGO / TBREVISAO.LOCALIZACAO_SAIDA)',
    IIF (R.LOCALIZACAO_ID_ENTRADA BETWEEN 2000 AND 2999,'LOCALIZACAO DA FAMILIA E UNIDADE PRODUTIVA DO TIPO:' ||
        (SELECT FIRST 1 DESCRICAO FROM TBLOCALIZACAO_TIPO FT WHERE FT.ID = (R.LOCALIZACAO_ID_ENTRADA - 2000)),'')))))) LOCALIZACAO_ENTRADA_DESCRICAO,

    R.CONFERENCIA,

    CASE R.CONFERENCIA
    WHEN '0' THEN 'CONFERENCIA DESABILITADA'
    WHEN '1' THEN 'CONFERENCIA HABILITADA'
    END CONFERENCIA_DESCRICAO,

    r.status

FROM
    TBESTOQUE_TRANSACAO_REGRA R
;

CREATE OR ALTER VIEW VWREGISTRO_DEFEITO_DIA(
    DATA_REGISTRO,
    DEFEITO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    QUANTIDADE,
    QTD_TURNO1,
    QTD_TURNO2,
    TALOES,
    DEFEITO_SETOR,
    DEFEITO_ID,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    FAMILIA_ID,
    ESTABELECIMENTO_ID,
    TAMANHO,
    DENSIDADE,
    ESPESSURA)
AS
select

    DATA_REGISTRO,
    DEFEITO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    sum(Quantidade) as Quantidade,
    sum(QTD_TURNO1) as QTD_TURNO1,
    sum(QTD_TURNO2) as QTD_TURNO2,
    sum(TALOES) as TALOES,
    defeito_setor,
    defeito_id,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    familia_id,
    estabelecimento_id,
    tamanho,
    cast(substring(Densidade from 1  for 10) as numeric(5,2)) DENSIDADE,
    cast(substring(Densidade from 11 for 20) as numeric(5,2)) espessura

from(
    Select
        
        B.Data DATA_REGISTRO,
        d.descricao as DEFEITO,
        d.setor as SETOR,
        m.descricao as MODELO,
        p.descricao as PRODUTO,
        c.descricao as COR,
        e.descricao as GP,
        r.descricao as LINHA,
        s.descricao as PERFIL,
    
        B.Quantidade,
        IIF(B.TURNO=1,B.Quantidade,0) QTD_TURNO1,
        IIF(B.TURNO=2,B.Quantidade,0) QTD_TURNO2,
        1 as TALOES,
    
        d.setor  as defeito_setor,
        d.codigo as defeito_id,
        m.codigo as modelo_id,
        p.codigo as produto_id,
        c.codigo cor_id,
        e.codigo gp_id,
        r.codigo linha_id,
        s.id perfil_id,

        p.familia_codigo as familia_id,
        b.estabelecimento_id,

        FN_TAMANHO_GRADE(p.grade_codigo, b.tamanho) tamanho,

        (Select First 1
      Coalesce((Select First 1 lpad(M.Densidade,10,0)||lpad(m.espessura,10,0)
         From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000')
      From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
     Where MC.Modelo_Id = p.modelo_codigo
       and MC.Cor_Id = c.codigo
       and MC.Produto_Id = P2.Codigo
       and P2.Familia_Codigo = F.Codigo
       and F.Densidade_Espessura = '1'

       and((b.tamanho = 1 and MC.T01 > 0) or
           (b.Tamanho = 2 and MC.T02 > 0) or
           (b.Tamanho = 3 and MC.T03 > 0) or
           (b.Tamanho = 4 and MC.T04 > 0) or
           (b.Tamanho = 5 and MC.T05 > 0) or
           (b.Tamanho = 6 and MC.T06 > 0) or
           (b.Tamanho = 7 and MC.T07 > 0) or
           (b.Tamanho = 8 and MC.T08 > 0) or
           (b.Tamanho = 9 and MC.T09 > 0) or
           (b.Tamanho =10 and MC.T10 > 0) or
           (b.Tamanho =11 and MC.T11 > 0) or
           (b.Tamanho =12 and MC.T12 > 0) or
           (b.Tamanho =13 and MC.T13 > 0) or
           (b.Tamanho =14 and MC.T14 > 0) or
           (b.Tamanho =15 and MC.T15 > 0) or
           (b.Tamanho =16 and MC.T16 > 0) or
           (b.Tamanho =17 and MC.T17 > 0) or
           (b.Tamanho =18 and MC.T18 > 0) or
           (b.Tamanho =19 and MC.T19 > 0) or
           (b.Tamanho =20 and MC.T20 > 0))) as Densidade
    
    From TbDefeito_Transacao_Item B,tbsac_defeito d, TbEsteira E, TbProduto P, tbmodelo M, tbcor c,tbmodelo_linha r,tbperfil s
    Where B.Esteira_id = E.Codigo
      and B.Produto_id = P.Codigo
      --and B.Estabelecimento_Id = :ESTABELECIMENTO
      --and B.Data between :DATA1 and :DATA2
      AND (B.DEFEITO_ID > 0)
      --and P.Familia_Codigo = :FAMILIA
      and m.codigo = p.modelo_codigo
      and d.codigo = b.defeito_id
      and c.codigo = p.cor_codigo
      and r.codigo = m.linha_codigo
      and s.id = b.perfil
      and s.tabela = 'SKU'
      and s.familia_id = p.familia_codigo

)

        group by
        DATA_REGISTRO,
        DEFEITO,
        MODELO,
        PRODUTO,
        COR,
        GP,
        LINHA,
        PERFIL,
        defeito_setor,
        defeito_id,
        MODELO_ID,
        PRODUTO_ID,
        COR_ID,
        GP_ID,
        LINHA_ID,
        PERFIL_ID,
        familia_id,
        estabelecimento_id,
        tamanho,
        Densidade,
        espessura
;

CREATE OR ALTER VIEW VWREGISTRO_PRODUCAO_DIA(
    DATA_REGISTRO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    QUANTIDADE,
    QTD_TURNO1,
    QTD_TURNO2,
    TALOES,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    FAMILIA_ID,
    ESTABELECIMENTO_ID,
    TAMANHO,
    DENSIDADE,
    ESPESSURA)
AS
select

    DATA_REGISTRO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    sum(QUANTIDADE_PEDIDO) as QUANTIDADE,
    sum(QTD_TURNO1) as QTD_TURNO1,
    sum(QTD_TURNO2) as QTD_TURNO2,
    sum(TALOES) as TALOES,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    familia_id,
    estabelecimento_id,
    tamanho,
    cast(substring(Densidade from 1  for 10) as numeric(5,2)) DENSIDADE,
    cast(substring(Densidade from 11 for 20) as numeric(5,2)) espessura

from(

    select
    
        A.Data_Producao as DATA_REGISTRO,
        A.pedido_item_controle as ID,
        
        m.descricao as MODELO,
        p.descricao as PRODUTO,
        c.descricao as COR,
        e.descricao as GP,
        r.descricao as LINHA,
        s.descricao as PERFIL,
        
        A.QUANTIDADE_PEDIDO,
        IIF(A.TURNO=1,A.QUANTIDADE_PEDIDO,0) QTD_TURNO1,
        IIF(A.TURNO=2,A.QUANTIDADE_PEDIDO,0) QTD_TURNO2,
        1 as TALOES,
        
        m.codigo as modelo_id,
        p.codigo as produto_id,
        c.codigo cor_id,
        e.codigo gp_id,
        r.codigo linha_id,
        s.id perfil_id,
        a.familia_codigo as familia_id,
        a.estabelecimento_codigo as estabelecimento_id,
        FN_TAMANHO_GRADE(p.grade_codigo, a.tamanho) tamanho,

        (Select First 1
      Coalesce((Select First 1 lpad(M.Densidade,10,0)||lpad(m.espessura,10,0)
         From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000')
      From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
     Where MC.Modelo_Id = p.modelo_codigo
       and MC.Cor_Id = c.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))) as Densidade
    
    From TbPedido_Item_Processado A, TbEsteira E, TbProduto P, tbmodelo M, tbcor c,tbmodelo_linha r,tbperfil s
    
        where
        --and A.Estabelecimento_Codigo = :ESTABELECIMENTO
        --and A.Data_Producao between :DATA1 and :DATA2
        --and A.familia_codigo = :FAMILIA
        
            e.codigo = a.Esteira_Producao
        and p.codigo = a.produto_codigo
        and m.codigo = p.modelo_codigo
        and c.codigo = p.cor_codigo
        and r.codigo = m.linha_codigo
        and s.id = a.perfil
        and s.tabela = 'SKU'

)

        group by
        DATA_REGISTRO,
        MODELO,
        PRODUTO,
        COR,
        GP,
        LINHA,
        PERFIL,
        MODELO_ID,
        PRODUTO_ID,
        COR_ID,
        GP_ID,
        LINHA_ID,
        PERFIL_ID,
        familia_id,
        estabelecimento_id,
        tamanho,
        Densidade,
        espessura
;


CREATE OR ALTER trigger ttbesteira_b0iu_01 for tbesteira
active before insert or update position 0
AS
DECLARE VARIABLE ID INTEGER;
begin

   if (New.Familia_Codigo > 0) then
       Begin
       ID = Coalesce((Select First 1 F.Codigo From TbFamilia F Where F.Codigo = New.Familia_Codigo),0);
       if (id = 0) then
           Begin
           Exception "..." 'FAMÍLIA DE PRODUTOS INVÁLIDA!'||
                           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End

   if (Char_Length(New.CCusto) > 0) then
       Begin
       ID = Coalesce((Select First 1 C.ID From TbCentro_De_Custo C Where C.Codigo = New.CCusto),0);
       if (id = 0) then
           Begin
           Exception "..." 'CENTRO DE CUSTO INVÁLIDO!'||
                           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End


   if (Char_Length(New.Perfil) > 0) then
       Begin
       ID = Coalesce((Select First 1 P.Controle From TbPerfil P Where P.ID = New.Perfil and P.Tabela = 'GP'),0);
       if (id = 0) then
           Begin
           Exception "..." 'PERFIL DE GRUPO DE PRODUÇÃO INVÁLIDO!'||
                           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End

   if (Char_Length(New.Perfil_Ped) > 0) then
       Begin
       ID = Coalesce((Select First 1 P.Controle From TbPerfil P Where P.ID = New.Perfil_Ped and P.Tabela = 'PED'),0);
       if (id = 0) then
           Begin
           Exception "..." 'PERFIL DE PEDIDOS INVÁLIDO!'||
                           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End

end;

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

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

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

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

end;

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

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

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

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

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

       End

end;

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

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

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

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

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

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

            if (:Cor_Id > 0) Then
                Begin

                Blq_Qtd_Min  = 0;
                Blq_Qtd_Mult = 0;

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

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

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

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

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

                Mod_Qtd_Min  = 0;
                Mod_Qtd_Mult = 0;

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

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

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

                End
           End
      End

End;

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

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

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

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

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

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

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


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


        NEW.REPROCESSAR = 0;

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

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


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

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

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

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

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

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

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

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

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

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

end;


CREATE OR ALTER procedure spc_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(10),
    tempo_parado numeric(15,2),
    perdas numeric(15,2),
    perfil_sku_descricao varchar(500),
    perdas_perc1 numeric(15,2),
    eficiencia_minima numeric(15,2),
    eficiencia_a numeric(15,2),
    eficiencia_b numeric(15,2),
    perdas_a numeric(15,2),
    perdas_b numeric(15,2),
    tempo_extra numeric(15,2),
    tempo_efic numeric(15,2),
    turno integer,
    efic numeric(15,2))
as
begin

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

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

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

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


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

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


   suspend;

  end

end;

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

    REMESSA_ID = GEN_ID(GTBREMESSA,1);


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


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


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



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

    FOR

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


        REMESSA_TALAO_DETALHE_ID = GEN_ID(GERADOR1_ID, 1);

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

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

        END

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

    END


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

        FROM
            VWREMESSA_TALAO T,
            VWREMESSA R

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

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

        IF ( TEMPO_TOTAL = 0 ) THEN
        BEGIN
            TEMPO_TOTAL = 1;
        END

        EXECUTE PROCEDURE SPI_PROGRAMACAO2(
            :ESTABELECIMENTO_ID,
            'A',
            :GP_ID,
            :UP_ID,
            :ESTACAO,
            :TALAO_ID,
            0,
            0,
            :QUANTIDADE,
            :TEMPO_TOTAL,
            :REMESSA_ID,
            :DATA
        );
    END


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

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

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

    END

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

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 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 char(10);
declare variable perfil_cor char(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_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 char(10);
declare variable perfil_cor char(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_indicador3 (
    pestabelecimento_1 integer,
    pdata1 date,
    pdata2 date,
    flag_1 integer,
    tipo_1 integer,
    gp_id_1 varchar(3000))
returns (
    vquant integer,
    vefic_a numeric(10,4),
    vefic_b numeric(10,4),
    vperda_a numeric(10,4),
    vperda_b numeric(10,4))
as
declare variable vgp_id integer;
BEGIN

    IF (flag_1 = 4) THEN
    BEGIN

      VGP_ID = 0;
      VGP_ID = COALESCE((select first 1 replace (R.gp_id,  '@', '') from tmpindicador3 R where R.data_processamento = :pdata2 AND R.gp_id = :GP_ID_1 and r.tipo = :tipo_1),0);

        IF (VGP_ID = 0) THEN
        BEGIN
            --------------------------
            FOR
            
                Select COALESCE(y.Quant,0) AS Quant,
                COALESCE(cast((y.efic_a/y.Quant) as numeric(10,4)),0) as efic_a,
                COALESCE(cast((y.efic_b/y.Quant) as numeric(10,4)),0) as efic_b,
                COALESCE(cast((y.perda_a/y.Quant) as numeric(10,4)),0) as perda_a,
                COALESCE(cast((y.perda_b/y.Quant) as numeric(10,4)),0) as perda_b
                from ( Select
                sum(z.Quant) as Quant,sum((z.efic_a*z.Quant)) as efic_a,sum((z.efic_b*z.Quant)) as efic_b,
                sum((z.perda_a*z.Quant)) as perda_a,(sum(z.perda_b*z.Quant)) as perda_b from (
                Select sum(A.QUANTIDADE_PEDIDO) as Quant,a.perfil,p.efic_a,p.efic_b,p.perda_a,p.perda_b
                From TbPedido_Item_Processado A,tbperfil p
                Where A.Estabelecimento_Codigo = :pEstabelecimento_1
                and A.Data_Producao  Between :pData1 and :pData2
                and A.Esteira_Producao in (select * from split(:gp_id_1,'@'))

                and p.id = a.perfil
                and p.tabela = 'SKU'
                group by perfil,efic_a,efic_b,perda_a,perda_b
                ) z
                ) y
            --
            
            
            INTO :vQUANT,
                 :vEFIC_A,
                 :vEFIC_B,
                 :vPERDA_A,
                 :vPERDA_B
            DO
                      update or insert into tMPindicador3 (gp_id, QUANT,EFIC_A,EFIC_B,PERDA_A,PERDA_B,data_processamento,tipo)
                      values (:GP_ID_1,:vQUANT,:vEFIC_A,:vEFIC_B,:vPERDA_A,:vPERDA_B,:pDATA2,:tipo_1) matching (gp_id,tipo,data_processamento);
            --------------------------
            SUSPEND;
        END
        ELSE
        begin
          FOR
          select replace (R.gp_id,  '@', ''),R.QUANT,R.EFIC_A,R.EFIC_B,R.PERDA_A,R.PERDA_B from tMPindicador3 R where R.data_processamento = :pdata2 AND R.gp_id = :GP_ID_1 and r.tipo = :tipo_1
            INTO :vGP_ID,
                 :vQUANT,
                 :vEFIC_A,
                 :vEFIC_B,
                 :vPERDA_A,
                 :vPERDA_B
             DO
             SUSPEND;
        END
    
    END
    ELSE
    BEGIN
        IF (flag_1 = 5) THEN
        BEGIN
             FOR
            
                Select COALESCE(y.Quant,0) AS Quant,
                COALESCE(cast((y.efic_a/y.Quant) as numeric(10,4)),0) as efic_a,
                COALESCE(cast((y.efic_b/y.Quant) as numeric(10,4)),0) as efic_b,
                COALESCE(cast((y.perda_a/y.Quant) as numeric(10,4)),0) as perda_a,
                COALESCE(cast((y.perda_b/y.Quant) as numeric(10,4)),0) as perda_b
                from ( Select
                sum(z.Quant) as Quant,sum((z.efic_a*z.Quant)) as efic_a,sum((z.efic_b*z.Quant)) as efic_b,
                sum((z.perda_a*z.Quant)) as perda_a,(sum(z.perda_b*z.Quant)) as perda_b from (
                Select sum(A.QUANTIDADE_PEDIDO) as Quant,a.perfil,p.efic_a,p.efic_b,p.perda_a,p.perda_b
                From TbPedido_Item_Processado A,tbperfil p
                Where A.Estabelecimento_Codigo = :pEstabelecimento_1
                and A.Data_Producao  Between :pData1 and :pData2
                and A.Esteira_Producao in (select * from split(:gp_id_1,'@'))
                and p.id = a.perfil
                and p.tabela = 'SKU'
                group by perfil,efic_a,efic_b,perda_a,perda_b
                ) z
                ) y

            INTO :vQUANT,
                 :vEFIC_A,
                 :vEFIC_B,
                 :vPERDA_A,
                 :vPERDA_B
              DO
                    update or insert into tMPindicador3 (gp_id, QUANT,EFIC_A,EFIC_B,PERDA_A,PERDA_B,data_processamento,tipo)
                    values (:GP_ID_1,:vQUANT,:vEFIC_A,:vEFIC_B,:vPERDA_A,:vPERDA_B,:pDATA2,:tipo_1) matching (gp_id,tipo,data_processamento);
        
              SUSPEND;
          END
          ELSE
          BEGIN
             IF (flag_1 < 4) THEN
             BEGIN

                FOR
                
                    Select COALESCE(y.Quant,0) AS Quant,
                    COALESCE(cast((y.efic_a/y.Quant) as numeric(10,4)),0) as efic_a,
                    COALESCE(cast((y.efic_b/y.Quant) as numeric(10,4)),0) as efic_b,
                    COALESCE(cast((y.perda_a/y.Quant) as numeric(10,4)),0) as perda_a,
                    COALESCE(cast((y.perda_b/y.Quant) as numeric(10,4)),0) as perda_b
                    from ( Select
                    sum(z.Quant) as Quant,sum((z.efic_a*z.Quant)) as efic_a,sum((z.efic_b*z.Quant)) as efic_b,
                    sum((z.perda_a*z.Quant)) as perda_a,(sum(z.perda_b*z.Quant)) as perda_b from (
                    Select sum(A.QUANTIDADE_PEDIDO) as Quant,a.perfil,p.efic_a,p.efic_b,p.perda_a,p.perda_b
                    From TbPedido_Item_Processado A,tbperfil p
                    Where A.Estabelecimento_Codigo = :pEstabelecimento_1
                    and A.Data_Producao  Between :pData1 and :pData2
                    and A.Esteira_Producao in (select * from split(:gp_id_1,'@'))

                    and p.id = a.perfil
                    and p.tabela = 'SKU'
                    group by perfil,efic_a,efic_b,perda_a,perda_b
                    ) z
                    ) y
                --
                
                
                INTO :vQUANT,
                     :vEFIC_A,
                     :vEFIC_B,
                     :vPERDA_A,
                     :vPERDA_B

                DO SUSPEND;

              END
              ELSE
              BEGIN
                 Exception "..." 'FLAG INVALIDA!';
              END

        END
    END
END;

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



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

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


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


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

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

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


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

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

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


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

    END


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

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


    SUSPEND;
END;


CREATE OR ALTER procedure spu_trata_pedido_estoque4 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    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,
       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, :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do

if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Delete from TBESTOQUE_DETALHE_ALOCACAO
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
              and Tipo = 'P'
              and Produto_Id = :Produto_Id
              and Tamanho = :Tamanho
              and Saldo > 0;
          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
        
              For
              Select First 1
                Cast(IIF(:Tamanho =  0, A.Saldo,
                     IIF(:Tamanho =  1, A.T01_Saldo,IIF(:Tamanho =  2, A.T02_Saldo,
                     IIF(:Tamanho =  3, A.T03_Saldo,IIF(:Tamanho =  4, A.T04_Saldo,
                     IIF(:Tamanho =  5, A.T05_Saldo,IIF(:Tamanho =  6, A.T06_Saldo,
                     IIF(:Tamanho =  7, A.T07_Saldo,IIF(:Tamanho =  8, A.T08_Saldo,
                     IIF(:Tamanho =  9, A.T09_Saldo,IIF(:Tamanho = 10, A.T10_Saldo,
                     IIF(:Tamanho = 11, A.T11_Saldo,IIF(:Tamanho = 12, A.T12_Saldo,
                     IIF(:Tamanho = 13, A.T13_Saldo,IIF(:Tamanho = 14, A.T14_Saldo,
                     IIF(:Tamanho = 15, A.T15_Saldo,IIF(:Tamanho = 16, A.T16_Saldo,
                     IIF(:Tamanho = 17, A.T17_Saldo,IIF(:Tamanho = 18, A.T18_Saldo,
                     IIF(:Tamanho = 19, A.T19_Saldo,IIF(:Tamanho = 20, A.T20_Saldo,
                     0))))))))))))))))))))) As Numeric(15,4))
              -(Coalesce(
               (Select First 1 ESA.QUANTIDADE
                  From TBESTOQUE_SALDO_ALOCACAO ESA
                 Where ESA.ESTABELECIMENTO_ID = A.Estabelecimento_Codigo
                   and ESA.LOCALIZACAO_ID = A.Localizacao_Codigo
                   and ESA.PRODUTO_ID = A.Produto_Codigo
                   and ESA.TAMANHO = :Tamanho),0))
        
                  From TbEstoque_Saldo A
                 Where A.Estabelecimento_Codigo = :Estabelecimento_Id
                   and A.Localizacao_Codigo = :Localizacao_Id
                   and A.Produto_Codigo = :Produto_Id
                  Into :Qtd_Disp
                    Do
                       Begin

                       if (:Qtd_Disp > 0) then
                            Begin

                                vQtd_Disp = :Qtd_Disp;

                                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 <= :vQtd_Disp and :vQtd_Disp > 0) Then
                                   Begin
                                    insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                    estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                    produto_id, tamanho, Quantidade, Saldo)
                                    values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                    :localizacao_id, :produto_id, :tamanho, :vQtd_Prd, :vQtd_Prd);
            
                                    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 and :vQtd_Disp > 0) Then
                                   Begin
                                    insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                    estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                    produto_id, tamanho, Quantidade, Saldo)
                                    values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                    :localizacao_id, :produto_id, :tamanho, :vQtd_Disp, :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;

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 char(10),
    perfil_cor char(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_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 char(10),
    perfil_cor char(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 (: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_ped_item_estoque3 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    qtd_prd numeric(15,4),
    qtd_disp numeric(15,4),
    remessa integer,
    talao integer,
    produto_id integer,
    modelo_codigo integer,
    localizacao_id integer,
    tamanho integer,
    rem_status char(1),
    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.modelo_codigo, A.Controle, A.Produto_Codigo,
               A.Localizacao_Id, A.Tamanho,
               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, :modelo_codigo, :Controle,
     :Produto_Id, :Localizacao_Id, :Tamanho, :Rem_Status, :Qtd_Prd, :Qtd_Mult, :aloc_mult
Do

if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Delete from TBESTOQUE_DETALHE_ALOCACAO
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
              and Tipo = 'P'
              and Produto_Id = :Produto_Id
              and Tamanho = :Tamanho
              and Saldo > 0;
          End
        
      if (:AlocDesaloc = 'A') then
           Begin
    
            IF(:Qtd_Mult = 0)THEN
            BEGIN
               exception "..." 'Modelo '||:modelo_codigo||' sem cota definida no tamanho '||:Tamanho;
            END
            
           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
        
              For
              Select First 1
                Cast(IIF(:Tamanho =  0, A.Saldo,
                     IIF(:Tamanho =  1, A.T01_Saldo,IIF(:Tamanho =  2, A.T02_Saldo,
                     IIF(:Tamanho =  3, A.T03_Saldo,IIF(:Tamanho =  4, A.T04_Saldo,
                     IIF(:Tamanho =  5, A.T05_Saldo,IIF(:Tamanho =  6, A.T06_Saldo,
                     IIF(:Tamanho =  7, A.T07_Saldo,IIF(:Tamanho =  8, A.T08_Saldo,
                     IIF(:Tamanho =  9, A.T09_Saldo,IIF(:Tamanho = 10, A.T10_Saldo,
                     IIF(:Tamanho = 11, A.T11_Saldo,IIF(:Tamanho = 12, A.T12_Saldo,
                     IIF(:Tamanho = 13, A.T13_Saldo,IIF(:Tamanho = 14, A.T14_Saldo,
                     IIF(:Tamanho = 15, A.T15_Saldo,IIF(:Tamanho = 16, A.T16_Saldo,
                     IIF(:Tamanho = 17, A.T17_Saldo,IIF(:Tamanho = 18, A.T18_Saldo,
                     IIF(:Tamanho = 19, A.T19_Saldo,IIF(:Tamanho = 20, A.T20_Saldo,
                     0))))))))))))))))))))) As Numeric(15,4))
              -(Coalesce(
               (Select First 1 ESA.QUANTIDADE
                  From TBESTOQUE_SALDO_ALOCACAO ESA
                 Where ESA.ESTABELECIMENTO_ID = A.Estabelecimento_Codigo
                   and ESA.LOCALIZACAO_ID = A.Localizacao_Codigo
                   and ESA.PRODUTO_ID = A.Produto_Codigo
                   and ESA.TAMANHO = :Tamanho),0))
        
                  From TbEstoque_Saldo A
                 Where A.Estabelecimento_Codigo = :Estabelecimento_Id
                   and A.Localizacao_Codigo = :Localizacao_Id
                   and A.Produto_Codigo = :Produto_Id
                  Into :Qtd_Disp
                    Do
                       Begin

                       if (:Qtd_Disp > 0) then
                            Begin

                            vQtd_Disp = Qtd_Disp;
        
                            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 <= :vQtd_Disp and :vQtd_Disp > 0) Then
                               Begin
                                insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                produto_id, tamanho, Quantidade, Saldo)
                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                :localizacao_id, :produto_id, :tamanho, :vQtd_Prd, :vQtd_Prd);
        
                                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 and :vQtd_Disp > 0) Then
                               Begin
                                insert into TBESTOQUE_DETALHE_ALOCACAO ( 
                                estabelecimento_id, tabela_id, tab_item_id, tipo, localizacao_id,
                                produto_id, tamanho, Quantidade, Saldo)
                                values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                :localizacao_id, :produto_id, :tamanho, :vQtd_Disp, :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;

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(10),
    perfil_cor char(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,
    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;

GRANT ALL ON TBPERFIL TO RDB$ADMIN;