Sistema Completo de Gestão Ministerial
Sistema completo e integrado para gestão ministerial da igreja
"E ele mesmo deu uns para apóstolos, e outros para profetas, e outros para evangelistas, e outros para pastores e doutores"
Efésios 4:11
O módulo de Gestão de Pessoas é o núcleo central do sistema CBAV, oferecendo controle completo sobre toda a estrutura organizacional da igreja, desde membros individuais até a hierarquia ministerial completa, incluindo departamentos, cargos e usuários do sistema.
Cadastro completo com dados pessoais e ministeriais
Gestão de acesso e permissões do sistema
Organização ministerial e liderança
Análises e estatísticas avançadas
Sistema completo de cadastro e gestão de membros com dados pessoais, familiares e ministeriais.
Controle de acesso ao sistema com roles e permissões granulares.
Gestão completa da estrutura ministerial com departamentos e liderança.
Organização departamental dentro dos ministérios com estrutura hierárquica.
Sistema de cargos vinculados a departamentos com controle de responsabilidades.
Sistema de controle de aniversariantes com notificações e relatórios.
Sistema completo de relatórios e estatísticas com exportação em múltiplos formatos.
Sistema de busca e filtros avançados para localizar informações rapidamente.
CREATE TABLE membros (
id BIGINT PRIMARY KEY,
nome VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE,
telefone VARCHAR(20),
data_nascimento DATE,
endereco TEXT,
cidade VARCHAR(100),
estado VARCHAR(2),
cep VARCHAR(10),
foto VARCHAR(255),
ativo BOOLEAN DEFAULT TRUE,
data_batismo DATE,
observacoes TEXT,
created_at TIMESTAMP,
updated_at TIMESTAMP
);
CREATE TABLE ministerios (
id BIGINT PRIMARY KEY,
nome VARCHAR(255) NOT NULL,
descricao TEXT,
responsavel_id BIGINT,
data_fundacao DATE,
reuniao_semanal VARCHAR(255),
observacoes TEXT,
ativo BOOLEAN DEFAULT TRUE,
cor VARCHAR(7),
created_at TIMESTAMP,
updated_at TIMESTAMP,
FOREIGN KEY (responsavel_id) REFERENCES users(id)
);
CREATE TABLE departamentos (
id BIGINT PRIMARY KEY,
nome VARCHAR(255) NOT NULL,
descricao TEXT,
ministerio_id BIGINT NOT NULL,
responsavel_id BIGINT,
observacoes TEXT,
ativo BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP,
updated_at TIMESTAMP,
FOREIGN KEY (ministerio_id) REFERENCES ministerios(id),
FOREIGN KEY (responsavel_id) REFERENCES membros(id)
);
CREATE TABLE cargos (
id BIGINT PRIMARY KEY,
nome VARCHAR(255) NOT NULL,
descricao TEXT,
departamento_id BIGINT NOT NULL,
responsabilidades TEXT,
ativo BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP,
updated_at TIMESTAMP,
FOREIGN KEY (departamento_id) REFERENCES departamentos(id)
);
CREATE TABLE membro_cargo (
id BIGINT PRIMARY KEY,
membro_id BIGINT NOT NULL,
cargo_id BIGINT NOT NULL,
data_inicio DATE,
data_fim DATE NULL,
ativo BOOLEAN DEFAULT TRUE,
observacoes TEXT,
created_at TIMESTAMP,
updated_at TIMESTAMP,
FOREIGN KEY (membro_id) REFERENCES membros(id),
FOREIGN KEY (cargo_id) REFERENCES cargos(id)
);
CREATE TABLE membro_ministerio (
id BIGINT PRIMARY KEY,
membro_id BIGINT NOT NULL,
ministerio_id BIGINT NOT NULL,
ativo BOOLEAN DEFAULT TRUE,
data_inicio DATE,
data_fim DATE NULL,
created_at TIMESTAMP,
updated_at TIMESTAMP,
FOREIGN KEY (membro_id) REFERENCES membros(id),
FOREIGN KEY (ministerio_id) REFERENCES ministerios(id),
UNIQUE KEY unique_membro_ministerio (membro_id, ministerio_id)
);
// Membros
Route::prefix('admin/people/members')->name('admin.people.members.')->group(function () {
Route::get('/', [PeopleController::class, 'members'])->name('index');
Route::get('/create', [PeopleController::class, 'createMember'])->name('create');
Route::post('/', [PeopleController::class, 'storeMember'])->name('store');
Route::get('/import', [PeopleController::class, 'importMembers'])->name('import');
Route::post('/import', [PeopleController::class, 'processImportMembers'])->name('import.process');
Route::get('/export', [PeopleController::class, 'exportMembers'])->name('export');
Route::get('/{membro}', [PeopleController::class, 'showMember'])->name('show');
Route::get('/{membro}/edit', [PeopleController::class, 'editMember'])->name('edit');
Route::put('/{membro}', [PeopleController::class, 'updateMember'])->name('update');
Route::delete('/{membro}', [PeopleController::class, 'deleteMember'])->name('delete');
Route::get('/{membro}/card', [PeopleController::class, 'memberCard'])->name('card');
Route::get('/{membro}/ficha', [PeopleController::class, 'memberCard'])->name('ficha');
});
// Usuários
Route::prefix('admin/people/users')->name('admin.people.users.')->group(function () {
Route::get('/', [PeopleController::class, 'users'])->name('index');
Route::get('/create', [PeopleController::class, 'createUser'])->name('create');
Route::post('/', [PeopleController::class, 'storeUser'])->name('store');
Route::get('/{user}', [PeopleController::class, 'showUser'])->name('show');
Route::get('/{user}/edit', [PeopleController::class, 'editUser'])->name('edit');
Route::put('/{user}', [PeopleController::class, 'updateUser'])->name('update');
Route::delete('/{user}', [PeopleController::class, 'deleteUser'])->name('delete');
Route::post('/{user}/activate', [PeopleController::class, 'activateUser'])->name('activate');
Route::post('/{user}/deactivate', [PeopleController::class, 'deactivateUser'])->name('deactivate');
Route::get('/export', [PeopleController::class, 'exportUsers'])->name('export');
Route::post('/bulk-action', [PeopleController::class, 'bulkActionUsers'])->name('bulk-action');
});
// Ministérios
Route::prefix('admin/people/ministries')->name('admin.people.ministries.')->group(function () {
Route::get('/', [PeopleController::class, 'ministries'])->name('index');
Route::get('/create', [PeopleController::class, 'createMinistry'])->name('create');
Route::post('/', [PeopleController::class, 'storeMinistry'])->name('store');
Route::get('/{ministerio}', [PeopleController::class, 'showMinistry'])->name('show');
Route::get('/{ministerio}/edit', [PeopleController::class, 'editMinistry'])->name('edit');
Route::put('/{ministerio}', [PeopleController::class, 'updateMinistry'])->name('update');
Route::delete('/{ministerio}', [PeopleController::class, 'deleteMinistry'])->name('delete');
Route::get('/export', [PeopleController::class, 'exportMinistries'])->name('export');
Route::get('/{ministerio}/export', [PeopleController::class, 'exportMinistry'])->name('ministry.export');
});
// Departamentos
Route::prefix('admin/people/departments')->name('admin.people.departments.')->group(function () {
Route::get('/', [PeopleController::class, 'departments'])->name('index');
Route::get('/create', [PeopleController::class, 'createDepartment'])->name('create');
Route::post('/', [PeopleController::class, 'storeDepartment'])->name('store');
Route::get('/{departamento}', [PeopleController::class, 'showDepartment'])->name('show');
Route::get('/{departamento}/edit', [PeopleController::class, 'editDepartment'])->name('edit');
Route::put('/{departamento}', [PeopleController::class, 'updateDepartment'])->name('update');
Route::delete('/{departamento}', [PeopleController::class, 'deleteDepartment'])->name('delete');
Route::get('/{departamento}/export', [PeopleController::class, 'exportDepartment'])->name('export');
});
// Cargos
Route::prefix('admin/people/cargos')->name('admin.people.cargos.')->group(function () {
Route::get('/', [PeopleController::class, 'cargos'])->name('index');
Route::get('/create', [PeopleController::class, 'createCargo'])->name('create');
Route::post('/', [PeopleController::class, 'storeCargo'])->name('store');
Route::get('/{cargo}/edit', [PeopleController::class, 'editCargo'])->name('edit');
Route::put('/{cargo}', [PeopleController::class, 'updateCargo'])->name('update');
Route::delete('/{cargo}', [PeopleController::class, 'deleteCargo'])->name('delete');
});
// Aniversariantes
Route::prefix('admin/people/birthdays')->name('admin.people.birthdays.')->group(function () {
Route::get('/', [PeopleController::class, 'birthdays'])->name('index');
Route::get('/upcoming', [PeopleController::class, 'upcomingBirthdays'])->name('upcoming');
Route::get('/export', [PeopleController::class, 'exportBirthdays'])->name('export');
Route::get('/upcoming/export', [PeopleController::class, 'exportUpcomingBirthdays'])->name('upcoming.export');
});
// Relatórios
Route::prefix('admin/people/reports')->name('admin.people.reports.')->group(function () {
Route::get('/', [PeopleController::class, 'reports'])->name('index');
Route::get('/export', [PeopleController::class, 'exportReports'])->name('export');
Route::get('/export-all', [PeopleController::class, 'exportAllReports'])->name('export-all');
Route::get('/members', [PeopleController::class, 'reportsMembers'])->name('members');
Route::get('/ministries', [PeopleController::class, 'reportsMinistries'])->name('ministries');
Route::get('/birthdays', [PeopleController::class, 'reportsBirthdays'])->name('birthdays');
Route::get('/statistics', [PeopleController::class, 'reportsStatistics'])->name('statistics');
Route::get('/quick/{tipo}', [PeopleController::class, 'reportsQuick'])->name('quick');
Route::get('/complete', [PeopleController::class, 'reportsComplete'])->name('complete');
});
class Membro extends Model
{
protected $fillable = [
'nome', 'email', 'telefone', 'data_nascimento',
'endereco', 'cidade', 'estado', 'cep', 'foto',
'ativo', 'data_batismo', 'observacoes'
];
protected $casts = [
'data_nascimento' => 'date',
'data_batismo' => 'date',
'ativo' => 'boolean',
];
// Relacionamento com cargos (many-to-many)
public function cargos()
{
return $this->belongsToMany(Cargo::class, 'membro_cargo')
->withPivot('data_inicio', 'data_fim', 'ativo', 'observacoes')
->withTimestamps();
}
// Relacionamento com ministérios (many-to-many)
public function ministerios()
{
return $this->belongsToMany(Ministerio::class, 'membro_ministerio')
->withPivot('ativo', 'data_inicio', 'data_fim')
->withTimestamps();
}
// Accessor para coleção de ministérios
public function getMinisteriosCollectionAttribute()
{
return collect($this->cargos->pluck('departamento.ministerio')->unique('id'));
}
// Relacionamento com usuário
public function user()
{
return $this->hasOne(User::class);
}
}
class Ministerio extends Model
{
protected $fillable = [
'nome', 'descricao', 'responsavel_id', 'data_fundacao',
'reuniao_semanal', 'observacoes', 'ativo', 'cor'
];
protected $casts = [
'ativo' => 'boolean',
'data_fundacao' => 'date',
];
// Relacionamento com departamentos
public function departamentos()
{
return $this->hasMany(Departamento::class);
}
// Relacionamento com responsável
public function responsavel()
{
return $this->belongsTo(User::class, 'responsavel_id');
}
// Relacionamento com membros através do pivot
public function membros()
{
return $this->belongsToMany(Membro::class, 'membro_ministerio')
->withPivot('ativo', 'data_inicio', 'data_fim')
->withTimestamps();
}
}
class Departamento extends Model
{
protected $fillable = [
'nome', 'descricao', 'ministerio_id',
'responsavel_id', 'observacoes', 'ativo'
];
protected $casts = [
'ativo' => 'boolean',
];
// Relacionamento com ministério
public function ministerio()
{
return $this->belongsTo(Ministerio::class);
}
// Relacionamento com responsável
public function responsavel()
{
return $this->belongsTo(Membro::class, 'responsavel_id');
}
// Relacionamento com cargos
public function cargos()
{
return $this->hasMany(Cargo::class);
}
// Relacionamento com membros através de cargos
public function membros()
{
return $this->hasManyThrough(Membro::class, Cargo::class, 'departamento_id', 'id', 'id', 'membro_id')
->join('membro_cargo', 'membros.id', '=', 'membro_cargo.membro_id')
->where('membro_cargo.ativo', true);
}
}
class Cargo extends Model
{
protected $fillable = [
'nome', 'descricao', 'departamento_id',
'responsabilidades', 'ativo'
];
protected $casts = [
'ativo' => 'boolean',
];
// Relacionamento com departamento
public function departamento()
{
return $this->belongsTo(Departamento::class);
}
// Relacionamento com membros (many-to-many)
public function membros()
{
return $this->belongsToMany(Membro::class, 'membro_cargo')
->withPivot('data_inicio', 'data_fim', 'ativo', 'observacoes')
->withTimestamps();
}
}
Sistema completo de importação/exportação de dados em múltiplos formatos.
Controle granular de acesso com roles e permissões específicas.
Geração automática de documentos e relatórios personalizados.
Painel executivo com métricas e KPIs da gestão de pessoas.
Integração completa com doações, dízimos e controle financeiro por membro.
Controle de presença e participação em eventos da igreja.
Integração com o sistema de Escola Bíblica Dominical.
Comunicação interna por ministérios e departamentos.
Notificações automáticas para membros e líderes.
Integração com o sistema de conselho e votações.