# Punto de Venta + Cuentas por Cobrar — Diseño

## Resumen
Sistema de punto de venta integrado al catálogo Nexus Autoparts con:
- Ventas de partes OEM y aftermarket
- Facturación con datos fiscales (RFC, IVA, folio consecutivo)
- Cuentas a crédito para clientes frecuentes
- Pagos: abonos parciales y pago al corte
- Precios calculados por costo + margen configurable

## Tablas nuevas

### customers
| Columna | Tipo | Descripción |
|---------|------|-------------|
| id_customer | SERIAL PK | |
| name | VARCHAR(200) | Nombre del cliente |
| rfc | VARCHAR(13) | RFC fiscal |
| business_name | VARCHAR(300) | Razón social |
| email | VARCHAR(200) | |
| phone | VARCHAR(20) | |
| address | TEXT | Dirección fiscal |
| credit_limit | DECIMAL(12,2) | Límite de crédito |
| balance | DECIMAL(12,2) DEFAULT 0 | Saldo actual (lo que debe) |
| payment_terms | INTEGER DEFAULT 30 | Días de crédito |
| active | BOOLEAN DEFAULT TRUE | |
| created_at | TIMESTAMP DEFAULT NOW() | |

### invoices
| Columna | Tipo | Descripción |
|---------|------|-------------|
| id_invoice | SERIAL PK | |
| customer_id | INTEGER FK customers | |
| folio | VARCHAR(20) UNIQUE | Folio consecutivo (ej: NX-000001) |
| date_issued | TIMESTAMP DEFAULT NOW() | Fecha emisión |
| subtotal | DECIMAL(12,2) | Sin IVA |
| tax_rate | DECIMAL(5,4) DEFAULT 0.16 | Tasa IVA |
| tax_amount | DECIMAL(12,2) | Monto IVA |
| total | DECIMAL(12,2) | Total con IVA |
| amount_paid | DECIMAL(12,2) DEFAULT 0 | Total abonado |
| status | VARCHAR(20) DEFAULT 'pending' | pending/partial/paid/cancelled |
| notes | TEXT | |
| created_at | TIMESTAMP DEFAULT NOW() | |

### invoice_items
| Columna | Tipo | Descripción |
|---------|------|-------------|
| id_invoice_item | SERIAL PK | |
| invoice_id | INTEGER FK invoices | |
| part_id | INTEGER FK parts (nullable) | Pieza OEM |
| aftermarket_id | INTEGER FK aftermarket_parts (nullable) | Pieza aftermarket |
| description | VARCHAR(500) | Descripción de la línea |
| quantity | INTEGER DEFAULT 1 | |
| unit_cost | DECIMAL(12,2) | Costo unitario |
| margin_pct | DECIMAL(5,2) | Margen % aplicado |
| unit_price | DECIMAL(12,2) | Precio de venta unitario |
| line_total | DECIMAL(12,2) | quantity * unit_price |

### payments
| Columna | Tipo | Descripción |
|---------|------|-------------|
| id_payment | SERIAL PK | |
| customer_id | INTEGER FK customers | |
| invoice_id | INTEGER FK invoices (nullable) | Si aplica a factura específica |
| amount | DECIMAL(12,2) | Monto del pago |
| payment_method | VARCHAR(20) | efectivo/transferencia/cheque/tarjeta |
| reference | VARCHAR(100) | # referencia del pago |
| date_payment | TIMESTAMP DEFAULT NOW() | |
| notes | TEXT | |
| created_at | TIMESTAMP DEFAULT NOW() | |

## Columnas nuevas en tablas existentes

### parts
- `cost_usd DECIMAL(12,2)` — costo de la pieza

### aftermarket_parts
- `cost_usd DECIMAL(12,2)` — costo de la pieza aftermarket

## Configuración
- Margen default: 30% (configurable)
- IVA: 16%
- Folio format: NX-XXXXXX (consecutivo)

## Páginas web nuevas

### /pos — Punto de Venta
- Selector de cliente (buscador + crear nuevo)
- Buscador de partes (OEM y aftermarket)
- Carrito con líneas editables (costo, margen, precio)
- Botón facturar → genera factura con folio

### /cuentas — Cuentas por Cobrar
- Lista de clientes con saldos
- Detalle de cliente: facturas pendientes, historial pagos
- Registrar pago/abono
- Estado de cuenta imprimible

## Endpoints API nuevos

### Clientes
- GET /api/pos/customers — listar clientes
- GET /api/pos/customers/:id — detalle cliente con saldo
- POST /api/pos/customers — crear cliente
- PUT /api/pos/customers/:id — editar cliente

### Facturas
- GET /api/pos/invoices — listar facturas (filtros: cliente, status, fecha)
- GET /api/pos/invoices/:id — detalle factura con líneas
- POST /api/pos/invoices — crear factura (con líneas)
- PUT /api/pos/invoices/:id/cancel — cancelar factura

### Pagos
- GET /api/pos/payments — listar pagos
- POST /api/pos/payments — registrar pago/abono
- GET /api/pos/customers/:id/statement — estado de cuenta

## Flujos

### Venta
1. Seleccionar/crear cliente
2. Buscar partes → agregar al carrito
3. Ajustar margen si necesario
4. Facturar → se crea invoice + items, se suma al balance del cliente

### Pago
1. Buscar cliente → ver saldo y facturas pendientes
2. Registrar pago (monto, método, referencia)
3. Se aplica a factura o como abono general
4. Se actualiza balance del cliente
