What's Changed
- Roberto 260601 by @RobertoAlaluna in #1888
- Novas funcionalidades + correção de bugs - Módulo MatPat by @nicolly015 in #1889
- PR do Novo Módulo (Wegia agenda) by @PedroSchuenck in #1890
- Securities jv 2026 06 23 by @JoaoVictorPinheiroGrandini in #1892
- remove: função js para notificação aparecer sem clicar na página by @GabrielPintoSouza in #1902
- Pre master securities 2026 06 23 by @GabrielPintoSouza in #1903
- Pre master laje 260601 by @GabrielPintoSouza in #1891
- Pre release 3.9.0 by @GabrielPintoSouza in #1904
Full Changelog: 3.8.7...3.9.0
Alterações no banco de dados
Módulo Pessoa
Migração da coluna de e-mail
USE `wegia`;
-- ================================================================
-- SCRIPT DE MIGRAÇÃO: Mover coluna EMAIL de SOCIO para PESSOA
-- ================================================================
-- Data: 2026-05-07
-- Descrição: Move a coluna email da tabela socio para a tabela pessoa
-- Ambiente: Produção
-- ================================================================
-- Desativar verificação de chaves estrangeiras durante a migração
SET FOREIGN_KEY_CHECKS = 0;
-- ================================================================
-- PASSO 1: Adicionar coluna EMAIL na tabela PESSOA
-- ================================================================
ALTER TABLE `wegia`.`pessoa`
ADD COLUMN `email` VARCHAR(256) NULL DEFAULT NULL AFTER `imagem`;
-- ================================================================
-- PASSO 2: Copiar dados de EMAIL de SOCIO para PESSOA
-- ================================================================
-- Atualiza o email na tabela pessoa a partir dos dados de socio
START TRANSACTION;
UPDATE `wegia`.`pessoa` p
SET p.`email` = (
SELECT s.`email`
FROM `wegia`.`socio` s
WHERE s.`id_pessoa` = p.`id_pessoa`
LIMIT 1
)
WHERE EXISTS (
SELECT 1
FROM `wegia`.`socio` s
WHERE s.`id_pessoa` = p.`id_pessoa`
AND s.`email` IS NOT NULL
);
COMMIT;-- ================================================================
-- PASSO 3: Remover coluna EMAIL da tabela SOCIO
-- ================================================================
ALTER TABLE `wegia`.`socio`
DROP COLUMN `email`;
-- ================================================================
-- PASSO 4: Reativar verificação de chaves estrangeiras
-- ================================================================
SET FOREIGN_KEY_CHECKS = 1;
-- ================================================================
-- PASSO 5: Criar índice único para EMAIL na tabela PESSOA (opcional)
-- ================================================================
-- Descomente a linha abaixo se desejar garantir que não haja emails duplicados
-- ALTER TABLE `wegia`.`pessoa` ADD UNIQUE INDEX `uq_pessoa_email` (`email` ASC);
-- ================================================================
-- VERIFICAÇÃO: Executar após a migração para validar
-- ================================================================
-- Verificar quantidade de emails migrados
SELECT
COUNT(*) as total_pessoas_com_email,
COUNT(DISTINCT email) as emails_unicos
FROM `wegia`.`pessoa`
WHERE `email` IS NOT NULL;
-- Verificar se a coluna foi removida de socio
-- SELECT * FROM `wegia`.`socio` LIMIT 0;
-- ================================================================
-- FIM DO SCRIPT
-- ================================================================Alteração de procedure
USE `wegia`;
DROP PROCEDURE IF EXISTS `cadfuncionario`;
DELIMITER $$
CREATE PROCEDURE `cadfuncionario`(
IN `nome` VARCHAR(100),
IN `sobrenome` VARCHAR(100),
IN `cpf` VARCHAR(40),
IN `senha` VARCHAR(70),
IN `sexo` CHAR(1),
IN `email` VARCHAR(100),
IN `telefone` VARCHAR(100),
IN `data_nascimento` DATE,
IN `imagem` LONGTEXT,
IN `cep` VARCHAR(100),
IN `estado` VARCHAR(50),
IN `cidade` VARCHAR(40),
IN `bairro` VARCHAR(40),
IN `logradouro` VARCHAR(40),
IN `numero_endereco` VARCHAR(100),
IN `complemento` VARCHAR(50),
IN `ibge` VARCHAR(20),
IN `registro_geral` VARCHAR(20),
IN `orgao_emissor` VARCHAR(120),
IN `data_expedicao` DATE,
IN `nome_pai` VARCHAR(100),
IN `nome_mae` VARCHAR(100),
IN `tipo_sanguineo` VARCHAR(50),
IN `data_admissao` DATE,
IN `pis` VARCHAR(140),
IN `ctps` VARCHAR(150),
IN `uf_ctps` VARCHAR(200),
IN `numero_titulo` VARCHAR(150),
IN `zona` VARCHAR(300),
IN `secao` VARCHAR(400),
IN `certificado_reservista_numero` VARCHAR(100),
IN `certificado_reservista_serie` VARCHAR(100),
IN `id_situacao` INT,
IN `id_cargo` INT
)
BEGIN
DECLARE idP INT;
DECLARE idF INT;
INSERT INTO pessoa(cpf, senha, nome, sobrenome, sexo, email, telefone, data_nascimento, imagem, cep, estado, cidade, bairro, logradouro, numero_endereco, complemento, ibge, registro_geral, orgao_emissor, data_expedicao, nome_pai, nome_mae, tipo_sanguineo)
VALUES(cpf, senha, nome, sobrenome, sexo, email, telefone, data_nascimento, imagem, cep, estado, cidade, bairro, logradouro, numero_endereco, complemento, ibge, registro_geral, orgao_emissor, data_expedicao, nome_pai, nome_mae, tipo_sanguineo);
SELECT MAX(id_pessoa) INTO idP FROM pessoa;
INSERT INTO funcionario(id_pessoa, id_cargo, id_situacao, data_admissao, pis, ctps, uf_ctps, numero_titulo, zona, secao, certificado_reservista_numero, certificado_reservista_serie)
VALUES(idP, id_cargo, id_situacao, data_admissao, pis, ctps, uf_ctps, numero_titulo, zona, secao, certificado_reservista_numero, certificado_reservista_serie);
END$$
DELIMITER ;Módulo Material e Patrimônio
ALTER TABLE produto
ADD COLUMN ativo TINYINT(1) NOT NULL DEFAULT 1;
ALTER TABLE entrada
ADD COLUMN arquivada_por_produto_inativo TINYINT(1) NOT NULL DEFAULT 0;
ALTER TABLE saida
ADD COLUMN arquivada_por_produto_inativo TINYINT(1) NOT NULL DEFAULT 0;
ALTER TABLE ientrada
ADD COLUMN oculto_por_produto_inativo TINYINT(1) NOT NULL DEFAULT 0;
ALTER TABLE isaida
ADD COLUMN oculto_por_produto_inativo TINYINT(1) NOT NULL DEFAULT 0;Módulo Agenda
USE wegia;
CREATE TABLE IF NOT EXISTS wegia.agenda_status (
id INT NOT NULL AUTO_INCREMENT,
descricao VARCHAR(100) NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX descricao_UNIQUE (descricao ASC)
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS wegia.agenda (
id INT NOT NULL AUTO_INCREMENT,
descricao TEXT NOT NULL,
id_status INT NOT NULL,
PRIMARY KEY (id),
INDEX fk_agenda_status_idx (id_status ASC),
CONSTRAINT fk_agenda_status
FOREIGN KEY (id_status)
REFERENCES wegia.agenda_status (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS wegia.agenda_equipe_status (
id INT NOT NULL AUTO_INCREMENT,
descricao VARCHAR(100) NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX descricao_UNIQUE (descricao ASC)
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS wegia.agenda_equipe (
id INT NOT NULL AUTO_INCREMENT,
nome VARCHAR(150) NOT NULL,
id_status INT NOT NULL,
descricao TEXT NULL,
id_agenda INT NOT NULL,
inicio_turno TIME NOT NULL,
fim_turno TIME NOT NULL,
PRIMARY KEY (id),
INDEX fk_agenda_equipe_status_idx (id_status ASC),
INDEX fk_agenda_equipe_agenda_idx (id_agenda ASC),
CONSTRAINT fk_agenda_equipe_status
FOREIGN KEY (id_status)
REFERENCES wegia.agenda_equipe_status (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_agenda_equipe_agenda
FOREIGN KEY (id_agenda)
REFERENCES wegia.agenda (id)
ON DELETE CASCADE
ON UPDATE NO ACTION
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS wegia.agenda_equipe_divisao (
id INT NOT NULL AUTO_INCREMENT,
id_equipe INT NOT NULL,
nome VARCHAR(100) NOT NULL,
ativo TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (id),
INDEX fk_aed_equipe_idx (id_equipe ASC),
CONSTRAINT fk_aed_equipe
FOREIGN KEY (id_equipe)
REFERENCES wegia.agenda_equipe (id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS wegia.agenda_equipe_membro (
id INT NOT NULL AUTO_INCREMENT,
id_equipe INT NOT NULL,
id_divisao INT NULL DEFAULT NULL,
id_pessoa INT NOT NULL,
ativo TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (id),
UNIQUE INDEX uq_equipe_pessoa (id_equipe ASC, id_pessoa ASC),
INDEX fk_aem_equipe_idx (id_equipe ASC),
INDEX fk_aem_divisao_idx (id_divisao ASC),
INDEX fk_aem_pessoa_idx (id_pessoa ASC),
CONSTRAINT fk_aem_equipe
FOREIGN KEY (id_equipe)
REFERENCES wegia.agenda_equipe (id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk_aem_divisao
FOREIGN KEY (id_divisao)
REFERENCES wegia.agenda_equipe_divisao (id)
ON DELETE SET NULL
ON UPDATE CASCADE,
CONSTRAINT fk_aem_pessoa
FOREIGN KEY (id_pessoa)
REFERENCES wegia.pessoa (id_pessoa)
ON DELETE NO ACTION
ON UPDATE NO ACTION
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS wegia.agenda_alocacao (
id INT NOT NULL AUTO_INCREMENT,
id_agenda INT NOT NULL,
id_equipe INT NOT NULL,
inicio DATE NOT NULL,
fim DATE NOT NULL,
lembrete DATETIME NULL DEFAULT NULL,
lembrete_enviado TINYINT(1) NOT NULL DEFAULT 0,
intervalo INT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
INDEX fk_aa_agenda_idx (id_agenda ASC),
INDEX fk_aa_equipe_idx (id_equipe ASC),
CONSTRAINT fk_aa_agenda
FOREIGN KEY (id_agenda)
REFERENCES wegia.agenda (id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk_aa_equipe
FOREIGN KEY (id_equipe)
REFERENCES wegia.agenda_equipe (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS wegia.agenda_alocacao_periodo (
id INT NOT NULL AUTO_INCREMENT,
id_alocacao INT NOT NULL,
data_inicio DATETIME NOT NULL,
data_fim DATETIME NOT NULL,
PRIMARY KEY (id),
INDEX fk_periodo_alocacao_idx (id_alocacao ASC),
CONSTRAINT fk_periodo_alocacao
FOREIGN KEY (id_alocacao)
REFERENCES wegia.agenda_alocacao (id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS wegia.agenda_membro_periodo (
id INT NOT NULL AUTO_INCREMENT,
id_periodo INT NOT NULL,
id_pessoa INT NOT NULL,
id_divisao INT NULL DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE INDEX uq_membro_periodo_pessoa (id_periodo ASC, id_pessoa ASC),
INDEX fk_amp_periodo_idx (id_periodo ASC),
INDEX fk_amp_pessoa_idx (id_pessoa ASC),
INDEX fk_amp_divisao_idx (id_divisao ASC),
CONSTRAINT fk_amp_periodo
FOREIGN KEY (id_periodo)
REFERENCES wegia.agenda_alocacao_periodo (id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk_amp_pessoa
FOREIGN KEY (id_pessoa)
REFERENCES wegia.pessoa (id_pessoa)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_amp_divisao
FOREIGN KEY (id_divisao)
REFERENCES wegia.agenda_equipe_divisao (id)
ON DELETE SET NULL
ON UPDATE CASCADE
) ENGINE = InnoDB;
INSERT IGNORE INTO recurso (id_recurso, descricao) VALUES
('10', 'Módulo Agenda'),
('101', 'Gerenciar Agenda'),
('102', 'Gerenciar Equipe'),
('103', 'Visualizar Agenda');
INSERT IGNORE INTO modulos_visiveis (id_recurso, visivel) VALUES (10, 1);
INSERT IGNORE INTO agenda_status (descricao) VALUES ('Ativo'), ('Inativo');
INSERT IGNORE INTO agenda_equipe_status (descricao) VALUES ('Ativo'), ('Inativo');