# Manual validation Guia minima de validacion manual para el cierre V1 de `document-series`. No requiere nueva infraestructura de tests automatizados. ## Objetivo Confirmar que `document-series` es la fuente operativa unica para series y numeracion nueva de `customer-invoices` y que las restricciones funcionales V1 siguen activas. ## Precondiciones - BD de desarrollo con tablas `document_series`, `proformas` e `issued_invoices` - DDL de `docs/customer-invoices/sql/add-proforma-document-series-columns.sql` aplicada si `proformas` aun no tiene las columnas nuevas - DDL de `docs/customer-invoices/sql/add-proforma-tax-config-columns.sql` aplicada si `proformas` aun no tiene las columnas nuevas - seed o migracion conservadora de `docs/document-series/sql/migrate-customer-invoice-series-to-document-series.sql` aplicada solo si el entorno parte de `customer_invoice_series` - backend arrancado con `apps/server/.env.development` o equivalente seguro de desarrollo ## Casos recomendados 1. Asignacion de `issued_invoice` desde `document-series` - crear o dejar activa una serie `issued_invoice` - emitir una factura desde el flujo normal - comprobar que la referencia/numero resultante coincide con `prefix + padded(next_number) + suffix` - comprobar que `document_series.next_number` se incrementa exactamente en 1 2. Asignacion de `proforma` desde `document-series` - crear o dejar activa una serie `proforma` - crear una proforma desde el flujo normal - comprobar que `proformas.document_series_id`, `proformas.proforma_number` y `proformas.proforma_reference` quedan informados - comprobar que `proforma_reference` usa el formato de la serie asignada 3. Serie inactiva - desactivar una serie - intentar asignar numeracion con esa serie - comprobar que el caso falla y no incrementa `next_number` 4. Vigencia invalida - configurar una serie con ventana fuera de fecha - intentar asignar numeracion - comprobar que el caso falla y no incrementa `next_number` 5. API canonica de series documentales - llamar a `/document-series` filtrando `document_type = proforma` e `is_active = true` - llamar a `/document-series` filtrando `document_type = issued_invoice` e `is_active = true` - comprobar que la respuesta refleja filas activas de `document_series` 6. Endpoint legacy retirado - llamar a `/catalogs/invoice-series` - comprobar `404` o endpoint no registrado 7. Create de proforma sin lineas - crear una proforma con `items = []` - comprobar que devuelve `items = []` - comprobar que devuelve `taxes = []` - comprobar que los totales monetarios quedan a `0` - comprobar que `tax_config` queda persistido y se devuelve en `GET /proformas/:id` 8. Administración de serie - comprobar que una primera asignación marca `has_assigned_numbers` y que un rollback no conserva la marca; - comprobar que `PATCH /document-series/:id/next-number` solo acepta un valor mayor; - comprobar que marcar una inactiva como default falla; - comprobar que desactivar una default la desmarca y no selecciona otra; - comprobar que cambios de prefijo, sufijo o padding no alteran referencias ya persistidas. 9. UI Settings - abrir `/settings/billing/document-series` desde Settings > Billing; - crear una serie y comprobar código, tipo, contador inicial, estado y default; - editar nombre, formato y vigencia, verificando que código y tipo no están disponibles; - avanzar el contador a un valor superior y comprobarlo en la tabla; - cambiar la serie default y comprobar que la anterior deja de serlo; - desactivar una default y comprobar la advertencia, que queda inactiva y sin default; - reactivarla y comprobar que no recupera el default; - comprobar búsqueda, filtros de tipo/estado, ordenación y paginación. ## Pendiente conocido `branchId` aun no se propaga desde `customer-invoices` hasta `assignNextNumber(...)`. Toda la validacion de esta fase debe asumirse en alcance de empresa. ## Estado Fase 2C en este workspace - configuracion de desarrollo detectada: si - ejecucion real de SQL desde Codex: no - motivo: falta cliente `mysql` en la terminal y la dependencia `mysql2` del workspace no pudo abrirse por una dependencia transitiva ausente