# Sprint 6: POS Backend - Resumen

## Objetivo
Completar y mejorar el módulo de Punto de Venta (POS) con funcionalidades avanzadas: reembolsos, órdenes en espera (hold/recall), integración con cupones y estadísticas de sesión.

## Estado Inicial
El módulo POS ya contaba con funcionalidades base:
- Apertura/cierre de sesiones
- Creación de órdenes y líneas
- Procesamiento de pagos múltiples
- Anulación de órdenes
- Búsqueda de órdenes

## Componentes Mejorados

### 1. POSOrderService (Mejoras)

#### Nuevos Métodos de Reembolso:
- **createRefund()**: Crea orden de reembolso desde orden original
  - Valida orden original pagada
  - Valida cantidades a reembolsar
  - Genera líneas negativas
  - Relaciona con orden original

- **processRefundPayment()**: Procesa pago de reembolso
  - Genera movimiento de efectivo negativo
  - Actualiza totales de sesión
  - Marca reembolso como completado

#### Nuevos Métodos Hold/Recall:
- **holdOrder()**: Pone orden en espera ("parking")
  - Solo aplica a órdenes en draft
  - Guarda nombre/referencia de la orden
  - Cambia estado a confirmado con metadata

- **getHeldOrders()**: Lista órdenes en espera por sucursal

- **recallOrder()**: Recupera orden en espera
  - Asigna a sesión/caja actual
  - Vuelve a estado draft

#### Métodos Adicionales:
- **applyCouponToOrder()**: Aplica cupón a orden
- **markReceiptPrinted()**: Marca ticket como impreso
- **sendReceiptEmail()**: Envía ticket por correo
- **getSessionStats()**: Estadísticas de sesión

### 2. Controladores Nuevos

**Endpoints de Reembolso (2):**
| Método | Ruta | Descripción | Permisos |
|--------|------|-------------|----------|
| POST | `/pos/refunds` | Crear reembolso | supervisor+ |
| POST | `/pos/refunds/:id/process` | Procesar pago | supervisor+ |

**Endpoints Hold/Recall (3):**
| Método | Ruta | Descripción |
|--------|------|-------------|
| POST | `/pos/orders/:id/hold` | Poner en espera |
| GET | `/pos/orders/held` | Listar en espera |
| POST | `/pos/orders/:id/recall` | Recuperar orden |

**Endpoints Adicionales (4):**
| Método | Ruta | Descripción |
|--------|------|-------------|
| POST | `/pos/orders/:id/coupon` | Aplicar cupón |
| POST | `/pos/orders/:id/receipt/print` | Marcar impreso |
| POST | `/pos/orders/:id/receipt/send` | Enviar email |
| GET | `/pos/sessions/:id/stats` | Estadísticas |

**Total nuevos endpoints: 9**
**Total endpoints POS: 21**

### 3. Validación Zod (Nuevos Schemas)

```typescript
// Refunds
refundLineSchema
createRefundSchema
processRefundPaymentSchema

// Hold/Recall
holdOrderSchema
recallOrderSchema

// Coupon
applyCouponSchema
```

## Estructura de Archivos

```
src/modules/pos/
├── controllers/
│   └── pos.controller.ts    (605 líneas)
├── entities/
│   ├── index.ts
│   ├── pos-session.entity.ts
│   ├── pos-order.entity.ts
│   ├── pos-order-line.entity.ts
│   └── pos-payment.entity.ts
├── routes/
│   └── pos.routes.ts        (143 líneas)
├── services/
│   ├── index.ts
│   ├── pos-session.service.ts (361 líneas)
│   └── pos-order.service.ts   (915 líneas)
├── validation/
│   └── pos.schema.ts        (207 líneas)
└── index.ts
```

## Flujos de Negocio

### Flujo de Reembolso
```
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│  Original   │────▶│   Create    │────▶│   Refund    │
│   Order     │     │   Refund    │     │   (draft)   │
│   (paid)    │     │             │     │             │
└─────────────┘     └─────────────┘     └──────┬──────┘
                                               │
                                               ▼
                    ┌─────────────┐     ┌─────────────┐
                    │   Refund    │◀────│   Process   │
                    │   (paid)    │     │   Payment   │
                    └─────────────┘     └─────────────┘
```

### Flujo Hold/Recall
```
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Order     │────▶│    Hold     │────▶│   Order     │
│   (draft)   │     │   Order     │     │   (held)    │
└─────────────┘     └─────────────┘     └──────┬──────┘
                                               │
      ┌────────────────────────────────────────┘
      │
      ▼
┌─────────────┐     ┌─────────────┐
│   Recall    │────▶│   Order     │
│   Order     │     │   (draft)   │
└─────────────┘     └─────────────┘
```

## Tipos de Orden

| Tipo | Código | Descripción |
|------|--------|-------------|
| SALE | sale | Venta normal |
| REFUND | refund | Devolución |
| EXCHANGE | exchange | Cambio |

## Estados de Orden

| Estado | Descripción |
|--------|-------------|
| DRAFT | Orden en proceso |
| CONFIRMED | Confirmada / En espera (hold) |
| PAID | Pagada completamente |
| PARTIALLY_PAID | Pago parcial |
| VOIDED | Anulada |
| REFUNDED | Reembolsada |

## Permisos Requeridos

| Acción | Roles Permitidos |
|--------|------------------|
| Crear orden | Todos autenticados |
| Agregar pago | Todos autenticados |
| Anular orden | admin, manager, supervisor |
| Crear reembolso | admin, manager, supervisor |
| Procesar reembolso | admin, manager, supervisor |
| Hold/Recall | Todos autenticados |

## Estadísticas de Sesión

El endpoint `/pos/sessions/:id/stats` devuelve:
```typescript
{
  totalOrders: number;      // Órdenes completadas
  totalSales: number;       // Ventas totales
  totalRefunds: number;     // Reembolsos totales
  totalDiscounts: number;   // Descuentos aplicados
  averageTicket: number;    // Ticket promedio
  paymentBreakdown: {       // Desglose por método
    cash: number;
    credit_card: number;
    debit_card: number;
    // ...
  };
}
```

## Integración Pendiente

- [ ] Integración completa con PriceEngineService para cupones
- [ ] Envío real de email para receipts
- [ ] Generación de PDF de ticket
- [ ] Integración con impresora térmica

## Dependencias

- TypeORM 0.3.x
- Zod para validación
- BaseService para operaciones CRUD
- Middleware de autenticación y roles

## Próximos Pasos

Sprint 7 según roadmap: POS Frontend
- Layout de interfaz POS
- Pantalla de ventas
- Pantalla de cobro
- Componentes de producto
- Componentes de pago
