create database if not exists rcnet_bi;
use rcnet_bi;

/** Cria a tabela perfil_cliente e insere os registros de adm e cliente */
create table if not exists rcnet_bi.perfil_empresa (
  id_perfil_empresa integer unsigned not null auto_increment,
  descricao varchar(45) not null,
  constraint pk_perfil_empresa primary key(id_perfil_empresa),
  constraint unique_descricao_perfil_empresa unique (descricao)
);
insert into perfil_empresa (descricao) values('ADMINISTRADORA');
insert into perfil_empresa (descricao) values('CLIENTE');
/**/

/* Cria a tabela empresa */
CREATE TABLE  if not exists rcnet_bi.empresa (
  id_empresa integer unsigned NOT NULL auto_increment,
  id_perfil_empresa integer unsigned not null,
  cnpj varchar(45) NOT NULL,
  ip_servidor varchar(50) NOT NULL,
  usuario_banco varchar(50) NOT NULL,
  senha_banco varchar(50) NOT NULL,
  razao_social varchar(50) NOT NULL,
  porta_banco integer(6) NOT NULL,
  data_cadastro datetime not null,
  data_ultima_alteracao datetime,
  ativa boolean not null default true,
  constraint pk_empresa PRIMARY KEY  (id_empresa),
  constraint fk_perfil_empresa foreign key (id_perfil_empresa) references perfil_empresa(id_perfil_empresa),
  constraint unique_cnpj_empresa unique(cnpj)
);
/* */

/* Cria a tabela funcionalidade */
create table if not exists rcnet_bi.funcionalidade (
  id_funcionalidade integer unsigned not null auto_increment,
  descricao varchar(45) not null,
  ativa boolean not null default true,
  constraint pk_funcionalidade primary key(id_funcionalidade),
  constraint unique_descricao_funcionalidade unique(descricao)
);
insert into rcnet_bi.funcionalidade (descricao) values ('FORMACAO_DE_PRECO');
/* */

/* Cria a tabela permissao_funcionalidade_empresa */
create table if not exists rcnet_bi.permissao_funcionalidade_empresa (
  id_funcionalidade integer unsigned not null,
  id_empresa integer unsigned not null,
  leitura boolean not null default true,
  alteracao boolean not null default true,
  exclusao boolean not null default true,
  constraint pk_permissao_empresa primary key(id_funcionalidade, id_empresa),
  constraint fk_permissao_funcionalidade_empresa_funcionalidade foreign key(id_funcionalidade) references funcionalidade(id_funcionalidade),
  constraint fk_permissao_funcionalidade_empresa_empresa foreign key(id_empresa) references empresa(id_empresa)
);
/* */

/* Cria a tabela configuracao_padrao */
CREATE TABLE if not exists rcnet_bi.tema_padrao (
  id_tema_padrao INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  nome varchar(45) not null,
  constraint pk_tema_padrao primary key(id_tema_padrao),
  constraint unique_nome_tema_padrao unique(nome)
);
insert into tema_padrao(nome) values ('DEFAULT');
/* */

/* Cria a tabela perfil_usuario */
create table if not exists rcnet_bi.perfil_usuario (
  id_perfil_usuario integer unsigned not null auto_increment,
  descricao varchar(45) not null,
  constraint pk_perfil_usuario primary key(id_perfil_usuario),
  constraint unique_descricao_perfil_usuario unique(descricao)
);
insert into perfil_usuario (descricao) value ('ADMINISTRADOR');
insert into perfil_usuario (descricao) value ('GERENTE');
insert into perfil_usuario (descricao) value ('USUARIO_COMUM');
/* */

/* Cria a tabela usuario */
create table  if not exists rcnet_bi.usuario (
  id_usuario integer unsigned not null auto_increment,
  id_empresa integer unsigned not null,
  id_perfil_usuario integer unsigned not null,
  id_tema_padrao integer unsigned not null,
  nome varchar(50) not null,
  email varchar(60) not null,
  senha varchar(45) not null,
  telefone varchar(45),
  data_cadastro datetime not null,
  data_ultimo_acesso datetime,
  data_ultima_alteracao datetime,
  ativo boolean not null default true,
  constraint pk_usuario primary key (id_usuario),
  constraint fk_usuario_empresa foreign key (id_empresa) references empresa(id_empresa),
  constraint fk_usuario_perfil_usuario foreign key (id_perfil_usuario) references perfil_usuario(id_perfil_usuario),
  constraint fk_usuario_tema_padrao foreign key (id_tema_padrao) references tema_padrao(id_tema_padrao),
  constraint unique_email_usuario unique(email)
);
/* */

/* Cria a tabela permissao_usuario */
CREATE TABLE  if not exists rcnet_bi.permissao_funcionalidade_usuario_loja (
  id_funcionalidade integer unsigned not null,
  id_usuario integer unsigned NOT NULL,
  n_loja integer unsigned not null,
  leitura boolean not null default true,
  alteracao boolean not null default true,
  exclusao boolean not null default true,
  constraint pk_permissao_usuario primary key(id_funcionalidade, id_usuario, n_loja),
  constraint fk_permissao_funcionalidade_usuario_loja_funcionalidade foreign key (id_funcionalidade) references funcionalidade(id_funcionalidade),
  constraint fk_permissao_funcionalidade_usuario_loja_usuario foreign key (id_usuario) references usuario(id_usuario)
);
/* */

/* Cria a tabela de tipo_log */
create table if not exists rcnet_bi.tipo_log (
  id_tipo_log integer unsigned not null auto_increment,
  descricao varchar(45) not null,
  constraint pk_tipo_log primary key(id_tipo_log),
  constraint unique_descricao_log unique(descricao)
);
insert into tipo_log (descricao) values ('ATIVIDADE');
insert into tipo_log (descricao) values ('ERRO');
/* */

/* Cria a tabela log_usuario */
create table if not exists rcnet_bi.log_usuario (
  id_log_usuario integer unsigned not null auto_increment,
  id_tipo_log integer unsigned not null,
  id_empresa integer unsigned not null,
  id_usuario integer unsigned not null,
  descricao varchar(100) not null,
  data_registro datetime not null,
  pilha varchar(500) comment 'Campo auxiliar para gravar informaÃ§Ãµes relevantes para o desenvolvedor. Ex: Pilha de erro.',
  constraint pk_log_usuario primary key(id_log_usuario),
  constraint fk_log_usuario_tipo_log foreign key(id_tipo_log) references tipo_log(id_tipo_log),
  constraint fk_log_usuario_empresa foreign key(id_empresa) references empresa(id_empresa),
  constraint fk_log_usuario_usuario foreign key(id_usuario) references usuario(id_usuario)
);
/* */

/* Cria a tabela log_sistema */
create table if not exists rcnet_bi.log_sistema (
  id_log_sistema integer unsigned not null auto_increment,
  id_tipo_log integer unsigned not null,
  descricao varchar(100) not null,
  data_registro datetime not null,
  pilha varchar(500) comment 'Campo auxiliar para gravar informaÃ§Ãµes relevantes para o desenvolvedor. Ex: Pilha de erro.',
  constraint pk_log_sistema primary key(id_log_sistema),
  constraint fk_log_sistema_tipo_log foreign key(id_tipo_log) references tipo_log(id_tipo_log)
);
/* */

-- Tabelas para funcionalidade de pesquisa de preÃ§o --

create table if not exists rcnet_bi.operador (
  id_operador integer unsigned not null auto_increment,
  id_empresa integer unsigned not null,
  operador_nome varchar(50) not null,
  operador_login varchar(50) not null,
  operador_senha varchar(20) not null,
  operador_ativo boolean not null default true,
  constraint pk_operador primary key (id_operador),
  constraint fk_operador_empresa foreign key(id_empresa) references empresa(id_empresa),
  constraint unique_operador_login unique(operador_login)
);

create table if not exists rcnet_bi.pesquisa (
  id_pesquisa integer unsigned not null auto_increment,
  id_empresa integer unsigned not null,
  n_loja tinyint(3) unsigned not null,
  pesquisa_nome varchar(45),
  data_inicio date not null,
  data_fim date not null,
  constraint pk_pesquisa primary key (id_pesquisa),
  constraint fk_pesquisa_empresa foreign key(id_empresa) references empresa(id_empresa)
);

create table if not exists rcnet_bi.pesquisa_operador (
  id_pesquisa_operador integer unsigned not null auto_increment,
  id_operador integer unsigned not null,
  id_pesquisa integer unsigned not null,
  constraint pk_pesquisa_operador primary key (id_pesquisa_operador),
  index fk_pesquisa_operador_operador_idx (id_operador asc),
  index fk_pesquisa_operador_pesquisa_idx (id_pesquisa asc),
  constraint fk_pesquisa_operador_operador foreign key (id_operador) references operador(id_operador),
  constraint fk_pesquisa_operador_pesquisa foreign key (id_pesquisa) references pesquisa(id_pesquisa)
);

create table if not exists rcnet_bi.pesquisa_itens (
  id_pesquisa_itens integer unsigned not null auto_increment,
  id_pesquisa integer unsigned not null,
  data_criacao datetime not null,
  setor varchar(50),
  sku varchar(14) not null,
  desc_item varchar(45) not null,
  constraint pk_pesquisa_itens primary key(id_pesquisa_itens),
  index fk_pesquisa_itens_pesquisa_idx (id_pesquisa asc),
  constraint fk_pesquisa_itens_pesquisa foreign key (id_pesquisa) references pesquisa(id_pesquisa)
);

create table if not exists rcnet_bi.concorrente (
  id_concorrente integer unsigned not null auto_increment,
  id_empresa integer unsigned not null,
  concorrente_nome varchar(50) not null,
  concorrente_endereco varchar(50) NULL ,
  concorrente_ativo boolean not null default true,
  constraint pk_concorrente primary key(id_concorrente),
  constraint fk_concorrente_empresa foreign key(id_empresa) references empresa(id_empresa)
);

create table if not exists rcnet_bi.pesquisa_concorrente (
  id_pesquisa_concorrente integer unsigned not null auto_increment,
  id_pesquisa integer unsigned not null,
  id_concorrente integer unsigned not null,
  constraint pk_pesquisa_concorrente primary key (id_pesquisa_concorrente),
  index fk_pesquisa_concorrente_pesquisa_idx (id_pesquisa asc),
  index fk_pesquisa_concorrente_concorrente_idx (id_concorrente asc),
  constraint fk_pesquisa_concorrente_pesquisa foreign key(id_pesquisa) references pesquisa(id_pesquisa),
  constraint fk_pesquisa_concorrente_concorrente foreign key (id_concorrente) references concorrente(id_concorrente)
);

CREATE TABLE IF NOT EXISTS rcnet_bi.pesquisa_itens_concorrente (
  id_pesquisa_itens_concorrente integer unsigned not null auto_increment,
  id_pesquisa_itens integer unsigned not null,
  id_pesquisa integer unsigned not null,
  id_concorrente integer unsigned not null,
  id_operador integer unsigned not null,
  preco decimal(10, 2) not null,
  data_criacao datetime not null,
  data_sincronizacao datetime not null,
  constraint pk_pesquisa_itens_concorrente PRIMARY KEY (id_pesquisa_itens_concorrente),
  INDEX fk_pesquisa_itens_concorrente_pesquisa_idx (id_pesquisa asc),
  INDEX fk_pesquisa_itens_concorrente_concorrente_idx (id_concorrente asc),
  constraint fk_pesquisa_itens_concorrente_pesquisa foreign key (id_pesquisa)references pesquisa (id_pesquisa),
  constraint fk_pesquisa_itens_concorrente_concorrente foreign key (id_concorrente) references concorrente (id_concorrente),
  constraint fk_operador foreign key (id_operador) references operador (id_operador)
);

CREATE TABLE IF NOT EXISTS rcnet_bi.taxa_tipo_pagamento (
  id_taxa_tipo_pagamento integer unsigned not null auto_increment,
  id_empresa integer unsigned not null,
  cartao varchar(50) not null,
  taxa decimal(10, 2) not null default 0.00 comment 'Taxa aplicada pelo cartão, expressa em percentual(%).',
  prazo smallint(3) not null default 0 comment 'Prazo para pagamento, expresso em dias.',
  ativo boolean not null default true,
  constraint pk_taxa_tipo_pagamento primary key(id_taxa_tipo_pagamento),
  constraint fk_empresa_taxa_tipo_pagamento foreign key(id_empresa) references rcnet_bi.empresa(id_empresa),
  constraint unique_id_empresa_cartao_taxa_tipo_pagamento unique(id_empresa, cartao)
) comment 'Tabela onde a taxa e o prazo dos cartões são registrados para o bi.';