---
id: RF-MKT-001
title: Catalogo de Productos
type: requirement
status: Draft
priority: High
epic: OQI-009
project: trading-platform
version: 1.0.0
dates:
  created: 2026-01-04
  updated: 2026-01-04
tags:
  - marketplace
  - products
  - catalog
---

# RF-MKT-001: Catalogo de Productos

## Descripcion

El Catalogo Central de Productos es el componente core del marketplace que gestiona todos los productos y servicios disponibles para compra. Provee una interfaz unificada para administrar, categorizar y presentar productos a los usuarios.

## Objetivo

Proveer un sistema centralizado de gestion de productos que permita a los administradores gestionar el catalogo y a los usuarios explorar y descubrir productos relevantes.

## Tipos de Productos

### 1. Signal Pack (`signal_pack`)
- Paquetes de senales ML adicionales
- Cantidad fija de senales por paquete
- Consumibles (se agotan con el uso)

### 2. Advisory Session (`advisory_session`)
- Sesiones de consultoria 1:1
- Duracion definida
- Reserva unica

### 3. Visualization Addon (`visualization_addon`)
- Indicadores y herramientas premium
- Suscripcion mensual o permanente

### 4. Course (`course`)
- Cursos de trading estructurados
- Acceso por compra unica
- Certificado de completitud

### 5. Ebook (`ebook`)
- Guias y manuales digitales
- Descarga permanente

## Funcionalidades

### Gestion de Productos (Admin)

```gherkin
Feature: Gestion de Productos

  Scenario: Crear nuevo producto
    Given soy administrador del sistema
    When creo un nuevo producto con:
      | campo       | valor              |
      | name        | Pro Signal Pack    |
      | type        | signal_pack        |
      | price       | 29.00              |
      | currency    | USD                |
      | category    | signals            |
    Then el producto se crea exitosamente
    And aparece en el catalogo

  Scenario: Actualizar precio de producto
    Given existe un producto "Basic Pack"
    When actualizo el precio a 12.00 USD
    Then el precio se actualiza
    And las compras existentes mantienen precio original

  Scenario: Desactivar producto
    Given existe un producto activo
    When desactivo el producto
    Then no aparece en el catalogo publico
    And los usuarios con compras previas mantienen acceso
```

### Exploracion de Catalogo (Usuario)

```gherkin
Feature: Exploracion de Catalogo

  Scenario: Ver catalogo completo
    Given soy usuario autenticado
    When accedo al marketplace
    Then veo todos los productos activos
    And veo precio, descripcion y categoria

  Scenario: Filtrar por categoria
    Given estoy en el marketplace
    When filtro por categoria "signals"
    Then veo solo productos de tipo signal_pack

  Scenario: Buscar producto
    Given estoy en el marketplace
    When busco "premium"
    Then veo productos que contienen "premium" en nombre o descripcion
```

## Categorias

| ID | Nombre | Descripcion |
|----|--------|-------------|
| signals | Senales | Paquetes de senales ML |
| advisory | Asesoria | Sesiones de consultoria |
| visualization | Visualizacion | Herramientas graficas |
| education | Educacion | Cursos y ebooks |

## Precios y Moneda

- **Moneda Base**: USD
- **Tipos de Precio**:
  - `one_time`: Compra unica
  - `subscription`: Suscripcion mensual
  - `usage_based`: Por uso (futuro)

### Ejemplo Estructura de Precios

```json
{
  "price": 29.00,
  "currency": "USD",
  "billing_type": "one_time",
  "subscription_interval": null
}
```

```json
{
  "price": 49.00,
  "currency": "USD",
  "billing_type": "subscription",
  "subscription_interval": "monthly"
}
```

## Modelo de Datos

### Tabla: `products`

| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | Identificador unico |
| name | VARCHAR(255) | Nombre del producto |
| slug | VARCHAR(255) | URL amigable |
| description | TEXT | Descripcion completa |
| short_description | VARCHAR(500) | Descripcion corta |
| type | ENUM | Tipo de producto |
| price | DECIMAL(10,2) | Precio en USD |
| currency | VARCHAR(3) | Codigo de moneda |
| billing_type | ENUM | one_time, subscription |
| subscription_interval | VARCHAR(20) | monthly, yearly |
| category_id | UUID | FK a product_categories |
| metadata | JSONB | Datos adicionales |
| is_active | BOOLEAN | Estado activo |
| is_featured | BOOLEAN | Destacado en home |
| created_at | TIMESTAMP | Fecha creacion |
| updated_at | TIMESTAMP | Fecha actualizacion |

### Tabla: `product_categories`

| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | Identificador unico |
| name | VARCHAR(100) | Nombre categoria |
| slug | VARCHAR(100) | URL amigable |
| description | TEXT | Descripcion |
| icon | VARCHAR(50) | Icono (heroicons) |
| sort_order | INT | Orden de visualizacion |
| is_active | BOOLEAN | Estado activo |

## Reglas de Negocio

1. **RN-001**: Todo producto debe tener precio > 0
2. **RN-002**: Los productos desactivados no aparecen en busquedas
3. **RN-003**: Solo administradores pueden crear/editar productos
4. **RN-004**: El slug debe ser unico por producto
5. **RN-005**: Los productos featured aparecen primero en el catalogo

## Criterios de Aceptacion

- [ ] CRUD completo de productos para admin
- [ ] Listado paginado de productos para usuarios
- [ ] Filtros por categoria, tipo y precio
- [ ] Busqueda por texto
- [ ] Vista detalle de producto
- [ ] Productos featured en homepage

## Dependencias

- **OQI-004-payments**: Para procesar compras
- **OQI-001-auth**: Para permisos de admin

## Referencias

- [US-MKT-001: Explorar Catalogo](../historias-usuario/US-MKT-001-explorar-catalogo.md)
- [ET-MKT-001: Database](../especificaciones/ET-MKT-001-database.md)
