Skip to main content

Overview

Core Projects implements a role-based access control (RBAC) system that restricts access to features and data based on user job positions (cargos). Each employee account is assigned a single role that determines their permissions throughout the application.

Role Types

The system recognizes the following primary roles defined in the cargos table:

Administrador

Full system access - complete control over all modules and configurations

Gerente

Management access - dashboards, reporting, and oversight capabilities

Directora Comercial

Sales leadership - sales operations and team management

Asesora Comercial

Sales representative - client interactions and sales execution

Contador

Accounting access - financial reports and payment tracking

Role Implementation

Database Structure

Roles are stored in the cargos (positions) table and linked to employees:
app/Models/Empleado.php
class Empleado extends Authenticatable
{
    protected $table = 'empleados';
    protected $primaryKey = 'id_empleado';

    public function cargo()
    {
        return $this->belongsTo(Cargo::class, 'id_cargo', 'id_cargo');
    }

    public function dependencia()
    {
        return $this->belongsTo(Dependencia::class, 'id_dependencia', 'id_dependencia');
    }
}
app/Models/Cargo.php
class Cargo extends Model
{
    protected $table = 'cargos';
    protected $primaryKey = 'id_cargo';

    protected $fillable = [
        'nombre',
        'descripcion'
    ];

    public function empleados()
    {
        return $this->hasMany(Empleado::class, 'id_cargo', 'id_cargo');
    }
}

Middleware Protection

The CheckCargo middleware enforces role-based access control:
app/Http/Middleware/CheckCargo.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class CheckCargo
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  ...$cargosPermitidos
     * @return mixed
     */
    public function handle(Request $request, Closure $next, ...$cargosPermitidos)
    {
        $empleado = Auth::guard('web')->user();

        if (
            !$empleado ||
            !$empleado->cargo ||
            !in_array($empleado->cargo->nombre, $cargosPermitidos)
        ) {
            abort(403, 'No tienes permiso para acceder a esta sección.');
        }

        return $next($request);
    }
}
The middleware accepts multiple role names as parameters, allowing flexible permission definitions at the route level.

Permission Matrix

Administrative Access

Administrador + Gerente
routes/web.php
Route::middleware(['auth', 'check.cargo:Gerente,Administrador'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    
    // Project Management
    Route::resource('proyectos', ProyectoController::class);
    Route::resource('empleados', EmpleadoController::class);
    
    // Configuration
    Route::get('/estados', [EstadosController::class, 'index']);
    Route::get('/dependencias-cargos', [DependenciasCargosController::class, 'index']);
    
    // Property Management
    Route::resource('torres', AdminTorreController::class);
    Route::resource('apartamentos', ApartamentoWebController::class);
    Route::resource('locales', LocalWebController::class);
    Route::resource('parqueaderos', ParqueaderoWebController::class);
    
    // Pricing Policies
    Route::resource('politicas-precio-proyecto', PoliticaPrecioProyectoWebController::class);
    
    // Admin Sales View
    Route::get('/admin/ventas', [VentaAdminController::class, 'index']);
    Route::get('/admin/clientes', [ClienteAdminController::class, 'index']);
});
  • Create, edit, and delete projects
  • Manage employees and roles
  • Configure system settings and states
  • Manage towers, floors, and properties
  • Set pricing policies
  • View all sales and client data
  • Access audit logs
  • Manage geographic data (countries, cities)

Sales Access

Directora Comercial, Asesora Comercial, Gerente, Administrador
routes/web.php
Route::middleware(['auth', 'check.cargo:Directora Comercial,Asesora Comercial,Gerente,Administrador'])
    ->group(function () {
        // Property Catalog
        Route::get('/catalogo', [CatalogoWebController::class, 'index']);
        Route::get('/catalogo/{tipo}/{id}', [CatalogoWebController::class, 'show']);
        
        // Sales Operations
        Route::resource('ventas', VentaWebController::class);
        Route::post('/ventas/separaciones/{id}/cancelar', 
            [VentaWebController::class, 'cancelarSeparacion']);
        Route::post('/ventas/separaciones/{id}/convertir-venta',
            [VentaWebController::class, 'convertirEnVenta']);
        
        // Client Management
        Route::resource('clientes', ClienteWebController::class);
        
        // Payment Plans
        Route::get('/plan-amortizacion-venta', 
            [PlanAmortizacionVentaWebController::class, 'index']);
        Route::resource('pagos', PagoWebController::class);
        
        // Sales Tools
        Route::get('cotizador', [CotizadorWebController::class, 'index']);
        Route::get('/catalogo/simulador/{tipo}/{id}', 
            [SimuladorWebController::class, 'index']);
        
        // Sales Targets
        Route::get('/metas', [MetasDashboardController::class, 'index']);
    });
  • View property catalog
  • Create and manage sales
  • Process separations and conversions
  • Manage client information
  • Create payment plans
  • Record payments
  • Use quotation tools
  • View personal sales targets

Management Access

Gerente Only
routes/web.php
Route::middleware(['auth', 'check.cargo:Gerente'])->group(function () {
    // Management Dashboard
    Route::get('/gerencia/dashboard', [GerenciaDashboardWebController::class, 'index']);
    Route::get('/gerencia/dashboard/datos', [GerenciaDashboardWebController::class, 'datos']);
    
    // Sales Target Management
    Route::get('/gerencia/metas', [MetasController::class, 'index']);
    Route::post('/gerencia/metas', [MetasController::class, 'store']);
    Route::put('/gerencia/metas/{id}', [MetasController::class, 'update']);
    Route::delete('/gerencia/metas/{id}', [MetasController::class, 'destroy']);
    
    // Reports
    Route::get('/gerencia/plan-pagos-ci/export', 
        [PlanPagosCIExportController::class, 'export']);
    Route::get('/gerencia/login-logs', [GerenciaLoginLogController::class, 'index']);
});
  • Access management dashboard with KPIs
  • Set and modify sales targets for team
  • Export payment plan reports
  • View login audit logs
  • Access advanced analytics

Accounting Access

Contador
routes/web.php
Route::middleware(['auth', 'check.cargo:Contador'])->prefix('contabilidad')->group(function () {
    // Sales Financial View
    Route::get('/ventas', [ContabilidadVentasWebController::class, 'index']);
    Route::get('/ventas/{id}', [ContabilidadVentasWebController::class, 'show']);
    
    // Financial Reports
    Route::get('/reportes/plan-pagos-ci', 
        [ContabilidadVentasWebController::class, 'planPagosCI']);
    Route::get('/reportes/plan-pagos-ci/export',
        [ContabilidadVentasWebController::class, 'exportPlanPagosCI']);
});
  • View all sales with financial details
  • Access payment tracking
  • View installment plans
  • Export financial reports
  • Read-only access to sales data

Role-Based Dashboards

Each role sees a tailored dashboard upon login:

Administrator Dashboard

  • System-wide statistics
  • Project overview
  • User management quick access
  • Recent activity logs
  • Configuration shortcuts

Manager Dashboard

app/Http/Controllers/Gerencia/GerenciaDashboardWebController.php
public function index()
{
    return Inertia::render('Gerencia/Dashboard', [
        'ventasTotales' => $this->calcularVentas(),
        'metasCumplimiento' => $this->evaluarMetas(),
        'estadisticasEquipo' => $this->estadisticasVendedores(),
        'proyectosActivos' => Proyecto::activos()->count(),
    ]);
}
Features:
  • Sales performance metrics
  • Team target tracking
  • Project sales velocity
  • Commission calculations
  • Revenue forecasting

Sales Representative Dashboard

  • Property catalog access
  • Personal sales pipeline
  • Active separations
  • Payment follow-ups
  • Personal targets and progress
  • Quick quotation tools

Accountant Dashboard

  • Pending payments overview
  • Payment plan summaries
  • Collection reports
  • Financial reconciliation tools

Authentication Flow

Checking Permissions in Code

In Controllers

use Illuminate\Support\Facades\Auth;

public function sensitiveAction()
{
    $empleado = Auth::user();
    
    if ($empleado->cargo->nombre !== 'Administrador') {
        abort(403, 'Acción no permitida');
    }
    
    // Proceed with action
}

In Blade/Vue Templates

<template>
  <div>
    <button 
      v-if="$page.props.auth.user.cargo.nombre === 'Administrador'"
      @click="deleteProject"
    >
      Eliminar Proyecto
    </button>
  </div>
</template>

In Routes (Preferred)

Route::middleware(['auth', 'check.cargo:Administrador'])->group(function () {
    // Only administrators can access these routes
});
Always enforce permissions at the route/controller level, not just in the UI. Client-side checks are for UX only and can be bypassed.

Audit Trail

The system tracks user authentication events:
app/Models/LoginLog.php
class LoginLog extends Model
{
    protected $fillable = [
        'id_empleado',
        'email',
        'ip_address',
        'user_agent',
        'login_at'
    ];

    public function empleado()
    {
        return $this->belongsTo(Empleado::class, 'id_empleado', 'id_empleado');
    }
}
Administrators and Managers can view login logs to:
  • Monitor user activity
  • Detect suspicious access patterns
  • Verify employee work hours
  • Audit system usage

Best Practices

Principle of Least Privilege

Grant users only the permissions necessary for their job function

Role-Based, Not User-Based

Define permissions by role, not individual users

Server-Side Enforcement

Always validate permissions on the backend

Audit Everything

Log sensitive actions for accountability

Architecture

System architecture and design patterns

Projects

Project management and structure