Gestão de Conselhos e Votações
Sistema completo para gestão de conselhos e votações
"Porque onde estiverem dois ou três reunidos em meu nome, aí estou eu no meio deles"
Mateus 18:20
O módulo de Conselho Ministerial oferece ferramentas completas para gestão de reuniões de conselho, votações, atas e controle de presença. Permite transparência e organização no processo decisório da igreja.
Controle de membros do conselho
Votações seguras e transparentes
Gestão de atas e documentos
Controle completo dos membros do conselho e suas funções.
Sistema de agenda e programação de reuniões do conselho.
Votações seguras e transparentes com controle de quórum.
Sistema completo para criação e gestão de atas de reuniões.
Registro e controle de presença nas reuniões do conselho.
Relatórios detalhados sobre atividades do conselho.
CREATE TABLE conselho_reunioes (
id BIGINT PRIMARY KEY,
titulo VARCHAR(255) NOT NULL,
descricao TEXT,
data_reuniao DATETIME NOT NULL,
local VARCHAR(255),
status ENUM('agendada', 'em_andamento', 'concluida', 'cancelada'),
quorum_minimo INT,
created_at TIMESTAMP,
updated_at TIMESTAMP
);
CREATE TABLE conselho_pautas (
id BIGINT PRIMARY KEY,
reuniao_id BIGINT,
titulo VARCHAR(255) NOT NULL,
descricao TEXT,
ordem INT,
tempo_estimado INT,
status ENUM('pendente', 'discutido', 'votado', 'arquivado'),
created_at TIMESTAMP,
updated_at TIMESTAMP
);
CREATE TABLE conselho_votacoes (
id BIGINT PRIMARY KEY,
reuniao_id BIGINT,
pauta_id BIGINT,
titulo VARCHAR(255) NOT NULL,
descricao TEXT,
tipo ENUM('sim_nao', 'multipla_escolha', 'secreta'),
opcoes JSON,
resultado JSON,
status ENUM('aberta', 'fechada', 'cancelada'),
created_at TIMESTAMP,
updated_at TIMESTAMP
);
CREATE TABLE conselho_votos (
id BIGINT PRIMARY KEY,
votacao_id BIGINT,
conselheiro_id BIGINT,
voto VARCHAR(255),
justificativa TEXT,
anonimo BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP,
updated_at TIMESTAMP
);
CREATE TABLE conselho_atas (
id BIGINT PRIMARY KEY,
reuniao_id BIGINT,
conteudo TEXT,
aprovada BOOLEAN DEFAULT FALSE,
data_aprovacao DATETIME,
aprovada_por BIGINT,
arquivo_pdf VARCHAR(255),
created_at TIMESTAMP,
updated_at TIMESTAMP
);
// Rotas Admin
Route::prefix('admin/conselho')->name('admin.conselho.')->middleware(['auth', 'admin'])->group(function () {
Route::get('/', [ConselhoController::class, 'index'])->name('index');
Route::resource('reunioes', ConselhoReuniaoController::class);
Route::resource('votacoes', ConselhoVotacaoController::class);
Route::resource('atas', ConselhoAtaController::class);
Route::get('agenda', [ConselhoController::class, 'agenda'])->name('agenda');
Route::get('voting', [ConselhoController::class, 'voting'])->name('voting');
});
// Rotas Member
Route::prefix('member/conselho')->name('member.conselho.')->middleware(['auth'])->group(function () {
Route::get('/', [ConselhoMemberController::class, 'index'])->name('index');
Route::get('reunioes', [ConselhoMemberController::class, 'reunioes'])->name('reunioes');
Route::get('votacoes', [VotacaoMemberController::class, 'index'])->name('votacoes');
Route::post('votar', [VotacaoMemberController::class, 'votar'])->name('votar');
});
// ConselhoReuniaoController.php
public function store(Request $request)
{
$request->validate([
'titulo' => 'required|string|max:255',
'descricao' => 'nullable|string',
'data_reuniao' => 'required|date|after:now',
'local' => 'nullable|string|max:255',
'quorum_minimo' => 'nullable|integer|min:1'
]);
$reuniao = ConselhoReuniao::create([
'titulo' => $request->titulo,
'descricao' => $request->descricao,
'data_reuniao' => $request->data_reuniao,
'local' => $request->local,
'quorum_minimo' => $request->quorum_minimo,
'status' => 'agendada'
]);
// Notificar conselheiros
$this->notificarConselheiros($reuniao);
return redirect()->route('admin.conselho.reunioes.index')
->with('success', 'Reunião agendada com sucesso!');
}
// ConselhoVotacaoController.php
public function store(Request $request)
{
$request->validate([
'reuniao_id' => 'required|exists:conselho_reunioes,id',
'pauta_id' => 'nullable|exists:conselho_pautas,id',
'titulo' => 'required|string|max:255',
'descricao' => 'nullable|string',
'tipo' => 'required|in:sim_nao,multipla_escolha,secreta',
'opcoes' => 'nullable|array'
]);
$votacao = ConselhoVotacao::create([
'reuniao_id' => $request->reuniao_id,
'pauta_id' => $request->pauta_id,
'titulo' => $request->titulo,
'descricao' => $request->descricao,
'tipo' => $request->tipo,
'opcoes' => $request->opcoes,
'status' => 'aberta'
]);
return redirect()->back()
->with('success', 'Votação criada com sucesso!');
}
// VotacaoMemberController.php
public function votar(Request $request)
{
$request->validate([
'votacao_id' => 'required|exists:conselho_votacoes,id',
'voto' => 'required|string',
'justificativa' => 'nullable|string'
]);
$votacao = ConselhoVotacao::findOrFail($request->votacao_id);
// Verificar se já votou
if ($votacao->votos()->where('conselheiro_id', auth()->user()->id)->exists()) {
return back()->with('error', 'Você já votou nesta questão!');
}
ConselhoVoto::create([
'votacao_id' => $request->votacao_id,
'conselheiro_id' => auth()->user()->id,
'voto' => $request->voto,
'justificativa' => $request->justificativa,
'anonimo' => $votacao->tipo === 'secreta'
]);
return redirect()->back()
->with('success', 'Voto registrado com sucesso!');
}
Análise detalhada de todas as reuniões do conselho.
Análise de votações e resultados.
Análise de participação dos conselheiros.
Controle de atas e documentos.
Integração com o sistema de gestão de membros para conselheiros.
Notificações automáticas para conselheiros e administradores.
Controle granular de acesso baseado em roles do conselho.
Relatórios consolidados sobre atividades do conselho.