9.4 KiB
9.4 KiB
Recruiter Showcase Guide: Hoteles Estelar Variable Remuneration System
Welcome to the walkthrough guide for the Hoteles Estelar Variable Remuneration & Commissions System. This document outlines how a developer or recruiter can explore the system, understand how it resolves critical enterprise user stories, and verify its production-grade design and architecture.
1. Project Overview & Tech Stack
The system is built as a highly secure, multi-tenant enterprise app designed to calculate, manage, and audit commercial sales commissions for the Hoteles Estelar franchise.
Technology Stack
- Framework: Next.js (App Router, Turbopack)
- Database: PostgreSQL with Prisma ORM
- Security: Database-level Row-Level Security (RLS) and cryptographic webhook signature validation
- Automation: n8n workflows for background calculations and AI-driven compliance auditing
- Styling: Vanilla CSS, configured with a high-fidelity dark mode, glassmorphism, and responsive dashboards
2. Core User Stories & Technical Solutions
User Story 1: Strict Data Segregation (Row-Level Security)
- The Solution: PostgreSQL RLS policies enforce segregation directly in the database. When any query runs, the system dynamically sets the session variables
app.current_user_roleandapp.current_user_id. Even if a user calls APIs directly or tries to bypass the UI, the database returns0rows for other users or hotels. - Code Reference: Check rls_and_seed.sql to see the SQL policies, and auth.ts to see how session contexts are injected.
User Story 2: Plan Versioning & Rules Configuration
- The Solution: The system implements plan locking. When a plan is in
DRAFT, rules can be edited. When it is markedACTIVE, it becomes read-only. If an administrator tries to toggle or update an active plan, the system clones the plan, increments theversion(e.g.v1->v2), and sets the old plan's validity end date. - Code Reference: Check plan clone logic in /api/plans/route.ts.
User Story 3: Atomic Bulk Sales Import
- The Solution: Excel sheets are parsed and checked against strict validation constraints (non-existent users, negative amounts, invalid periods, incorrect hotel codes). The validation is atomic—if even one row fails, the entire transaction is rolled back. The UI presents an inconsistency panel highlighting exactly which cells failed.
- Code Reference: View sheet parsing in /api/sales/import/route.ts.
User Story 4: Automated Calculations & Retroactive Clawbacks
- The Solution: The n8n calculation workflow triggers the settlement engine. The engine queries previous months' sales. If a sale was returned/cancelled, it applies a retroactive delta adjustment (clawback) to the current month's payout.
- Code Reference: See settlement computations in /api/settlements/calculate/route.ts.
User Story 5: Immutable Auditing Log
- The Solution: The
audit_logstable has database triggers that intercept and block allUPDATEandDELETEqueries. The Admin dashboard features an interactive Audit Logs Explorer displaying side-by-side JSON diff panels showing what changed. - Code Reference: View audit logs logic in /api/audit-logs/route.ts.
3. Step-by-Step Exploration Guide (All 10 Showcase Roles)
You can access the walkthrough version of the app at: https://hotels-demo.gaboggamer.online
Step A: The Planner Experience (director)
- Role Purpose: Represents the commercial planner who configures commissions and rules globally.
- Login: Go to the login screen, enter username
directorand passwordpassword123, then click Iniciar Sesión. - Plan Creation: In the top navigation header, click on Planes (Plans).
- Action: Click Nuevo Plan, enter details (e.g., Name:
Plan Especial Q3 2026, Code:EST-Q3-26, Type:COMMISSION, Start/End Dates covering June to August 2026), and click Guardar. - Configure Rules: Find the plan in the table, click the Reglas icon, configure tiered commission brackets (e.g. 0% to 90% achievement = 0% rate, 90.01% to 110% achievement = 2.5% rate), and click Guardar Reglas.
- Activate & Test Versioning: Return to the plans list. Click the toggle to set the status to ACTIVO. Now, click the edit toggle button again. Notice the system blocks direct modification and instead clones the plan to
v2in draft mode while archivingv1as inactive. This preserves historical calculations. - Assign Quota: Go to the Metas (Goals) tab. Click Asignar Meta, select
INDIVIDUAL, choosecolaborador_mdefor period2026-06, set target to100000, and click Guardar Meta.
Step B: The Global Finance Operations Experience (analista)
- Role Purpose: Represents the finance analyst who uploads sales lists and triggers calculation runs globally.
- Logout, then login as
analista(password123). - Excel Ingestion: Go to Cargar Ventas (Upload Sales). Drag and drop demo_sales_data.xlsx into the loading box. Notice the success message listing imported records.
- Idempotency Check: Drag and drop the same file again. The system blocks the upload with a warning:
Error: Código de lote duplicado (Llave de idempotencia ya registrada), showing duplicate transaction prevention. - Simulation & Calculation: Go to the Simulación tab. Select period
2026-06. Uncheck Modo Simulación to commit calculations. Click Calcular Liquidaciones. Wait 5-10 seconds for the n8n webhook response. The settlements table renders with AI-generated audit observations.
Step C: The Regional Commercial Leader Experience (lider_mde vs lider_ctg)
- Role Purpose: Demonstrates regional boundaries. Leaders can only load sales for their own hotel.
- Logout, then login as the Medellin Commercial Leader
lider_mde(password123). - Regional Ingestion Boundaries: Go to Cargar Ventas. Attempt to upload an Excel file containing Cartagena (
EST-CTG) records. - Expected Result: The system rejects the file with a validation error stating that the hotel code
EST-CTGis outside your permitted Medellin jurisdiction (EST-MDE). - Logout, then login as
lider_ctg(password123). Upload a Cartagena sales file; notice it succeeds only for Cartagena.
Step D: The Collaborator Experience (colaborador_mde vs colaborador_ctg)
- Role Purpose: Shows complete personal data segregation using Row-Level Security.
- Logout, then login as the Medellin Collaborator
colaborador_mde(password123). - Personal Data Isolation: Go to Historial and Metas. Observe that you only see Medellin (
EST-MDE) records and sales targets. All other collaborators' data is hidden. - Logout, then login as the Cartagena Collaborator
colaborador_ctg(password123). - Expected Result: Only Cartagena (
EST-CTG) records are returned. The database RLS filters the query dynamically based on the session user ID, returning zero results for other hotels.
Step E: The Regional Manager Experience (gerente_mde vs gerente_ctg)
- Role Purpose: Demonstrates regional segregation in approval workflows.
- Logout, then login as the Medellin Hotel Manager
gerente_mde(password123). - Approval Segregation: Navigate to the Aprobaciones (Approvals) tab. You see pending settlements only for Medellin. Click Rechazar on the Medellin settlement, enter rejection reason:
"Falta validar soporte físico", and submit. The status transitions toREJECTED. - Logout, then login as the Cartagena Hotel Manager
gerente_ctg(password123). - Expected Result: You only see Cartagena pending settlements. Click Aprobar on the Cartagena settlement; its status transitions to
APPROVED, which triggers an audit log.
Step F: The Read-Only Auditor Compliance Experience (consulta)
- Role Purpose: Verification of auditing read-only visibility.
- Logout, then login as
consulta(password123). - Read-Only Inspection: Navigate through Plans, Goals, and the Dashboard. Notice that while you can view all data globally across all hotels, all editing, uploading, and approval buttons are completely disabled or hidden.
Step G: The System Administrator Experience (admin)
- Role Purpose: Master control view and security log auditing.
- Logout, then login as
admin(password123). - Audit Explorer: Navigate to the Auditoría tab. Select any log. The side-by-side JSON diff panel displays the exact changes made. Notice that sensitive fields like
password_hashare redacted as[REDACTED]. - Immutability Check: Try to edit or delete any log entry. The database trigger blocks the mutation immediately, throwing an error.
4. Visual Aesthetics & Polish
When presenting this, highlight:
- Glassmorphism: Elegant card borders, subtle shadows, and dark translucent backdrops.
- Micro-animations: Smooth hover transitions on tables, buttons, and form elements.
- Dynamic Charts: Interactive charts that auto-adjust with filters, rendering region comparisons and historic performance trends.
- Language Switcher: Dynamically switches the UI and AI-generated text between English and Spanish.