/******************************************************************************/
/****                              Generators                              ****/
/******************************************************************************/

CREATE GENERATOR GTBREFEICOES_CARDAPIO START WITH 0 INCREMENT BY 1;
SET GENERATOR GTBREFEICOES_CARDAPIO TO 0;

CREATE GENERATOR GTBREFEICOES_CARD_PRATOS START WITH 0 INCREMENT BY 1;
SET GENERATOR GTBREFEICOES_CARD_PRATOS TO 0;

CREATE GENERATOR GTBREFEICOES_GRUPOS START WITH 0 INCREMENT BY 1;
SET GENERATOR GTBREFEICOES_GRUPOS TO 0;

CREATE GENERATOR GTBREFEICOES_PESSOAS START WITH 0 INCREMENT BY 1;
SET GENERATOR GTBREFEICOES_PESSOAS TO 0;

CREATE GENERATOR GTBREFEICOES_PRATO START WITH 0 INCREMENT BY 1;
SET GENERATOR GTBREFEICOES_PRATO TO 0;

CREATE GENERATOR GTBREFEICOES_PRECOS START WITH 0 INCREMENT BY 1;
SET GENERATOR GTBREFEICOES_PRECOS TO 0;

CREATE GENERATOR GTBREFEICOES_REGISTRO START WITH 0 INCREMENT BY 1;
SET GENERATOR GTBREFEICOES_REGISTRO TO 0;

CREATE GENERATOR GTBREFEICOES_RESERVA START WITH 0 INCREMENT BY 1;
SET GENERATOR GTBREFEICOES_RESERVA TO 0;

CREATE GENERATOR GTBREFEICOES_TIPO START WITH 0 INCREMENT BY 1;
SET GENERATOR GTBREFEICOES_TIPO TO 0;

CREATE GENERATOR GTBREFEICOES_TIPO_PRATO START WITH 0 INCREMENT BY 1;
SET GENERATOR GTBREFEICOES_TIPO_PRATO TO 0;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE TBREFEICOES_CARD_PRATOS (
    ID             INTEGER NOT NULL,
    CARDAPIO_ID    INTEGER DEFAULT 0,
    TIPO_PRATO_ID  INTEGER,
    PRATO_ID       INTEGER
);

CREATE TABLE TBREFEICOES_CARDAPIO (
    ID             INTEGER NOT NULL,
    DATA_REFEICAO  DATE,
    LIVRE          INTEGER,
    TIPO_ID        INTEGER
);

CREATE TABLE TBREFEICOES_GRUPOS (
    ID           INTEGER NOT NULL,
    DESCRICAO    VARCHAR(50) DEFAULT '',
    FATURAMENTO  INTEGER DEFAULT 0,
    STATUS       INTEGER DEFAULT 0
);

CREATE TABLE TBREFEICOES_PESSOAS (
    ID             INTEGER NOT NULL,
    NOME           VARCHAR(100) DEFAULT '',
    OBSERVACAO     VARCHAR(300) DEFAULT '',
    STATUS         INTEGER DEFAULT 0,
    GRUPO_ID       INTEGER DEFAULT 0,
    TIPO_REGISTRO  INTEGER,
    MESTRE         INTEGER
);

CREATE TABLE TBREFEICOES_PRATO (
    ID         INTEGER NOT NULL,
    DESCRICAO  VARCHAR(100) DEFAULT '',
    STATUS     INTEGER DEFAULT 0
);

CREATE TABLE TBREFEICOES_PRECOS (
    ID           INTEGER NOT NULL,
    DESCRICAO    VARCHAR(100) DEFAULT '',
    VALOR        NUMERIC(15,4) DEFAULT 0,
    STATUS       INTEGER DEFAULT 0,
    TIPO         INTEGER DEFAULT 0,
    DATA_INICIO  DATE,
    DATA_FIM     DATE
);

CREATE TABLE TBREFEICOES_REGISTRO (
    ID                 INTEGER NOT NULL,
    TIPO_REGISTRO      INTEGER DEFAULT 0,
    CARDAPIO_ID        INTEGER DEFAULT 0,
    CARDAPIO_PRATO_ID  INTEGER DEFAULT 0,
    PESSOA_ID          INTEGER DEFAULT 0,
    DATA               DATE DEFAULT current_date,
    DATA_HORA          TIMESTAMP DEFAULT LOCALTIMESTAMP
);

CREATE TABLE TBREFEICOES_RESERVA (
    ID                 INTEGER NOT NULL,
    TIPO_REGISTRO      INTEGER DEFAULT 0,
    CARDAPIO_ID        INTEGER DEFAULT 0,
    CARDAPIO_PRATO_ID  INTEGER DEFAULT 0,
    PESSOA_ID          INTEGER DEFAULT 0,
    DATA               DATE DEFAULT current_date,
    DATA_HORA          TIMESTAMP DEFAULT LOCALTIMESTAMP
);

CREATE TABLE TBREFEICOES_TIPO (
    ID           INTEGER NOT NULL,
    DESCRICAO    VARCHAR(50) DEFAULT '',
    HORA_INICIO  TIME DEFAULT '00:00',
    HORA_FIM     TIME DEFAULT '00:00',
    STATUS       INTEGER DEFAULT 0
);

CREATE TABLE TBREFEICOES_TIPO_PRATO (
    ID              INTEGER NOT NULL,
    DISPOSITIVO_ID  INTEGER DEFAULT 0,
    DESCRICAO       VARCHAR(100) DEFAULT '',
    STATUS          INTEGER DEFAULT 0,
    OBRIGATORIO     INTEGER DEFAULT 1
);



/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE TBREFEICOES_CARDAPIO ADD CONSTRAINT PK_TBREFEICOES_CARDAPIO PRIMARY KEY (ID);
ALTER TABLE TBREFEICOES_CARD_PRATOS ADD CONSTRAINT PK_TBREFEICOES_CARD_PRATOS PRIMARY KEY (ID);
ALTER TABLE TBREFEICOES_GRUPOS ADD CONSTRAINT PK_TBREFEICOES_GRUPOS PRIMARY KEY (ID);
ALTER TABLE TBREFEICOES_PESSOAS ADD CONSTRAINT PK_TBREFEICOES_PESSOAS PRIMARY KEY (ID);
ALTER TABLE TBREFEICOES_PRATO ADD CONSTRAINT PK_TBREFEICOES_PRATO PRIMARY KEY (ID);
ALTER TABLE TBREFEICOES_PRECOS ADD CONSTRAINT PK_TBREFEICOES_PRECOS PRIMARY KEY (ID);
ALTER TABLE TBREFEICOES_REGISTRO ADD CONSTRAINT PK_TBREFEICOES_REGISTRO PRIMARY KEY (ID);
ALTER TABLE TBREFEICOES_RESERVA ADD CONSTRAINT PK_TBREFEICOES_RESERVA PRIMARY KEY (ID);
ALTER TABLE TBREFEICOES_TIPO ADD CONSTRAINT PK_TBREFEICOES_TIPO PRIMARY KEY (ID);
ALTER TABLE TBREFEICOES_TIPO_PRATO ADD CONSTRAINT PK_TBREFEICOES_TIPO_PRATO PRIMARY KEY (ID);

/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE INDEX ITBREFEICOES_CARDAPIO_05 ON TBREFEICOES_CARDAPIO (TIPO_ID);
CREATE INDEX ITBREFEICOES_PESSOAS_01 ON TBREFEICOES_PESSOAS (GRUPO_ID);
CREATE INDEX ITBREFEICOES_REGISTRO_01 ON TBREFEICOES_REGISTRO (CARDAPIO_ID);
CREATE INDEX ITBREFEICOES_REGISTRO_02 ON TBREFEICOES_REGISTRO (PESSOA_ID);
CREATE INDEX ITBREFEICOES_RESERVA_01 ON TBREFEICOES_RESERVA (PESSOA_ID);
CREATE INDEX ITBREFEICOES_RESERVA_02 ON TBREFEICOES_RESERVA (CARDAPIO_PRATO_ID);
CREATE INDEX ITBREFEICOES_RESERVA_03 ON TBREFEICOES_RESERVA (CARDAPIO_ID);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/

SET TERM ^ ;


/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: TTBREFEICOES_CARDAPIO_B01I */
CREATE TRIGGER TTBREFEICOES_CARDAPIO_B01I FOR TBREFEICOES_CARDAPIO
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicoes_cardapio,1);
end
^

/* Trigger: TTBREFEICOES_CARD_PRATOS_B01I */
CREATE TRIGGER TTBREFEICOES_CARD_PRATOS_B01I FOR TBREFEICOES_CARD_PRATOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicoes_card_pratos,1);
end
^

/* Trigger: TTBREFEICOES_GRUPOS_B01I */
CREATE TRIGGER TTBREFEICOES_GRUPOS_B01I FOR TBREFEICOES_GRUPOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gTBREFEICOES_grupos,1);
end
^

/* Trigger: TTBREFEICOES_PESSOAS_B01I */
CREATE TRIGGER TTBREFEICOES_PESSOAS_B01I FOR TBREFEICOES_PESSOAS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gTBREFEICOES_pessoas,1);
end
^

/* Trigger: TTBREFEICOES_PRATO_B01I */
CREATE TRIGGER TTBREFEICOES_PRATO_B01I FOR TBREFEICOES_PRATO
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicoes_PRATO,1);
end
^

/* Trigger: TTBREFEICOES_PRECOS_B01I */
CREATE TRIGGER TTBREFEICOES_PRECOS_B01I FOR TBREFEICOES_PRECOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicoes_precos,1);
end
^

/* Trigger: TTBREFEICOES_REGISTRO_B01I */
CREATE TRIGGER TTBREFEICOES_REGISTRO_B01I FOR TBREFEICOES_REGISTRO
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicoes_registro,1);
end
^

/* Trigger: TTBREFEICOES_RESERVA_B01I */
CREATE TRIGGER TTBREFEICOES_RESERVA_B01I FOR TBREFEICOES_RESERVA
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicoes_reserva,1);
end
^

/* Trigger: TTBREFEICOES_TIPO_B01I */
CREATE TRIGGER TTBREFEICOES_TIPO_B01I FOR TBREFEICOES_TIPO
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicoes_tipo,1);
end
^

/* Trigger: TTBREFEICOES_TIPO_PRATO_B01I */
CREATE TRIGGER TTBREFEICOES_TIPO_PRATO_B01I FOR TBREFEICOES_TIPO_PRATO
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicoes_tipo_prato,1);
end
^
SET TERM ; ^


/******************************************************************************/
/****                             Descriptions                             ****/
/******************************************************************************/

COMMENT ON TABLE TBREFEICOES_CARDAPIO IS 
'Cardapio que deve ser servidos dia a dia';

COMMENT ON TABLE TBREFEICOES_CARD_PRATOS IS 
'pratos que devem ser servidos em cada cardapio';

COMMENT ON TABLE TBREFEICOES_GRUPOS IS 
'Grupo de Refeições, colaboradores são sempre do grupo 1 - Padrão';

COMMENT ON TABLE TBREFEICOES_PESSOAS IS 
'Terceiros e Visitantes';

COMMENT ON TABLE TBREFEICOES_PRATO IS 
'Patros que devem ser servidos nas refeições';

COMMENT ON TABLE TBREFEICOES_PRECOS IS 
'Valor das Refeições';

COMMENT ON TABLE TBREFEICOES_REGISTRO IS 
'Registro de Refeições importadas do rep, contem o que foi consumido e reservado por colaborador e cardapio';

COMMENT ON TABLE TBREFEICOES_RESERVA IS 
'Registros de reservas';

COMMENT ON TABLE TBREFEICOES_TIPO IS 
'Indica os tipos de refeições que pode ser registradas, almoço, jantar entre outros';

COMMENT ON TABLE TBREFEICOES_TIPO_PRATO IS 
'Tipos de Pratos, deve ser usado para indicar qual dispositivo (Catraca) deve receber cada prato';



/******************************************************************************/
/****                         Fields descriptions                          ****/
/******************************************************************************/

COMMENT ON COLUMN TBREFEICOES_CARDAPIO.DATA_REFEICAO IS 
'Data que a refeição deve acontecer';

COMMENT ON COLUMN TBREFEICOES_CARDAPIO.LIVRE IS 
'0 - não livre, 1 - livre, livre indica que qualquer colaborador pode passar em todas as catracas sem restrição de ter reservado';

COMMENT ON COLUMN TBREFEICOES_CARDAPIO.TIPO_ID IS 
'Tipo da Refeição';

COMMENT ON COLUMN TBREFEICOES_CARD_PRATOS.CARDAPIO_ID IS 
'ID do cardapio';

COMMENT ON COLUMN TBREFEICOES_CARD_PRATOS.TIPO_PRATO_ID IS 
'tipo do prato, indica em qual dos dispositivos (CATRACAS) ele ser registrado';

COMMENT ON COLUMN TBREFEICOES_CARD_PRATOS.PRATO_ID IS 
'id do prato';

COMMENT ON COLUMN TBREFEICOES_GRUPOS.DESCRICAO IS 
'Descrição do grupo';

COMMENT ON COLUMN TBREFEICOES_GRUPOS.FATURAMENTO IS 
'1 - SIM, 0 - NÃO, Indica se deve contabilizar grupo no faturamento';

COMMENT ON COLUMN TBREFEICOES_GRUPOS.STATUS IS 
'1 - Ativo, 0 - Inativo';

COMMENT ON COLUMN TBREFEICOES_PESSOAS.NOME IS 
'Nome do Terceiro ou Visitante';

COMMENT ON COLUMN TBREFEICOES_PESSOAS.OBSERVACAO IS 
'Descrição para o registro';

COMMENT ON COLUMN TBREFEICOES_PESSOAS.STATUS IS 
'0 - Inativo, 1 - Ativo';

COMMENT ON COLUMN TBREFEICOES_PESSOAS.GRUPO_ID IS 
'ID do grupo de refeições';

COMMENT ON COLUMN TBREFEICOES_PESSOAS.TIPO_REGISTRO IS 
'1 - Colaborador, 2 - Terceiro, 3 - Visitante';

COMMENT ON COLUMN TBREFEICOES_PESSOAS.MESTRE IS 
'1 - Sim, 0 - Não, Indica se esta pessoa é livre para registrar independente da reserva e da quantidade';

COMMENT ON COLUMN TBREFEICOES_PRATO.DESCRICAO IS 
'Descrição da Prato';

COMMENT ON COLUMN TBREFEICOES_PRATO.STATUS IS 
'1 - ativo, 0 - inativo';

COMMENT ON COLUMN TBREFEICOES_PRECOS.DESCRICAO IS 
'Descrição da Refeição';

COMMENT ON COLUMN TBREFEICOES_PRECOS.VALOR IS 
'Valor da Refeição';

COMMENT ON COLUMN TBREFEICOES_PRECOS.STATUS IS 
'1 - Ativo, 0 - Inativo';

COMMENT ON COLUMN TBREFEICOES_PRECOS.TIPO IS 
'1 - CONSUMIDA, 
2 - RESERVADA E NÃO CONSUMIDA, 
3 - ESPECIAL CONSUMIDO, 
4 - ESPECIAL RESERVADO E NÃO CONSUMIDO';

COMMENT ON COLUMN TBREFEICOES_PRECOS.DATA_INICIO IS 
'Data Inicial da validade do preço';

COMMENT ON COLUMN TBREFEICOES_PRECOS.DATA_FIM IS 
'Data Final da validade do preço';

COMMENT ON COLUMN TBREFEICOES_REGISTRO.TIPO_REGISTRO IS 
'1 - Colaborador, 2 - Terceiros, 3 - Visitantes';

COMMENT ON COLUMN TBREFEICOES_REGISTRO.CARDAPIO_ID IS 
'ID da cardapio que indica o que foi consumido';

COMMENT ON COLUMN TBREFEICOES_REGISTRO.CARDAPIO_PRATO_ID IS 
'ID do prato que foi consumido (id de TBREFEICOES_CARD_PRATOS)';

COMMENT ON COLUMN TBREFEICOES_REGISTRO.PESSOA_ID IS 
'ID do colaborador, terceiro ou visitante dependendo do TIPO_REGISTRO';

COMMENT ON COLUMN TBREFEICOES_REGISTRO.DATA IS 
'Data do Registro';

COMMENT ON COLUMN TBREFEICOES_REGISTRO.DATA_HORA IS 
'Data e Hora do Registro';

COMMENT ON COLUMN TBREFEICOES_RESERVA.TIPO_REGISTRO IS 
'1 - Colaborador, 2 - Terceiros, 3 - Visitantes';

COMMENT ON COLUMN TBREFEICOES_RESERVA.CARDAPIO_ID IS 
'ID da cardapio que indica o que foi reservado';

COMMENT ON COLUMN TBREFEICOES_RESERVA.CARDAPIO_PRATO_ID IS 
'ID do prato que foi consumido (id de TBREFEICOES_CARD_PRATOS)';

COMMENT ON COLUMN TBREFEICOES_RESERVA.PESSOA_ID IS 
'ID do colaborador, terceiro ou visitante dependendo do TIPO_REGISTRO';

COMMENT ON COLUMN TBREFEICOES_RESERVA.DATA IS 
'Data do Registro';

COMMENT ON COLUMN TBREFEICOES_RESERVA.DATA_HORA IS 
'Data e Hora do Registro';

COMMENT ON COLUMN TBREFEICOES_TIPO.DESCRICAO IS 
'descrição da refeição';

COMMENT ON COLUMN TBREFEICOES_TIPO.HORA_INICIO IS 
'Hora que a refeição deve ser iniciada, se tentar registrar antes desse horario deve ser bloqueado';

COMMENT ON COLUMN TBREFEICOES_TIPO.HORA_FIM IS 
'Hora que a refeição deve terminar, se tentar registrar depois desse horario deve ser bloqueado';

COMMENT ON COLUMN TBREFEICOES_TIPO.STATUS IS 
'1 - ativo, 0 - inativo';

COMMENT ON COLUMN TBREFEICOES_TIPO_PRATO.DISPOSITIVO_ID IS 
'ID do dispositivo (CATRACA) que deve receber os pratos deste tipo';

COMMENT ON COLUMN TBREFEICOES_TIPO_PRATO.DESCRICAO IS 
'Descrição do tipo';

COMMENT ON COLUMN TBREFEICOES_TIPO_PRATO.STATUS IS 
'1 - Ativo, 0 - Inativo';

COMMENT ON COLUMN TBREFEICOES_TIPO_PRATO.OBRIGATORIO IS 
'0 - Não, 1 - Sim, indica se este é um tipo que deve ter obrigatoriamente em cada cardapio';


ALTER TABLE TBREFEICOES_REGISTRO
    ADD NSU BIGINT DEFAULT 0;

COMMENT ON COLUMN TBREFEICOES_REGISTRO.NSU IS
'ID do acesso no dispositivo';

ALTER TABLE TBREFEICOES_TIPO
    ADD STATUS_EXCLUSAO INTEGER DEFAULT 0;

COMMENT ON COLUMN TBREFEICOES_TIPO.STATUS_EXCLUSAO IS
'1 - Excluido, 0 - Nao excluido';

ALTER TABLE TBREFEICOES_TIPO_PRATO
    ADD PADRAO INTEGER DEFAULT 0;

COMMENT ON COLUMN TBREFEICOES_TIPO_PRATO.PADRAO IS
'0 - Não, 1 - Sim, Indica o dispositivo e o prato padrao se nao tiver reserva';

CREATE TABLE TBREFEICOES_PESSOAS_TIPO (
    ID INTEGER NOT NULL,
    TIPO_PESSOA INTEGER,
    PESSOA_ID INTEGER,
    TIPO_ID INTEGER,
    DATA_INICIAL DATE,
    DATA_FINAL DATE);

ALTER TABLE TBREFEICOES_PESSOAS_TIPO
ADD CONSTRAINT PK_TBREFEICOES_PESSOAS_TIPO
PRIMARY KEY (ID);

COMMENT ON COLUMN TBREFEICOES_PESSOAS_TIPO.TIPO_PESSOA IS
'1 - Colaborador, 2 - Terceiro, 3 - Visitante';

COMMENT ON COLUMN TBREFEICOES_PESSOAS_TIPO.PESSOA_ID IS
'id da pessoa';

COMMENT ON COLUMN TBREFEICOES_PESSOAS_TIPO.TIPO_ID IS
'tipo da refeição, TBREFEICOES_TIPO';

COMMENT ON COLUMN TBREFEICOES_PESSOAS_TIPO.DATA_INICIAL IS
'data de inicio da refeição';

COMMENT ON COLUMN TBREFEICOES_PESSOAS_TIPO.DATA_FINAL IS
'data final da refeição';

CREATE SEQUENCE GTBREFEICOES_PESSOAS_TIPO;

SET TERM ^ ;

create trigger ttbrefeicoes_pessoas_tipo_b01i for tbrefeicoes_pessoas_tipo
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicoes_pessoas_tipo,1);
end
^

SET TERM ; ^

CREATE INDEX ITBREFEICOES_CARD_PRATOS_03
ON TBREFEICOES_CARD_PRATOS (PRATO_ID);

CREATE INDEX ITBREFEICOES_CARD_PRATOS_02
ON TBREFEICOES_CARD_PRATOS (TIPO_PRATO_ID);

CREATE INDEX ITBREFEICOES_CARD_PRATOS_01
ON TBREFEICOES_CARD_PRATOS (CARDAPIO_ID);

CREATE INDEX ITBREFEICOES_TIPO_PRATO_01
ON TBREFEICOES_TIPO_PRATO (DISPOSITIVO_ID);

CREATE INDEX ITBREFEICOES_PESSOAS_TIPO_05
ON TBREFEICOES_PESSOAS_TIPO (DATA_FINAL);

CREATE INDEX ITBREFEICOES_PESSOAS_TIPO_04
ON TBREFEICOES_PESSOAS_TIPO (DATA_INICIAL);

CREATE INDEX ITBREFEICOES_PESSOAS_TIPO_03
ON TBREFEICOES_PESSOAS_TIPO (TIPO_ID);

CREATE INDEX ITBREFEICOES_PESSOAS_TIPO_02
ON TBREFEICOES_PESSOAS_TIPO (TIPO_PESSOA);

CREATE INDEX ITBREFEICOES_PESSOAS_TIPO_01
ON TBREFEICOES_PESSOAS_TIPO (PESSOA_ID);

CREATE INDEX ITBREFEICOES_TIPO_PRATO_03
ON TBREFEICOES_TIPO_PRATO (PADRAO);

CREATE INDEX ITBREFEICOES_TIPO_PRATO_02
ON TBREFEICOES_TIPO_PRATO (STATUS);

CREATE UNIQUE INDEX ITBREFEICOES_TIPO_PRATO_04
ON TBREFEICOES_TIPO_PRATO (ID);

SET TERM ^ ;

CREATE OR ALTER function FN_DISPOSITIVO_REFEICAO (
    TIPO_PESSOA integer,
    TIPO_REFEICAO integer,
    PESSOA_ID integer,
    DATA_RESERVA date)
returns integer
AS
declare variable LIVRE integer;
declare variable DISPOSITIVO_ID integer;
declare variable DISPOSITIVO_ENVIAR integer;
declare variable REFEICAO_ID integer;
begin

    --verificar livre e dispositivo
    select first 1
        f.id,
        f.livre,
        a.dispositivo_id
    from TBREFEICOES_CARDAPIO f, TBREFEICOES_CARD_PRATOS J, TBREFEICOES_TIPO_PRATO A
    where f.data_refeicao = :DATA_RESERVA
    and f.tipo_id = :TIPO_REFEICAO
    and f.id = j.cardapio_id
    and a.id = j.tipo_prato_id
    and a.padrao = 1
    into :REFEICAO_ID, :LIVRE, :DISPOSITIVO_ID;

    :LIVRE = coalesce(:LIVRE,0);
    :REFEICAO_ID = coalesce(:REFEICAO_ID,0);
    :DISPOSITIVO_ID = coalesce(:DISPOSITIVO_ID,0);

    if(:LIVRE = 0)then
    begin
        --verificar reserva
        select first 1
            c.dispositivo_id
        from TBREFEICOES_RESERVA a, TBREFEICOES_CARD_PRATOS b, TBREFEICOES_TIPO_PRATO c
        where a.cardapio_id = :REFEICAO_ID
        and a.tipo_registro = :TIPO_PESSOA
        and a.pessoa_id = :PESSOA_ID
        and b.cardapio_id = a.cardapio_id
        and b.id = a.cardapio_prato_id
        and b.tipo_prato_id = c.id
        into :DISPOSITIVO_ENVIAR;

        --dispositivo reservado ou padrao para sem reserva
        :DISPOSITIVO_ENVIAR = coalesce(:DISPOSITIVO_ENVIAR, :DISPOSITIVO_ID);

    end else
    begin
        --enviar para todos os dispositivos
        :DISPOSITIVO_ENVIAR = 999999;
    end

    return :DISPOSITIVO_ENVIAR;
end
^

SET TERM ; ^

CREATE INDEX ITBREFEICOES_REGISTRO_06
ON TBREFEICOES_REGISTRO (TIPO_REGISTRO);

CREATE INDEX ITBREFEICOES_REGISTRO_05
ON TBREFEICOES_REGISTRO (DATA);

CREATE INDEX ITBREFEICOES_REGISTRO_04
ON TBREFEICOES_REGISTRO (NSU);

CREATE INDEX ITBREFEICOES_REGISTRO_03
ON TBREFEICOES_REGISTRO (CARDAPIO_PRATO_ID);

ALTER TABLE TBREFEICOES_PRECOS
    ADD TIPO_PRATO_ID INTEGER DEFAULT 0;

COMMENT ON COLUMN TBREFEICOES_PRECOS.TIPO_PRATO_ID IS
'id od tipo de prato TBREFEICOES_TIPO_PRATO';

ALTER TABLE TBREFEICOES_PRECOS
    ALTER DESCRICAO TO DESCRICAO2;

ALTER TABLE TBREFEICOES_PRECOS
    ADD DESCRICAO VARCHAR(100);

COMMENT ON COLUMN TBREFEICOES_PRECOS.DESCRICAO IS
'Descrição da Refeição';

ALTER TABLE TBREFEICOES_PRECOS DROP DESCRICAO2;

CREATE TABLE TBREFEICOES_TIPO_VINCULO (
    ID INTEGER NOT NULL,
    TIPO_ID INTEGER,
    TIPO_PRATO_ID INTEGER);

ALTER TABLE TBREFEICOES_TIPO_VINCULO
ADD CONSTRAINT PK_TBREFEICOES_TIPO_VINCULO
PRIMARY KEY (ID);

COMMENT ON COLUMN TBREFEICOES_TIPO_VINCULO.TIPO_ID IS
'tipo de refeicao TBREFEICOES_TIPO';

COMMENT ON COLUMN TBREFEICOES_TIPO_VINCULO.TIPO_PRATO_ID IS
'tipo de prato TBREFEICOES_TIPO_PRATO';

CREATE SEQUENCE GTBREFEICOES_TIPO_VINCULO;

SET TERM ^ ;

create trigger ttbrefeicoes_tipo_vinculo_b01i for tbrefeicoes_tipo_vinculo
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicoes_tipo_vinculo,1);
end
^

SET TERM ; ^

COMMENT ON TABLE TBREFEICOES_TIPO_VINCULO IS 'vinculo entre o tipo da refeicao e os tipos de prato para cada refeicao';

ALTER TABLE TBREFEICOES_PRATO
    ADD OBSERVACAO BLOB SUB_TYPE 1 SEGMENT SIZE 80;

COMMENT ON COLUMN TBREFEICOES_PRATO.OBSERVACAO IS
'observacao da refeicao';

ALTER SEQUENCE GTBREFEICOES_GRUPOS RESTART WITH 1 INCREMENT BY 1;

UPDATE OR INSERT INTO TBREFEICOES_GRUPOS (ID, DESCRICAO, FATURAMENTO, STATUS)
                                  VALUES (1, 'DELFA', 1, 1)
                                MATCHING (ID);
								
ALTER TABLE TBREFEICOES_PESSOAS_TIPO
    ADD CREDITOS INTEGER DEFAULT 0;

COMMENT ON COLUMN TBREFEICOES_PESSOAS_TIPO.CREDITOS IS
'numero de creditos da refeicao';

UPDATE OR INSERT INTO TBMENU (CONTROLE, GRUPO, SUBGRUPO, TIPO, URL, DESCRICAO, DATAHORA, SUB_GRUPO, DESCRICAO_RESUMIDA)
                      VALUES (33570, 'REF', 'REF', '1   ', '', 'CADASTRO DE CARDÁPIO PARA REFEIÇÕES', '2025-01-27 09:03:58', '5', 'CADASTRO DE CARDÁPIO PARA REFEIÇÕES')
                    MATCHING (CONTROLE, GRUPO);
					
ALTER TABLE TBREFEICOES_CARDAPIO
    ADD STATUS INTEGER DEFAULT 0;

SET TERM ^ ;

CREATE OR ALTER trigger ttbrefeicoes_cardapio_b01iu for tbrefeicoes_cardapio
active before insert or update position 1
AS
declare variable ID INTEGER;
declare variable descricao VARCHAR(100);
begin
    FOR
        select
            A.id,
            T.descricao
        from TBREFEICOES_CARDAPIO a, TBREFEICOES_TIPO T
        where a.tipo_id = new.tipo_id
        AND A.data_refeicao = NEW.data_refeicao
        AND T.id = A.tipo_id
        and a.id <> NEW.id
    INTO
        :ID,
        :descricao
    DO BEGIN
        exception "..." 'JA EXITE "'||descricao||'" PARA '||formatdate(NEW.data_refeicao);
    END
end
^

SET TERM ; ^

ALTER TABLE TBREFEICOES_TIPO
    ADD PRAZO_ALTERACAO INTEGER DEFAULT 0,
    ADD PRAZO_EXCLUSAO INTEGER DEFAULT 0;

COMMENT ON COLUMN TBREFEICOES_TIPO.PRAZO_ALTERACAO IS
'tempo para alterar em horas';

COMMENT ON COLUMN TBREFEICOES_TIPO.PRAZO_EXCLUSAO IS
'tempo para excluir em horas';

