CREATE TABLE TBCALENDARIO_EVENTO (
    ID INTEGER NOT NULL,
    TITULO INTEGER,
    LOCAL INTEGER,
    REPETIR INTEGER,
    LEMBRETE INTEGER,
    DESCRICAO BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    DIA_INTEIRO INTEGER,
    INICIO TIMESTAMP,
    FIM TIMESTAMP,
    PRIVACIDADE INTEGER,
    STATUS INTEGER,
    PRIORIDADE INTEGER);

ALTER TABLE TBCALENDARIO_EVENTO
ADD CONSTRAINT PK_TBCALENDARIO_EVENTO
PRIMARY KEY (ID);

COMMENT ON COLUMN TBCALENDARIO_EVENTO.LEMBRETE IS
'-1 nao, maior que menos -1 igual ao minuto do lenmbrete';

COMMENT ON COLUMN TBCALENDARIO_EVENTO.DIA_INTEIRO IS
'0 nao, 1 sim';

COMMENT ON COLUMN TBCALENDARIO_EVENTO.PRIVACIDADE IS
'1-particular
2-publico';

CREATE SEQUENCE GTBCALENDARIO_EVENTO;

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

COMMENT ON TABLE TBCALENDARIO_EVENTO IS 'cadastro de eventos e lembretes';

CREATE TABLE TBCALENDARIO_EVENTO_CATEG (
    ID INTEGER NOT NULL,
    CALENDARIO_EVENTO_ID INTEGER,
    CATEGORIA_ID INTEGER);

ALTER TABLE TBCALENDARIO_EVENTO_CATEG
ADD CONSTRAINT PK_TBCALENDARIO_EVENTO_CATEG
PRIMARY KEY (ID);

CREATE SEQUENCE GTBCALENDARIO_EVENTO_CATEG;

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

CREATE TABLE TBCALENDARIO_EVENTO_TAG (
    ID INTEGER NOT NULL,
    CALENDARIO_EVENTO_ID INTEGER,
    TAG VARCHAR(50));

ALTER TABLE TBCALENDARIO_EVENTO_TAG
ADD CONSTRAINT PK_TBCALENDARIO_EVENTO_TAG
PRIMARY KEY (ID);

CREATE SEQUENCE GTBCALENDARIO_EVENTO_TAG;

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

CREATE TABLE TBCALENDARIO_CATEGORIA (
    ID INTEGER NOT NULL,
    DESCRICAO VARCHAR(50),
    STATUS INTEGER,
    COR VARCHAR(20));

ALTER TABLE TBCALENDARIO_CATEGORIA
ADD CONSTRAINT PK_TBCALENDARIO_CATEGORIA
PRIMARY KEY (ID);

CREATE SEQUENCE GTBCALENDARIO_CATEGORIA;

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

CREATE TABLE TBCALENDARIO_EVENTO_PART (
    ID INTEGER NOT NULL,
    USUARIO_ID INTEGER,
    STATUS INTEGER,
    CALENDARIO_EVENTO_ID INTEGER);

ALTER TABLE TBCALENDARIO_EVENTO_PART
ADD CONSTRAINT PK_TBCALENDARIO_EVENTO_PART
PRIMARY KEY (ID);

CREATE SEQUENCE GTBCALENDARIO_EVENTO_PART;

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

ALTER TABLE TBCALENDARIO_EVENTO
    ALTER TITULO TYPE VARCHAR(100),
    ALTER LOCAL TYPE VARCHAR(100);

ALTER TABLE TBCALENDARIO_EVENTO
    ADD USUARIO_ID INTEGER;

ALTER TABLE TBCALENDARIO_EVENTO
    ADD TIPO INTEGER;

COMMENT ON COLUMN TBCALENDARIO_EVENTO.TIPO IS
'1-LEMBRETE
2-EVENTO';

ALTER TABLE TBCALENDARIO_EVENTO DROP LEMBRETE;

ALTER TABLE TBCALENDARIO_EVENTO
    ADD LEMBRAR INTEGER;

CREATE trigger ttbcalendario_evento_b02i for tbcalendario_evento
active before insert position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( NEW.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'Registro Incluido';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCALENDARIO_EVENTO',NEW.ID, HISTORICO);
    END

end;

CREATE OR ALTER procedure spi_notificar (
    hora timestamp,
    usuario_id varchar(500),
    assunto varchar(500),
    corpo blob sub_type 1 segment size 80,
    email integer = 1,
    notificacao integer = 1)
as
declare variable email_id integer;
declare variable destinatario varchar(100);
begin

    DESTINATARIO = (SELECT FIRST 1 u.email FROM TBUSUARIO U WHERE U.codigo = :USUARIO_ID);

    IF ( NOTIFICACAO = 1 ) THEN
    BEGIN

        INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
           VALUES (
            1,
            :USUARIO_ID,
            0,
            0,
            :ASSUNTO,
            0,
            0,
            :HORA,
            :USUARIO_ID,
            :HORA,
            0,
            '',
            0,
            :CORPO
        );

    END

    IF ( EMAIL = 1 ) THEN
    BEGIN

        EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);

        INSERT INTO TBEMAIL (
            ID,
            EMAIL,
            USUARIO_ID,
            ASSUNTO,
            CORPO,
            STATUS,
            DATAHORA
        ) VALUES (
            :EMAIL_ID,
            :DESTINATARIO,
            0,
            :ASSUNTO,
            :CORPO,
            0,
            :HORA
        );
    end
end;

CREATE OR ALTER trigger ttbcalendario_evento_b01d for tbcalendario_evento
active before delete position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

    HISTORICO = '';

    IF ( old.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'Registro Excluído';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCALENDARIO_EVENTO',old.ID, HISTORICO);
    END

end;

CREATE OR ALTER trigger ttbcalendario_evento_b02u for tbcalendario_evento
active before update position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( NEW.titulo <> old.titulo) THEN
    BEGIN
        HISTORICO = HISTORICO||' Titulo:'||old.titulo||' -> '||new.titulo;
    END

    IF ( NEW.local <> old.local) THEN
    BEGIN
        HISTORICO = HISTORICO||', Local:'||old.local||' -> '||new.local;
    END

    IF ( NEW.prioridade <> old.prioridade) THEN
    BEGIN
        HISTORICO = HISTORICO||', Prioridade:'||old.prioridade||' -> '||new.prioridade;
    END

    IF ( NEW.inicio <> old.inicio) THEN
    BEGIN
        HISTORICO = HISTORICO||', Início:'||formatdatetime(old.inicio)||' -> '||formatdatetime(new.inicio);
    END

    IF ( NEW.fim <> old.fim) THEN
    BEGIN
        HISTORICO = HISTORICO||', Fim:'||formatdatetime(old.fim)||' -> '||formatdatetime(new.fim);
    END

    IF ( NEW.tipo <> old.tipo) THEN
    BEGIN
        HISTORICO = HISTORICO||', Tipo:'||old.tipo||' -> '||new.tipo;
    END

    IF ( NEW.privacidade <> old.privacidade) THEN
    BEGIN
        HISTORICO = HISTORICO||', Privacidade:'||old.privacidade||' -> '||new.privacidade;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCALENDARIO_EVENTO',NEW.ID, HISTORICO);
    END
end;



CREATE trigger ttbcalendario_evento_part_b02i for tbcalendario_evento_part
active before insert position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

    HISTORICO = 'Envolvido adicionado:'||coalesce((select iif(coalesce(u.nome,'') <> '', u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_id),new.usuario_id);
    EXECUTE PROCEDURE SPI_HISTORICO('TBCALENDARIO_EVENTO',new.calendario_evento_id, HISTORICO);

end;

CREATE trigger ttbcalendario_evento_part_b01d for tbcalendario_evento_part
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

    HISTORICO = 'Envolvido excluído:'||coalesce((select iif(coalesce(u.nome,'') <> '', u.nome, u.usuario) from tbusuario u where u.codigo = old.usuario_id),old.usuario_id);
    EXECUTE PROCEDURE SPI_HISTORICO('TBCALENDARIO_EVENTO',old.calendario_evento_id, HISTORICO);

end;

