102 lines
9.4 KiB
Markdown
102 lines
9.4 KiB
Markdown
# 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_role` and `app.current_user_id`. Even if a user calls APIs directly or tries to bypass the UI, the database returns `0` rows for other users or hotels.
|
|
* **Code Reference**: Check [rls_and_seed.sql](../../prisma/rls_and_seed.sql) to see the SQL policies, and [auth.ts](../../src/lib/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 marked `ACTIVE`, it becomes read-only. If an administrator tries to toggle or update an active plan, the system clones the plan, increments the `version` (e.g. `v1` -> `v2`), and sets the old plan's validity end date.
|
|
* **Code Reference**: Check plan clone logic in [/api/plans/route.ts](../../src/app/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](../../src/app/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](../../src/app/api/settlements/calculate/route.ts).
|
|
|
|
### User Story 5: Immutable Auditing Log
|
|
* **The Solution**: The `audit_logs` table has database triggers that intercept and block all `UPDATE` and `DELETE` queries. 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](../../src/app/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.
|
|
1. **Login**: Go to the login screen, enter username **`director`** and password **`password123`**, then click **Iniciar Sesión**.
|
|
2. **Plan Creation**: In the top navigation header, click on **Planes** (Plans).
|
|
3. **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**.
|
|
4. **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**.
|
|
5. **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 **`v2`** in draft mode while archiving **`v1`** as inactive. This preserves historical calculations.
|
|
6. **Assign Quota**: Go to the **Metas** (Goals) tab. Click **Asignar Meta**, select `INDIVIDUAL`, choose `colaborador_mde` for period `2026-06`, set target to `100000`, 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.
|
|
1. **Logout**, then login as **`analista`** (`password123`).
|
|
2. **Excel Ingestion**: Go to **Cargar Ventas** (Upload Sales). Drag and drop [demo_sales_data.xlsx](../../public/templates/demo_sales_data.xlsx) into the loading box. Notice the success message listing imported records.
|
|
3. **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.
|
|
4. **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.
|
|
1. **Logout**, then login as the Medellin Commercial Leader **`lider_mde`** (`password123`).
|
|
2. **Regional Ingestion Boundaries**: Go to **Cargar Ventas**. Attempt to upload an Excel file containing Cartagena (`EST-CTG`) records.
|
|
3. **Expected Result**: The system rejects the file with a validation error stating that the hotel code `EST-CTG` is outside your permitted Medellin jurisdiction (`EST-MDE`).
|
|
4. **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.
|
|
1. **Logout**, then login as the Medellin Collaborator **`colaborador_mde`** (`password123`).
|
|
2. **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.
|
|
3. **Logout**, then login as the Cartagena Collaborator **`colaborador_ctg`** (`password123`).
|
|
4. **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.
|
|
1. **Logout**, then login as the Medellin Hotel Manager **`gerente_mde`** (`password123`).
|
|
2. **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 to `REJECTED`.
|
|
3. **Logout**, then login as the Cartagena Hotel Manager **`gerente_ctg`** (`password123`).
|
|
4. **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.
|
|
1. **Logout**, then login as **`consulta`** (`password123`).
|
|
2. **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.
|
|
1. **Logout**, then login as **`admin`** (`password123`).
|
|
2. **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_hash` are redacted as `[REDACTED]`.
|
|
3. **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.
|