docs: add design and implementation plans
- SaaS + aftermarket design spec - SaaS + aftermarket implementation plan (15 tasks) - Captura partes design - POS + cuentas design and plan Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
130
docs/plans/2026-03-02-pos-cuentas-design.md
Normal file
130
docs/plans/2026-03-02-pos-cuentas-design.md
Normal file
@@ -0,0 +1,130 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user