Gestão de Pessoas

Sistema Completo de Gestão Ministerial

Gestão de Pessoas

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

Visão Geral

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.

Membros

Cadastro completo com dados pessoais e ministeriais

Usuários

Gestão de acesso e permissões do sistema

Ministérios

Organização ministerial e liderança

Relatórios

Análises e estatísticas avançadas

Módulos Principais

Gestão de Membros

Sistema completo de cadastro e gestão de membros com dados pessoais, familiares e ministeriais.

  • • Cadastro completo com dados pessoais
  • • Vinculação com cargos e departamentos
  • • Histórico ministerial detalhado
  • • Importação e exportação de dados
  • • Busca avançada e filtros
  • • Geração de fichas e carteirinhas

Gestão de Usuários

Controle de acesso ao sistema com roles e permissões granulares.

  • • Criação e gestão de usuários
  • • Sistema de roles e permissões
  • • Ativação/desativação de contas
  • • Vinculação com membros
  • • Controle de acesso por módulo
  • • Logs de atividade

Ministérios

Gestão completa da estrutura ministerial com departamentos e liderança.

  • • Criação e gestão de ministérios
  • • Definição de responsáveis
  • • Organização por departamentos
  • • Controle de atividades
  • • Relatórios de participação
  • • Exportação de dados ministeriais

Departamentos

Organização departamental dentro dos ministérios com estrutura hierárquica.

  • • Criação de departamentos por ministério
  • • Definição de responsáveis departamentais
  • • Vinculação de cargos específicos
  • • Controle de membros por departamento
  • • Relatórios departamentais
  • • Exportação de estrutura organizacional

Cargos

Sistema de cargos vinculados a departamentos com controle de responsabilidades.

  • • Criação de cargos por departamento
  • • Atribuição de responsabilidades
  • • Vinculação de membros a cargos
  • • Histórico de ocupação de cargos
  • • Controle de status (ativo/inativo)
  • • Relatórios de distribuição de cargos

Aniversariantes

Sistema de controle de aniversariantes com notificações e relatórios.

  • • Lista de aniversariantes do mês
  • • Próximos aniversários
  • • Exportação de listas
  • • Integração com notificações
  • • Relatórios de faixa etária
  • • Calendário de aniversários

Relatórios Avançados

Sistema completo de relatórios e estatísticas com exportação em múltiplos formatos.

  • • Relatórios demográficos
  • • Análises ministeriais
  • • Estatísticas de crescimento
  • • Relatórios rápidos e completos
  • • Exportação em PDF/Excel
  • • Dashboards interativos

Busca Avançada

Sistema de busca e filtros avançados para localizar informações rapidamente.

  • • Busca por nome, email, telefone
  • • Filtros por status e ministério
  • • Busca por cargo e departamento
  • • Filtros de data e localização
  • • Busca em tempo real
  • • Salvamento de filtros frequentes

Estrutura do Banco de Dados

Tabelas Principais

membros

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
);

ministerios

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)
);

departamentos

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)
);

cargos

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)
);

membro_cargo

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)
);

membro_ministerio

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)
);

Rotas e Endpoints

Estrutura de Rotas

Rotas de Membros

// 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');
});

Rotas de Usuários

// 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');
});

Rotas de Ministérios

// 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');
});

Rotas de Departamentos

// 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');
});

Rotas de Cargos e Relatórios

// 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');
});

Models e Relacionamentos

Models Principais

Membro Model

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);
    }
}

Ministerio Model

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();
    }
}

Departamento Model

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);
    }
}

Cargo Model

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();
    }
}

Funcionalidades Avançadas

Importação e Exportação

Sistema completo de importação/exportação de dados em múltiplos formatos.

  • • Importação de membros via Excel/CSV
  • • Exportação de relatórios em PDF
  • • Exportação de dados em Excel
  • • Templates de importação
  • • Validação de dados importados
  • • Logs de importação

Sistema de Permissões

Controle granular de acesso com roles e permissões específicas.

  • • Permissões por módulo
  • • Roles personalizáveis
  • • Controle de acesso departamental
  • • Permissões de edição específicas
  • • Logs de acesso
  • • Auditoria de permissões

Geração de Documentos

Geração automática de documentos e relatórios personalizados.

  • • Fichas de membros
  • • Carteirinhas personalizadas
  • • Relatórios ministeriais
  • • Listas de aniversariantes
  • • Organogramas
  • • Certificados de participação

Dashboard Executivo

Painel executivo com métricas e KPIs da gestão de pessoas.

  • • Estatísticas em tempo real
  • • Gráficos interativos
  • • Métricas de crescimento
  • • Indicadores de participação
  • • Alertas e notificações
  • • Relatórios automáticos

Integrações do Sistema

Módulos Integrados

Sistema Financeiro

Integração completa com doações, dízimos e controle financeiro por membro.

  • • Histórico de doações por membro
  • • Controle de dízimos
  • • Relatórios financeiros por ministério
  • • Metas financeiras departamentais

Sistema de Eventos

Controle de presença e participação em eventos da igreja.

  • • Inscrições automáticas por ministério
  • • Controle de presença ministerial
  • • Relatórios de participação
  • • Certificados por departamento

EBD Digital

Integração com o sistema de Escola Bíblica Dominical.

  • • Matrícula automática de membros
  • • Controle de frequência por cargo
  • • Certificados EBD
  • • Professores por departamento

Sistema de Chat

Comunicação interna por ministérios e departamentos.

  • • Salas por ministério
  • • Grupos departamentais
  • • Comunicação de liderança
  • • Notificações ministeriais

Sistema de Notificações

Notificações automáticas para membros e líderes.

  • • Aniversários de membros
  • • Eventos ministeriais
  • • Atividades departamentais
  • • Lembretes de liderança

Conselho Ministerial

Integração com o sistema de conselho e votações.

  • • Participação automática de líderes
  • • Votações por ministério
  • • Atas de reuniões
  • • Controle de presença