t4-minicore
T4-Minicore: Sistema de Cálculo de Comisiones por Ventas (MVC + RBAC)
Plataforma web empresarial para el registro transaccional de ventas y liquidación escalonada de comisiones comerciales.
Construida bajo el patrón arquitectónico Modelo-Vista-Controlador (MVC) desacoplado con Control de Acceso Basado en Roles (RBAC).
📑 Tabla de Contenidos
- ✨ Características Destacadas
- 🔑 Credenciales de Acceso y Roles
- 🏛️ Arquitectura MVC Desacoplada
- 🔄 Flujo Operativo y Matriz RBAC
- 📱 Diseño Adaptativo (Responsive Service)
- 🛠️ Tecnologías Utilizadas (Tech Stack)
- 📁 Estructura del Repositorio
- 🚀 Instalación y Puesta en Marcha
- 🌐 Matriz de Endpoints REST API
- 👩💻 Autora y Contacto
✨ Características Destacadas
- 👑 Panel Exclusivo de Administración (
/admin):- Gestión de Vendedores: alta, consulta, modificación y baja de personal de ventas.
- Reglas Escalonadas de Comisión: definición dinámica de metas de venta y porcentajes de incentivo aplicados.
- Reporte Consolidado Global: auditoría por rango de fechas que calcula el total vendido y la comisión devengada por cada asesor comercial.
- 💼 Portal Personal del Vendedor (
/portal-vendedor):- Registro Seguro de Ventas: registro de transacciones con monto y fecha; el backend asigna automáticamente la autoría a partir del token JWT del vendedor autenticado.
- Cálculo de Comisión en Tiempo Real: consulta de monto acumulado vendido, porcentaje alcanzado en las escalas y comisión neta ganada en el periodo.
- Historial Transaccional: auditoría de ventas individuales registradas por el usuario en sesión.
- 🛡️ Seguridad de Doble Capa (Client & Server RBAC):
- En cliente: guards funcionales de Angular (
authGuard,adminGuard,vendedorGuard). - En servidor: filtros antes de acción (
require_admin,require_admin_or_vendedor) y aislamiento a nivel de consulta en base de datos.
- En cliente: guards funcionales de Angular (
- 📱 Adaptabilidad Móvil y Tema Claro (Light Theme):
- Interfaz responsiva con diseño limpio, tablas completas en escritorio y tarjetas de inspección rápida en dispositivos móviles gracias a Angular CDK Layout.
🔑 Credenciales de Acceso y Roles
El sistema cuenta con usuarios de prueba sembrados en la base de datos con contraseñas encriptadas mediante Bcrypt:
| Rol del Sistema | Correo Electrónico | Contraseña | Destino en Login | Permisos y Alcance |
|---|---|---|---|---|
| 👑 Administrador | admin@t4-minicore.com |
password123 |
/admin |
Control total: gestión de vendedores, reglas comerciales, reporte consolidado global y administración de usuarios (/users). |
| 💼 Vendedor | vendedor@t4-minicore.com |
password123 |
/portal-vendedor |
Operativa comercial: registrar ventas propias, auditar comisiones ganadas e historial personal (ID de Vendedor asociado: #3). |
🏛️ Arquitectura MVC Desacoplada
La solución aplica el patrón Modelo-Vista-Controlador de manera estricta y desacoplada:
flowchart LR
subgraph ViewLayer["👁️ VISTA (Angular SPA - Light Theme)"]
LoginUI["Login (/login)"]
AdminUI["Panel Admin (/admin)"]
SellerUI["Portal Vendedor (/portal-vendedor)"]
end
subgraph ControllerLayer["🎮 CONTROLADOR (Lucky Actions)"]
AuthAction["Api::SignIns::Create"]
VendAction["Api::Vendedor::* (require_admin)"]
ReglaAction["Api::Regla::* (require_admin)"]
VentaAction["Api::Ventas::* (RBAC Guard)"]
end
subgraph ModelLayer["🧠 MODELO (Avram ORM & PostgreSQL)"]
UserModel["User & UserToken"]
VendModel["Vendedor (has_many Ventas)"]
ReglaModel["Regla (Escalones)"]
VentaModel["Venta (belongs_to Vendedor)"]
end
ViewLayer <-->|Peticiones HTTP REST + JWT| ControllerLayer
ControllerLayer <-->|Consultas Seguras & Serializers| ModelLayer
| Capa MVC | Responsable Tecnológico | Módulos Clave | Función en el Sistema |
|---|---|---|---|
| 🧠 Modelo | Avram ORM (Crystal) | User, Vendedor, Regla, Venta |
Define la estructura de datos, claves foráneas, validaciones de negocio en SaveOperations y el hashing unidireccional con Bcrypt. |
| 🎮 Controlador | Lucky Actions (Crystal) | Api::SignIns::Create, Api::Vendedor::*, Api::Regla::*, Api::Ventas::* |
Enruta peticiones HTTP, verifica tokens JWT, aplica filtros de autorización según rol y serializa la respuesta JSON. |
| 👁️ Vista | Angular SPA & Serializers | Login, Admin, PortalVendedor |
Interfaz de usuario reactiva en tema claro con señales (Signals), adaptativa a cualquier tamaño de pantalla. |
🔄 Flujo Operativo y Matriz RBAC
sequenceDiagram
autonumber
actor Vendedor
participant Web as Angular Frontend
participant API as Lucky API Controller
participant DB as PostgreSQL (Avram)
Vendedor->>Web: Ingresa credenciales (vendedor@t4-minicore.com)
Web->>API: POST /api/sign_ins
API->>DB: Valida hash Bcrypt y recupera rol regular + vendedor_id (3)
API-->>Web: Retorna JWT con claims { role: "Regular", vendedor_id: 3 }
Web->>Web: Guarda token y redirige a /portal-vendedor (vendedorGuard OK)
Vendedor->>Web: Registra venta (monto: $1,500, fecha: hoy)
Web->>API: POST /api/ventas (Bearer Token)
API->>API: Detecta rol regular: inyecta automáticamente vendedor_id = 3
API->>DB: Guarda venta vinculada al vendedor #3
API-->>Web: 201 Created (VentaSerializer)
Vendedor->>Web: Consulta comisiones del periodo
Web->>API: GET /api/ventas?reporte=true
API->>DB: Consulta ventas exclusivas del vendedor #3 y reglas activas
API->>API: Calcula escalón alcanzado (ej. total >= $1,000 -> 5%)
API-->>Web: 200 OK con { total_vendido, porcentaje_comision, comision_calculada }
Web-->>Vendedor: Renderiza tarjetas de métricas e historial
📱 Diseño Adaptativo (Responsive Service)
La aplicación utiliza un servicio centralizado reactivo basado en @angular/cdk/layout:
// src/app/core/services/responsive.service.ts
@Injectable({ providedIn: 'root' })
export class ResponsiveService {
private breakpointObserver = inject(BreakpointObserver);
private screenWidth = toSignal(
this.breakpointObserver.observe([
'(max-width: 600px)',
'(min-width: 601px) and (max-width: 1000px)',
'(min-width: 1001px)'
])
);
isMobile = computed(() => !!this.screenWidth()?.breakpoints['(max-width: 600px)']);
isTablet = computed(() => !!this.screenWidth()?.breakpoints['(min-width: 601px) and (max-width: 1000px)']);
isDesktop = computed(() => !!this.screenWidth()?.breakpoints['(min-width: 1001px)']);
}
- Modo Escritorio (
isDesktop): Tablas de datos completas, paneles en dos columnas y controles alineados horizontalmente. - Modo Móvil (
isMobile): Conversión automática a tarjetas compactas individuales (.cards-list), formularios apilados verticalmente y botones de acción accesibles.
🛠️ Tecnologías Utilizadas (Tech Stack)
Backend
- Crystal Language: Lenguaje compilado fuertemente tipado con rendimiento cercano a C.
- Lucky Framework v1.5: Framework MVC rápido y seguro contra errores en tiempo de compilación.
- Avram ORM: Manejo de entidades, migraciones y consultas SQL seguras.
- Authentic: Hashing seguro de contraseñas con Bcrypt y generación de JWT.
Frontend
- Angular v22: Framework empresarial SPA.
- Angular Signals: Gestión de estado reactivo y granular.
- Angular CDK Layout: Detección de breakpoints para comportamiento responsivo.
- Angular Router & Guards: Control de navegación perimetral.
- CSS3 Simple (Light Theme): Paleta moderna basada en blanco (
#ffffff), grises suaves (#f8fafc,#e2e8f0) y verde azulado corporativo (#0d9488).
Base de Datos
- PostgreSQL: Motor relacional con integridad referencial y claves foráneas.
📁 Estructura del Repositorio
t4-minicore/
├── t4-minicore-api/ # ⚙️ Backend en Lucky Framework (Crystal)
│ ├── config/ # Configuración de base de datos, cookies y tokens
│ ├── db/
│ │ ├── migrations/ # Migraciones estructurales (Users, Vendedores, Ventas, Reglas)
│ │ └── seed/ # Semillas con datos iniciales (sample_data.cr)
│ └── src/
│ ├── actions/ # 🎮 Controladores
│ │ ├── api_action.cr # Control base con require_admin y require_vendedor
│ │ └── api/
│ │ ├── sign_ins/create.cr # Endpoint de autenticación (JWT)
│ │ ├── vendedor/ # CRUD REST de vendedores (Solo Admin)
│ │ ├── regla/ # CRUD REST de reglas de comisión (Solo Admin)
│ │ ├── ventas/ # Registro y reporte de comisiones (Admin y Vendedor)
│ │ └── users/ # CRUD de usuarios del sistema
│ ├── models/ # 🧠 Modelos Avram
│ │ ├── user.cr # Usuario con rol y vendedor_id foráneo
│ │ ├── vendedor.cr # Entidad vendedor vinculada a ventas y usuario
│ │ ├── venta.cr # Registro de transacción comercial
│ │ └── regla.cr # Escalones de monto mínimo y porcentaje
│ ├── operations/ # Operaciones de guardado y validaciones
│ └── serializers/ # Serializadores JSON (ComisionSerializer, VendedorSerializer, etc.)
│
├── t4-minicore-web/ # 🎨 Frontend en Angular 22 (SPA)
│ └── src/app/
│ ├── core/
│ │ ├── guards/ # Protecciones de ruta (authGuard, adminGuard, vendedorGuard)
│ │ ├── interceptors/ # Inyección de Bearer Token en peticiones HTTP
│ │ └── services/ # AuthService, ComisionesService, VendedorService, ReglaService, ResponsiveService
│ ├── pages/ # Vistas de la aplicación
│ │ ├── login/ # Inicio de sesión con redirección por rol
│ │ ├── admin/ # Panel de administración (vendedores, reglas y reporte global)
│ │ ├── portal-vendedor/ # Portal del vendedor (registrar venta y mis comisiones)
│ │ └── users/ # Gestión de usuarios
│ └── shared/models/ # Modelos e interfaces TypeScript
│
└── README.md # Documentación integral del sistema
🚀 Instalación y Puesta en Marcha
Prerrequisitos
- Crystal
>= 1.10.0y Lucky CLI - Node.js
>= 18.xy npm - PostgreSQL
>= 14.xen ejecución local
Paso 1: Clonar el Repositorio
git clone git@github.com:SaraChiriboga/t4-minicore.git
cd t4-minicore
Paso 2: Configurar y Levantar el Backend (t4-minicore-api)
- Ingresar a la carpeta de la API:
cd t4-minicore-api - Instalar dependencias de Crystal:
shards install - Configurar variables de base de datos en
.env(si es necesario):DB_HOST=localhost DB_PORT=5432 DB_USER=lucky DB_PASSWORD=lucky - Crear la base de datos y correr las migraciones:
lucky db.create lucky db.migrate - Cargar las semillas de prueba (vendedores, ventas, reglas y usuarios de acceso):
crystal run db/seed/sample_data.cr - Iniciar el servidor API (puerto
3000):lucky dev # o directamente: crystal run src/t4_minicore_api.cr
Paso 3: Configurar y Levantar el Frontend (t4-minicore-web)
- Abrir una nueva terminal y navegar a la carpeta web:
cd t4-minicore-web - Instalar dependencias de Node:
npm install - Compilar y levantar la aplicación de desarrollo:
ng serve - Ingresar desde el navegador web:
http://localhost:4200
🌐 Matriz de Endpoints REST API
| Módulo | Método | Endpoint | Permiso Requerido | Descripción |
|---|---|---|---|---|
| Auth | POST |
/api/sign_ins |
Público | Autentica credenciales y emite token JWT con rol. |
| Vendedor | GET |
/api/vendedor |
Admin | Lista todos los vendedores. |
| Vendedor | POST |
/api/vendedor |
Admin | Crea un nuevo vendedor. |
| Vendedor | PUT |
/api/vendedor/:id |
Admin | Modifica datos del vendedor. |
| Vendedor | DELETE |
/api/vendedor/:id |
Admin | Elimina un vendedor. |
| Reglas | GET |
/api/regla |
Admin | Lista los escalones de comisión. |
| Reglas | POST |
/api/regla |
Admin | Crea una nueva regla de comisión. |
| Reglas | PUT |
/api/regla/:id |
Admin | Actualiza una regla existente. |
| Reglas | DELETE |
/api/regla/:id |
Admin | Elimina una regla. |
| Ventas | POST |
/api/ventas |
Admin o Vendedor | Registra venta. Vendedor auto-asigna su ID; Admin puede asignar cualquiera. |
| Ventas | GET |
/api/ventas |
Admin o Vendedor | Lista ventas. Si es Vendedor, aísla solo sus transacciones. |
| Reporte | GET |
/api/ventas?reporte=true |
Admin o Vendedor | Calcula comisiones según fechas y reglas. Vendedor ve solo su ganancia. |
| Usuarios | * |
/api/users/** |
Admin | CRUD integral de cuentas de acceso. |
👩💻 Autora y Contacto
Repository
t4-minicore
Owner
Statistic
- 0
- 0
- 0
- 0
- 0
- 38 minutes ago
- October 12, 2026
License
Links
Synced at
Mon, 12 Oct 2026 17:49:32 GMT
Languages