CREATE TABLE TBREFEITORIO_RES_AVULSO (
    ID INTEGER NOT NULL,
    DESCRICAO VARCHAR(50),
    CRACHA VARCHAR(50),
    STATUS INTEGER);

ALTER TABLE TBREFEITORIO_RES_AVULSO
ADD CONSTRAINT PK_TBREFEITORIO_RES_AVULSO
PRIMARY KEY (ID);

CREATE SEQUENCE GTBREFEITORIO_RES_AVULSO;

create trigger ttbrefeitorio_res_avulso_b01i for tbrefeitorio_res_avulso
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeitorio_res_avulso,1);
end;

ALTER TABLE TBREFEICAO_CRACHA_MESTRE
    ADD DESCRICAO VARCHAR(50);

CREATE OR ALTER trigger ttbrefeicao_cracha_mestre_b01u for tbrefeicao_cracha_mestre
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if(old.descricao <> new.descricao)then
   begin
      HISTORICO = HISTORICO || ' Descrição:'||old.descricao||' -> '||new.descricao;
   end

   if(old.cracha <> new.cracha)then
   begin
      HISTORICO = HISTORICO || ' Crachá:'||old.cracha||' -> '||new.cracha;
   end

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREFEICAO_CRACHA_MESTRE', new.id, :HISTORICO);
   End

end;

CREATE OR ALTER trigger ttbrefeicao_cracha_mestre_b01i for tbrefeicao_cracha_mestre
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicao_cracha_mestre_id,1);

    execute procedure SPI_HISTORICO('TBREFEICAO_CRACHA_MESTRE', new.id, 'Registro incluido.');
end;

CREATE trigger ttbrefeicao_cracha_mestre_b01d for tbrefeicao_cracha_mestre
active before delete position 0
AS
begin
  execute procedure SPI_HISTORICO('TBREFEICAO_CRACHA_MESTRE', old.id, 'Registro excluido.');
end;


CREATE OR ALTER trigger ttbrefeitorio_res_avulso_b01i for tbrefeitorio_res_avulso
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeitorio_res_avulso,1);

    execute procedure SPI_HISTORICO('TBREFEITORIO_RES_AVULSO', new.id, 'Registro incluido.');
end;

CREATE trigger ttbrefeitorio_res_avulso_b01d for tbrefeitorio_res_avulso
active before delete position 0
AS
begin
  execute procedure SPI_HISTORICO('TBREFEITORIO_RES_AVULSO', old.id, 'Registro excluido.');
end;

CREATE trigger ttbrefeitorio_res_avulso_b01u for tbrefeitorio_res_avulso
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if(old.descricao <> new.descricao)then
   begin
      HISTORICO = HISTORICO || ' Descrição:'||old.descricao||' -> '||new.descricao;
   end

   if(old.cracha <> new.cracha)then
   begin
      HISTORICO = HISTORICO || ' Crachá:'||old.cracha||' -> '||new.cracha;
   end

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREFEITORIO_RES_AVULSO', new.id, :HISTORICO);
   End

end;

CREATE TABLE TBREFEICAO_REG_AVULSO (
    ID INTEGER NOT NULL,
    CRACHA VARCHAR(50),
    REFEICAO_ID INTEGER,
    RESERVA_ID INTEGER,
    RESERVA INTEGER,
    DATA TIMESTAMP);

ALTER TABLE TBREFEICAO_REG_AVULSO
ADD CONSTRAINT PK_TBREFEICAO_REG_AVULSO
PRIMARY KEY (ID);

CREATE SEQUENCE GTBREFEICAO_REG_AVULSO;

create trigger ttbrefeicao_reg_avulso_b01i for tbrefeicao_reg_avulso
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicao_reg_avulso,1);
end;

DROP INDEX ITBREFEICAO_REGISTRO_02;
CREATE INDEX ITBREFEICAO_REGISTRO_02 ON TBREFEICAO_REGISTRO (COLABORADOR_ID);
ALTER TABLE TBREFEICAO_REGISTRO DROP COLABORADOR_ID;

--aqui ##########################################################
ALTER TABLE TBREFEICAO_REGISTRO ADD AVULSO INTEGER DEFAULT 0;

CREATE OR ALTER trigger ttbrefeicao_registro_b02i for tbrefeicao_registro
active before insert position 2
AS
begin
  new.refeicao = coalesce(new.refeicao, 0);
end;

CREATE OR ALTER trigger ttbrefeicao_registro_b01u for tbrefeicao_registro
active before update position 1
AS
declare variable colaborador_avulso integer;
begin
  colaborador_avulso = coalesce((select first 1 r.id from tbrefeicao_reg_avulso r where r.cracha = new.cracha),0);

  if(colaborador_avulso > 0 and new.AVULSO = 1)then
  begin
     new.reserva = coalesce(old.reserva,0);
  end

end;

CREATE trigger ttbrefeicao_reg_avulso_b02i for tbrefeicao_reg_avulso
active before insert position 2
AS
declare variable colaborador_avulso integer;
begin
  colaborador_avulso = coalesce((select first 1 r.id from tbrefeicao_reg_avulso r where r.cracha = new.cracha),0);

  if(colaborador_avulso = 0)then
  begin
     exception "..." 'Você não pode fazer reservas avulsas.';
  end
end;

CREATE trigger ttbrefeicao_reg_avulso_b01d for tbrefeicao_reg_avulso
active before delete position 0
AS
begin
  execute procedure SPI_HISTORICO('TBREFEICAO_REG_AVULSO', old.id, 'Registro excluído.');
end;

CREATE trigger ttbrefeicao_reg_avulso_b01u for tbrefeicao_reg_avulso
active before update position 1
AS
begin
  if(new.reserva <> old.reserva)then
  begin
    execute procedure SPI_HISTORICO('TBREFEICAO_REG_AVULSO', new.id, 'Reserva:'||old.reserva||' -> '||new.reserva);
  end
end;

CREATE TABLE TBREFEICAO_TROCA (
    ID INTEGER NOT NULL,
    REFEICAO_ID INTEGER,
    RESERVA_ID INTEGER,
    RESERVA INTEGER);

ALTER TABLE TBREFEICAO_TROCA
ADD CONSTRAINT PK_TBREFEICAO_TROCA
PRIMARY KEY (ID);

CREATE SEQUENCE GTBREFEICAO_TROCA;

create trigger ttbrefeicao_troca_b01i for tbrefeicao_troca
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrefeicao_troca,1);
end;

COMMENT ON TABLE TBREFEICAO_TROCA IS 'colaboradores sem refeição com troca de refeição para a catraca 2';

ALTER TABLE TBREFEICAO_TROCA
    ADD COLABORADOR_ID INTEGER;

ALTER TABLE TBREFEICAO_TROCA
    ADD TIPO INTEGER;

COMMENT ON COLUMN TBREFEICAO_TROCA.TIPO IS
'1 - adicionar
2 - remover';

ALTER TABLE TBREFEICAO_TERCEIROS
    ADD CRACHA COMPUTED BY (fn_lpad(codigo,12,'0'));

CREATE INDEX ITBREFEICAO_TERCEIROS_06
ON TBREFEICAO_TERCEIROS COMPUTED BY (fn_lpad(codigo,12,'0'));

ALTER TABLE TBREFEICAO_REGISTRO
    ADD LIVRE INTEGER DEFAULT 0;

ALTER TABLE TBREFEITORIO_REFEICAO
    ADD QTD_LIVRE INTEGER DEFAULT 0;

