-- Configuração
DROP TABLE IF EXISTS configuracao;

CREATE TABLE IF NOT EXISTS configuracao
(
    id          INT AUTO_INCREMENT COMMENT 'Id',
    chave       VARCHAR(255) NOT NULL COMMENT 'Chave',
    valor       VARCHAR(255) NOT NULL COMMENT 'Valor',
    descricao   VARCHAR(255) NOT NULL COMMENT 'Descrição',

    PRIMARY KEY (id),
    UNIQUE INDEX chave (chave)
) COMMENT = 'Configurações do sistema';

-- Estado
DROP TABLE IF EXISTS estado;

CREATE TABLE estado
(
    id          INT COMMENT 'Id',
    uf          VARCHAR(2) NOT NULL COMMENT 'UF',
    nome        VARCHAR(100) NOT NULL COMMENT 'Nome',

    PRIMARY KEY (id)
) COMMENT = 'Tabela Estados';

-- Cidade
DROP TABLE IF EXISTS cidade;

CREATE TABLE cidade
(
    id          INT COMMENT 'Id',
    nome        VARCHAR(100) NOT NULL COMMENT 'Nome',
    latitude    FLOAT(8) NOT NULL COMMENT 'Latitude',
    longitude   FLOAT(8) NOT NULL COMMENT 'Longitude',
    capital     BOOLEAN NOT NULL COMMENT 'Capital',
    estadoFK    INT NOT NULL COMMENT 'Estado',

    PRIMARY KEY (id),
    FOREIGN KEY (estadoFK) REFERENCES estado(id)
) COMMENT = 'Tabela Cidades';

DROP TABLE IF EXISTS regimeTributario;

CREATE TABLE regimeTributario
(
    id INT AUTO_INCREMENT COMMENT 'Id',
    nome VARCHAR(255) NOT NULL COMMENT 'Nome',

    PRIMARY KEY (id)
) COMMENT = 'Tipos de regime Tributário';

-- Unidade
DROP TABLE IF EXISTS unidade;

CREATE TABLE unidade
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',                                            
    estadoFK                INT NOT NULL COMMENT 'Estado', 
    cidadeFK                INT NOT NULL COMMENT 'Cidade', 
    regimeTributarioFK      INT NOT NULL COMMENT 'Regime Tributário',                     
    nome                    VARCHAR(255) NOT NULL COMMENT 'Nome',
    razaoSocial             VARCHAR(255) COMMENT 'Razão Social',                          
    nomeFantasia            VARCHAR(255) COMMENT 'Nome Fantasia',                         
    responsavel             VARCHAR(255) COMMENT 'Responsável',                           
    cnpj                    VARCHAR(255) COMMENT 'CNPJ',                                   
    inscricaoEstadual       VARCHAR(255) COMMENT 'Inscrição Estadual',                    
    inscricaoMunicipal      VARCHAR(255) COMMENT 'Inscrição Municipal',                   
    cnae                    VARCHAR(255) COMMENT 'CNAE',                                  
    isento                  TINYINT(1) NOT NULL DEFAULT '0' COMMENT 'Isento',    
    cep                     VARCHAR(255) COMMENT 'CEP',
    bairro                  VARCHAR(255) COMMENT 'Bairro',
    logradouro              VARCHAR(255) COMMENT 'Logradouro',
    numero                  VARCHAR(255) COMMENT 'Número',
    complemento             VARCHAR(255) COMMENT 'Complemento',
    telefone                VARCHAR(255) COMMENT 'Telefone',
    celular                 VARCHAR(255) COMMENT 'Celular',
    email                   VARCHAR(255) COMMENT 'Email',
    website                 VARCHAR(255) COMMENT 'WebSite',
    observacoes             TEXT COMMENT 'Observações',  
    imagem                  VARCHAR(255) DEFAULT '/pub/default.png' COMMENT 'Imagem',   
    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',   
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',                

    PRIMARY KEY (id),
    FOREIGN KEY (estadoFK) REFERENCES estado(id),
    FOREIGN KEY (cidadeFK) REFERENCES cidade(id),
    FOREIGN KEY (regimeTributarioFK) REFERENCES regimeTributario(id)
) COMMENT = 'Dados das unidaes';

-- Área
DROP TABLE IF EXISTS area;

CREATE TABLE area
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',
    nome                    VARCHAR(255) NOT NULL COMMENT 'Nome',
    descricao               VARCHAR(255) NOT NULL COMMENT 'Descrição',
    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id)
) COMMENT = 'Áreas de usuário';

-- Situação
DROP TABLE IF EXISTS situacao;

CREATE TABLE situacao
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',
    nome                    VARCHAR(255) NOT NULL COMMENT 'Nome',
    descricao               VARCHAR(255) NOT NULL COMMENT 'Descrição',
    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id)
) COMMENT = 'Situações de um registro';

-- Usuário
DROP TABLE IF EXISTS usuario;

CREATE TABLE usuario
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',                                          
    unidadeFK               INT NOT NULL COMMENT 'Unidade',
    areaFK                  INT NOT NULL COMMENT 'Área',
    situacaoFK              INT NOT NULL COMMENT 'Situação',
    estadoFK                INT NOT NULL COMMENT 'Estado', 
    cidadeFK                INT NOT NULL COMMENT 'Cidade', 
    nome                    VARCHAR(255) NOT NULL COMMENT 'Nome',  
    nascimento              DATE DEFAULT NULL COMMENT 'Nascimento',
    login                   VARCHAR(255) NOT NULL COMMENT 'Login',   
    senha                   VARCHAR(255) NOT NULL COMMENT 'Senha',   
    email                   VARCHAR(255) NOT NULL COMMENT 'Email',
    cep                     VARCHAR(16) COMMENT 'CEP',
    bairro                  VARCHAR(255) COMMENT 'Bairro',
    logradouro              VARCHAR(255) COMMENT 'Logradouro',
    numero                  VARCHAR(16) COMMENT 'Número',
    complemento             VARCHAR(255) COMMENT 'Complemento',
    telefone                VARCHAR(255) COMMENT 'Telefone',
    celular                 VARCHAR(255) COMMENT 'Celular',
    website                 VARCHAR(255) COMMENT 'WebSite',
    observacoes             TEXT COMMENT 'Observações',  
    imagem                  VARCHAR(255) DEFAULT '/pub/default.png' COMMENT 'Foto',  
    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',                

    PRIMARY KEY (id),
    FOREIGN KEY (unidadeFK) REFERENCES unidade(id),
    FOREIGN KEY (areaFK) REFERENCES area(id),
    FOREIGN KEY (situacaoFK) REFERENCES situacao(id),
    FOREIGN KEY (estadoFK) REFERENCES estado(id),
    FOREIGN KEY (cidadeFK) REFERENCES cidade(id),
    UNIQUE INDEX email (email),
    UNIQUE INDEX login (login)
) COMMENT = 'Usuários do sistema';

-- Login
DROP TABLE IF EXISTS login;

CREATE TABLE login
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',
    ip                      VARCHAR(255) NOT NULL COMMENT 'IP',
    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id)
) COMMENT = 'Logins realizados no sistema';

-- Recuperar 
DROP TABLE IF EXISTS recuperar;

CREATE TABLE recuperar
(
    id          INT AUTO_INCREMENT COMMENT 'Id',
    usuarioFK   INT NOT NULL COMMENT 'Usuário',
    ip          VARCHAR(255) NOT NULL COMMENT 'IP',
    data        DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo       TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id),
    FOREIGN KEY (usuarioFK) REFERENCES usuario(id)
) COMMENT = 'Dados para recuperar contas no sistema';

-- Módulos do sistema
DROP TABLE IF EXISTS modulo;

CREATE TABLE modulo
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',
    ordem                   INT NOT NULL COMMENT 'Ordem',
    nome                    VARCHAR(255) NOT NULL COMMENT 'Nome',
    descricao               VARCHAR(255) NOT NULL COMMENT 'Descrição',
    icone 	            VARCHAR(255) NOT NULL COMMENT 'Ícone',
    href 	            VARCHAR(255) NOT NULL COMMENT 'HREF',
    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id)
) COMMENT = 'Módulos do sistema';

-- Items de módulo
DROP TABLE IF EXISTS moduloItem;

CREATE TABLE moduloItem
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',
    moduloFK                INT NOT NULL COMMENT 'Módulo',
    nome 	            VARCHAR(255) NOT NULL COMMENT 'Nome',
    descricao 	            VARCHAR(255) NOT NULL COMMENT 'Descrição',
    href                    VARCHAR(255) NOT NULL COMMENT 'HREF',
    classe                  VARCHAR(255) NOT NULL COMMENT 'Classe',
    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id),
    FOREIGN KEY (moduloFK) REFERENCES modulo(id)
) COMMENT = 'Módulos do sistema (Links)';

-- Permissão
DROP TABLE IF EXISTS permissao;

CREATE TABLE permissao
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',
    areaFK                  INT NOT NULL COMMENT 'Área',
    nome                    VARCHAR(255) NOT NULL COMMENT 'Nome',
    caminho                 VARCHAR(255) NOT NULL COMMENT 'Caminho',
    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id),
    FOREIGN KEY (areaFK) REFERENCES area(id)
) COMMENT = 'Permissões de usuário no sistema';

-- Pessoa Cadastro
DROP TABLE IF EXISTS pessoaCadastro;

CREATE TABLE pessoaCadastro
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',
    nome                    VARCHAR(255) NOT NULL COMMENT 'Nome',
    documento               VARCHAR(255) NOT NULL COMMENT 'Documento',
    colunaDocumento         VARCHAR(255) NOT NULL COMMENT 'Coluna Documento',
    colunaNome              VARCHAR(255) NOT NULL COMMENT 'Coluna Nome',
    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id)
) COMMENT = 'Tipos de cadastro de pessoa e tipos de documentos';

-- Pessoa Tipo
DROP TABLE IF EXISTS pessoaTipo;

CREATE TABLE pessoaTipo
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',
    nome                    VARCHAR(255) NOT NULL COMMENT 'Nome',
    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id)
) COMMENT = 'Tipos de cadastro de pessoa';

-- Pessoa
DROP TABLE IF EXISTS pessoa;

CREATE TABLE pessoa
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',
    unidadeFK               INT NOT NULL COMMENT 'Unidade',
    situacaoFK              INT NOT NULL COMMENT 'Situação', 
    pessoaCadastroFK        INT NOT NULL COMMENT 'Tipo de Cadastro',
    pessoaTipoFK            INT NOT NULL COMMENT 'Tipo de Pessoa',
    regimeTributarioFK      INT NOT NULL COMMENT 'Regime Tributário',                   
    estadoFK                INT NOT NULL COMMENT 'Estado', 
    cidadeFK                INT NOT NULL COMMENT 'Cidade', 

    nome                    VARCHAR(255) COMMENT 'Nome',
    nascimento              DATE DEFAULT NULL COMMENT 'Nascimento',
    cpf                     VARCHAR(255) COMMENT 'CPF',
    rg                      VARCHAR(255) COMMENT 'RG',

    razaoSocial             VARCHAR(255) COMMENT 'Razão Social',                          
    nomeFantasia            VARCHAR(255) COMMENT 'Nome Fantasia',                         
    responsavel             VARCHAR(255) COMMENT 'Responsável',                           
    cnpj                    VARCHAR(255) COMMENT 'CNPJ',                                
    inscricaoEstadual       VARCHAR(255) COMMENT 'Inscrição Estadual',                    
    inscricaoMunicipal      VARCHAR(255) COMMENT 'Inscrição Municipal',                   
    cnae                    VARCHAR(255) COMMENT 'CNAE',                                  
    isento                  TINYINT(1) NOT NULL DEFAULT '0' COMMENT 'Isento',

    cep                     VARCHAR(255) COMMENT 'CEP',
    bairro                  VARCHAR(255) COMMENT 'Bairro',
    logradouro              VARCHAR(255) COMMENT 'Logradouro',
    numero                  VARCHAR(255) COMMENT 'Número',
    complemento             VARCHAR(255) COMMENT 'Complemento',
    telefone                VARCHAR(255) COMMENT 'Telefone',
    celular                 VARCHAR(255) COMMENT 'Celular',
    email                   VARCHAR(255) COMMENT 'Email',
    website                 VARCHAR(255) COMMENT 'WebSite',
    observacoes             TEXT COMMENT 'Observações',

    imagem                  VARCHAR(255) DEFAULT '/pub/default.png' COMMENT 'Imagem', 

    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id),
    FOREIGN KEY (unidadeFK) REFERENCES unidade(id),
    FOREIGN KEY (situacaoFK) REFERENCES situacao(id),
    FOREIGN KEY (pessoaCadastroFK) REFERENCES pessoaCadastro(id),
    FOREIGN KEY (pessoaTipoFK) REFERENCES pessoaTipo(id),
    FOREIGN KEY (regimeTributarioFK) REFERENCES regimeTributario(id),
    FOREIGN KEY (estadoFK) REFERENCES estado(id),
    FOREIGN KEY (cidadeFK) REFERENCES cidade(id)
) COMMENT = 'Cadastro de pessoas físicas e/ou pessoas jurídicas';

-- Contatos
DROP TABLE IF EXISTS contato;

CREATE TABLE contato
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',

    unidadeFK               INT COMMENT 'Unidade',
    nome                    VARCHAR(255) NOT NULL COMMENT 'Nome',
    email                   VARCHAR(255) NOT NULL COMMENT 'Email',
    telefone                VARCHAR(255) NOT NULL COMMENT 'Telefone',
    mensagem                TEXT NOT NULL COMMENT 'Mensagem',

    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id),
    FOREIGN KEY (unidadeFK) REFERENCES unidade(id)
) COMMENT = 'Contatos do website';

DROP TABLE IF EXISTS galeria;

CREATE TABLE galeria
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',

    unidadeFK               INT COMMENT 'Unidade',
    nome                    VARCHAR(255) COMMENT 'Nome',

    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id),
    FOREIGN KEY (unidadeFK) REFERENCES unidade(id)
) COMMENT = 'Galeria';

DROP TABLE IF EXISTS galeriaImagem;

CREATE TABLE galeriaImagem
(
    id                      INT AUTO_INCREMENT COMMENT 'Id',

    galeriaFK               INT COMMENT 'Galeria',
    nome                    VARCHAR(255) COMMENT 'Nome',
    arquivo                 VARCHAR(255) COMMENT 'Arquivo',

    data                    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data',
    ativo                   TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Ativo',

    PRIMARY KEY (id),
    FOREIGN KEY (galeriaFK) REFERENCES galeria(id)
) COMMENT = 'Imagens da Galeria';
