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

insert into TBTEMP_AJUSTE
select
    *
FROM TBSUB_UP;

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

end;

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

end;

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

end;

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

end;

CREATE OR ALTER procedure spc_paradas_estacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(100),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    tempo_parado integer,
    motivo_parada varchar(100),
    iniciado varchar(20),
    parado varchar(20),
    estacao integer,
    marcar integer,
    tipo integer,
    data_hora timestamp,
    operador varchar(100),
    estacao_descricao varchar(100),
    data_inicio timestamp,
    data_fim timestamp)
as
declare variable data1 timestamp;
declare variable data2 timestamp;
declare variable ultimo_registro timestamp;
declare variable data3 timestamp;
begin

end;

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

end;

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

end;

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

end;

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

end;


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

end;

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

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

BEGIN


end;

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

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

DROP TABLE TBSUB_UP;

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

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

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

insert into TBSUB_UP
select
    *
FROM TBTEMP_AJUSTE;

DROP TABLE TBTEMP_AJUSTE;

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

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

BEGIN

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

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

          Do Begin

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

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

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

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

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

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

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

        END

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

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

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

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

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

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

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

    END
end;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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




            --TMP_OPERACIONAL = (0.421 * QUANTIDADE);

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

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

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

        --SUSPEND;

        /* -- INICIO ------ BLOCO QUE ALIMENTA OS VALORES ANTERIORES ---------- */
        OLD_FERRAMENTA_ID = FERRAMENTA_ID;
        OLD_COR_ID        = COR_ID;
        OLD_FAMILIA_ID    = FAMILIA_ID;
        /* --  FIM   ------ BLOCO QUE ALIMENTA OS VALORES ANTERIORES ---------- */
    END

END;

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

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

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

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

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


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

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


   suspend;

  end

end;

CREATE OR ALTER procedure spc_paradas_estacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(100),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    tempo_parado integer,
    motivo_parada varchar(100),
    iniciado varchar(20),
    parado varchar(20),
    estacao integer,
    marcar integer,
    tipo integer,
    data_hora timestamp,
    operador varchar(100),
    estacao_descricao varchar(100),
    data_inicio timestamp,
    data_fim timestamp)
as
declare variable data1 timestamp;
declare variable data2 timestamp;
declare variable ultimo_registro timestamp;
declare variable data3 timestamp;
begin

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

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

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

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

     DATA_HORA = :ultimo_registro;

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

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

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

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

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

  end


end;

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

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

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

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

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


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

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


    DO
    SUSPEND;

END;

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

    FERRAMENTA_ID = 0;

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

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

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

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

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

    DO
    SUSPEND;
END;

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


END;

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

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

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

    END

END;


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

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

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

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

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

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

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

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

    NEW.INCREMENTO = 0;
end;

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

   HISTORICO = 'Estacao '||OLD.DESCRICAO;

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

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

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

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBSETOR', OLD.UP_ID,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       'Estacao alterada: '||:Historico);
       End

end;

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

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

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

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

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


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

