2026-07-29 10:43:54 +00:00
|
|
|
# Proforma Delete Contract
|
|
|
|
|
|
|
|
|
|
## Objetivo
|
|
|
|
|
|
|
|
|
|
Definir el borrado funcional de proformas sin romper trazabilidad ni numeracion.
|
|
|
|
|
|
|
|
|
|
## Reglas funcionales
|
|
|
|
|
|
|
|
|
|
- solo se pueden borrar proformas en estado `draft`
|
|
|
|
|
- `sent`, `approved`, `rejected` e `issued` devuelven conflicto
|
|
|
|
|
- `rejected` no se borra; queda reservado para una futura operacion de archivado
|
|
|
|
|
- el borrado es logico mediante `deleted_at`
|
2026-07-29 16:23:57 +00:00
|
|
|
- el borrado de `draft` no depende de `archived_at`
|
|
|
|
|
- una proforma `draft` archivada puede borrarse directamente
|
|
|
|
|
- una proforma `rejected` archivada no puede borrarse
|
2026-07-29 10:43:54 +00:00
|
|
|
- la numeracion no se reutiliza
|
|
|
|
|
- no se decrementa `document_series.next_number`
|
|
|
|
|
- no se borran fisicamente `proforma_items` ni `proforma_taxes`
|
|
|
|
|
|
|
|
|
|
## Validaciones defensivas
|
|
|
|
|
|
|
|
|
|
- si `linked_invoice_id` tiene valor, el borrado se bloquea
|
|
|
|
|
- si existe `issued_invoices.source_proforma_id = proforma.id`, el borrado se bloquea
|
|
|
|
|
|
|
|
|
|
## Contrato REST
|
|
|
|
|
|
|
|
|
|
- endpoint: `DELETE /proformas/:proforma_id`
|
|
|
|
|
- respuesta satisfactoria: `204 No Content`
|
|
|
|
|
- `404 Not Found` si no existe, no pertenece a la empresa activa o ya esta borrada
|
|
|
|
|
- `409 Conflict` si existe pero no cumple las reglas de borrado
|
|
|
|
|
|
|
|
|
|
## Efecto operativo
|
|
|
|
|
|
|
|
|
|
- `GET /proformas/:id` debe tratar la proforma borrada como inexistente
|
|
|
|
|
- `GET /proformas` no debe incluir proformas borradas
|
2026-07-29 20:24:53 +00:00
|
|
|
- `GET /proformas` puede listar activas, archivadas o todas segun `Criteria filters[]`, pero nunca borradas
|
2026-07-29 10:43:54 +00:00
|
|
|
- `PUT /proformas/:id` no debe editar proformas borradas
|
|
|
|
|
- `POST /proformas/:id/issue` no debe emitir proformas borradas
|
|
|
|
|
|
|
|
|
|
## UI
|
|
|
|
|
|
|
|
|
|
- la accion `Eliminar` solo debe mostrarse para proformas `draft`
|
2026-07-29 16:23:57 +00:00
|
|
|
- en la vista de archivadas, `Eliminar` tambien debe mostrarse para `draft`
|
2026-07-29 10:43:54 +00:00
|
|
|
- la confirmacion debe advertir que la referencia no se reutilizara
|
2026-07-29 16:23:57 +00:00
|
|
|
- en esta fase la accion esta disponible en el listado activo y en archivadas para `draft`
|