pmi/regras_de_negocio
Composer 安装命令:
composer require pmi/regras_de_negocio
包简介
Regras de Negócio da Prefeitura Municipal de Itabuna
README 文档
README
Este repositório contém as regras de negócio para o Sistema de Gestão Municipal da Prefeitura de Itabuna, implementado em PHP com Eloquent ORM.
📋 Índice
🎯 Visão Geral
Este projeto implementa a camada de regras de negócio para um sistema de gestão municipal, utilizando os padrões Repository e Service para organizar a lógica de acesso a dados e regras de negócio.
Tecnologias Utilizadas
- PHP 8+
- Illuminate/Database (Eloquent ORM)
- Padrão Repository
- Padrão Service Layer
- PSR-4 Autoloading
📁 Estrutura do Projeto
src/
├── Models/
│ ├── Estrutural/ # Models da estrutura organizacional
│ │ ├── Secretaria.php
│ │ └── Departamento.php
│ └── Intranet/ # Models da intranet municipal
│ ├── Avisos.php
│ ├── Calendario.php
│ ├── Aniversariantes.php
│ ├── Noticias.php
│ ├── Links.php
│ ├── Telefones.php
│ ├── Emails.php
│ ├── Menu.php
│ ├── Submenu.php
│ ├── SubmenuSimples.php
│ ├── Cidade.php
│ └── Estado.php
├── Repositories/
│ ├── RepositoryInterface.php
│ ├── BaseRepository.php
│ ├── Estrutural/
│ │ ├── SecretariaRepository.php
│ │ └── DepartamentoRepository.php
│ └── Intranet/
│ ├── AvisosRepository.php
│ ├── CalendarioRepository.php
│ ├── AniversariantesRepository.php
│ ├── NoticiasRepository.php
│ ├── LinksRepository.php
│ ├── TelefonesRepository.php
│ ├── EmailsRepository.php
│ ├── MenuRepository.php
│ ├── SubmenuRepository.php
│ └── SubmenuSimplesRepository.php
└── Services/
├── ServiceInterface.php
├── BaseService.php
├── Estrutural/
│ ├── SecretariaService.php
│ └── DepartamentoService.php
└── Intranet/
├── AvisosService.php
├── CalendarioService.php
├── AniversariantesService.php
├── NoticiasService.php
├── LinksService.php
├── TelefonesService.php
├── EmailsService.php
├── MenuService.php
├── SubmenuService.php
└── SubmenuSimplesService.php
🗄️ Models
Estrutural
Secretaria
Campos:
nome(string, 200 chars) - Nome da secretaria
Relacionamentos:
departamentos()- hasMany com Departamentotelefones()- hasMany com Telefonesemails()- hasMany com Emails
Departamento
Campos:
nome(string, 200 chars) - Nome do departamentosecretaria_id(int) - ID da secretaria
Relacionamentos:
secretaria()- belongsTo com Secretariatelefones()- hasMany com Telefonesemails()- hasMany com Emails
Intranet
Avisos
Campos:
tipo(string, 1 char) - Tipo do aviso (I=Informativo, A=Alerta, E=Erro, S=Sucesso)titulo(string, 200 chars) - Título do avisomensagem(string, 200 chars) - Mensagem do aviso
Calendario
Campos:
data_evento(date) - Data do eventotitulo(string, 100 chars) - Título do eventosubtitulo(string, 200 chars) - Subtítulo do evento
Aniversariantes
Campos:
data_aniversario(date) - Data de aniversáriouser_id(int) - ID do usuáriocpf(string, 14 chars) - CPF do aniversariante
Noticias
Campos:
titulo(string, 200 chars) - Título da notíciadata_noticia(date) - Data da notíciacaminho_imagem(string, 200 chars) - Caminho da imagemsubtitulo(string, 200 chars) - Subtítulo da notíciaconteudo(text) - Conteúdo da notícia
Links
Campos:
titulo(string, 200 chars) - Título do linklink(string, 200 chars) - URL do linkicone(string, 100 chars) - Ícone do link
Telefones
Campos:
numero(string, 15 chars) - Número do telefonetitulo(string, 100 chars) - Título/Descriçãosecretaria_id(int) - ID da secretariadepartamento_id(int) - ID do departamento
Relacionamentos:
secretaria()- belongsTo com Secretariadepartamento()- belongsTo com Departamento
Emails
Campos:
email(string, 200 chars) - Endereço de emailtitulo(string, 100 chars) - Título/Descriçãosecretaria_id(int) - ID da secretariadepartamento_id(int) - ID do departamento
Relacionamentos:
secretaria()- belongsTo com Secretariadepartamento()- belongsTo com Departamento
Menu
Campos:
titulo(string, 100 chars) - Título do menuicone(string, 100 chars) - Ícone do menu
Relacionamentos:
submenus()- hasMany com Submenu
Submenu
Campos:
titulo(string, 100 chars) - Título do submenulink(string, 200 chars) - Link do submenumenu_id(int) - ID do menu pai
Relacionamentos:
menu()- belongsTo com Menu
SubmenuSimples
Campos:
titulo(string, 100 chars) - Título do submenuicone(string, 100 chars) - Ícone do submenulink(string, 200 chars) - Link do submenu
🗃️ Repositories
Todos os repositories estendem BaseRepository e implementam RepositoryInterface, fornecendo:
Métodos Base
all()- Buscar todos os registrosfind($id)- Buscar por IDcreate(array $data)- Criar novo registroupdate($id, array $data)- Atualizar registrodelete($id)- Deletar registropaginate($perPage = 15)- PaginaçãofindWhere(array $criteria)- Buscar com critériosfindWhereFirst(array $criteria)- Buscar primeiro com critérioscount()- Contar total de registros
Métodos Específicos
Cada repository possui métodos específicos para suas necessidades:
SecretariaRepository:
allWithDepartamentos()- Buscar com departamentosfindWithDepartamentos($id)- Buscar por ID com departamentosfindByNome($nome)- Buscar por nomecountComDepartamentos()- Contar secretarias com departamentoscountSemDepartamentos()- Contar secretarias sem departamentos
AvisosRepository:
findByTipo($tipo)- Buscar por tipofindByTitulo($titulo)- Buscar por títulofindRecent($limit)- Buscar avisos recentescountByTipo($tipo)- Contar por tipo
CalendarioRepository:
findByData($data)- Buscar eventos por datafindBetweenDates($inicio, $fim)- Buscar entre datasfindProximosEventos($limit)- Buscar próximos eventosfindByMes($ano, $mes)- Buscar por mês
(E muitos outros métodos específicos para cada repository)
🎯 Services
Todos os services estendem BaseService e implementam ServiceInterface, fornecendo:
Métodos Base
all()- Listar todosfind($id)- Buscar por IDcreate(array $data)- Criar (com validação)update($id, array $data)- Atualizar (com validação)delete($id)- Deletar (com validação)paginate($perPage = 15)- Paginaçãocount()- Contar registros
Validações Implementadas
Cada service possui validações específicas:
- Tamanhos de campos conforme especificação
- Formatos de email e URL
- Validação de CPF (11 dígitos)
- Verificação de relacionamentos
- Prevenção de duplicatas
- Validação de datas e períodos
- Caracteres mínimos/máximos
🚀 Instalação
- Clone o repositório:
git clone https://github.com/prefeituradeitabuna/pmi_regras_de_negocio.git
cd pmi_regras_de_negocio
- Instale as dependências:
composer install
- Configure o autoloader:
{
"autoload": {
"psr-4": {
"Pmi\\RegrasDeNegocio\\": "src/"
}
}
}
💡 Uso
Básico
use Pmi\RegrasDeNegocio\Models\Estrutural\Secretaria; use Pmi\RegrasDeNegocio\Repositories\Estrutural\SecretariaRepository; use Pmi\RegrasDeNegocio\Services\Estrutural\SecretariaService; // Instanciar $model = new Secretaria(); $repository = new SecretariaRepository($model); $service = new SecretariaService($repository); // Usar $secretarias = $service->all(); $secretaria = $service->find(1); $total = $service->count();
Com Validação
try { $novaSecretaria = $service->create([ 'nome' => 'Secretaria de Educação' ]); } catch (\InvalidArgumentException $e) { echo "Erro de validação: " . $e->getMessage(); }
📝 Exemplos de Código
Exemplo 1: Gerenciar Secretarias
$secretariaService = new SecretariaService($secretariaRepository); // Criar nova secretaria $secretaria = $secretariaService->create([ 'nome' => 'Secretaria de Saúde' ]); // Buscar secretarias com departamentos $secretariasCompletas = $secretariaService->allWithDepartamentos(); // Contar secretarias que possuem departamentos $totalComDepartamentos = $secretariaService->countComDepartamentos();
Exemplo 2: Gerenciar Avisos
$avisosService = new AvisosService($avisosRepository); // Criar aviso de alerta $aviso = $avisosService->create([ 'tipo' => 'A', 'titulo' => 'Manutenção do Sistema', 'mensagem' => 'O sistema ficará indisponível entre 22h e 02h' ]); // Buscar avisos por tipo $alertas = $avisosService->findByTipo('A'); // Contar avisos de cada tipo $totalAlertas = $avisosService->countByTipo('A');
Exemplo 3: Gerenciar Eventos
$calendarioService = new CalendarioService($calendarioRepository); // Criar evento $evento = $calendarioService->create([ 'data_evento' => '2025-09-15', 'titulo' => 'Reunião Geral', 'subtitulo' => 'Reunião mensal com todos os secretários' ]); // Buscar próximos eventos $proximosEventos = $calendarioService->getProximosEventos(5); // Buscar eventos do mês atual $eventosDoMes = $calendarioService->findByMes(2025, 9);
Exemplo 4: Gerenciar Aniversariantes
$aniversariantesService = new AniversariantesService($aniversariantesRepository); // Buscar aniversariantes de hoje $aniversariantesHoje = $aniversariantesService->getAniversariantesDoDia(); // Buscar aniversariantes do mês $aniversariantesDoMes = $aniversariantesService->getAniversariantesDoMes(); // Contar aniversariantes de hoje $totalHoje = $aniversariantesService->countAniversariantesDoDia();
🔧 Funcionalidades Implementadas
✅ Repositories
- CRUD completo para todos os models
- Paginação automática
- Busca com critérios personalizados
- Relacionamentos Eloquent
- Métodos específicos para cada entidade
- Contagem de registros
✅ Services
- Validações robustas de dados
- Regras de negócio específicas
- Verificação de relacionamentos
- Tratamento de exceções
- Métodos de busca avançada
- Contagem com validações
✅ Validações
- Tamanhos de campos
- Formatos de email e URL
- Validação de CPF
- Verificação de existência
- Prevenção de duplicatas
- Validação de datas
🤝 Contribuição
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
📄 Licença
Este projeto é propriedade da Prefeitura Municipal de Itabuna.
📞 Contato
Prefeitura Municipal de Itabuna - Site Oficial
Link do Projeto: https://github.com/prefeituradeitabuna/pmi_regras_de_negocio
统计信息
- 总下载量: 0
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 1
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: Unknown
- 更新时间: 2025-09-11