Endpoints / Proformas

PUT

Reemplazar proforma

Reemplaza completamente el contenido editable de una proforma emitida en una sola operación atómica, incluyendo cliente, método de pago, montos y detalle de items.

PUT/proformas/:id

Caso de Uso

Se usa cuando la aplicación necesita guardar la edición completa de una proforma desde el formulario de edición, enviando el estado final del detalle. Al usarlo, el usuario obtiene la proforma actualizada con su nuevo contenido y el PDF regenerado.

Autenticación

Requiere token JWT en el header `Authorization: Bearer <token>`. Permite acceso a usuarios con rol jefe o empleado. La empresa y el usuario autenticado deben estar activos.

Parámetros de ruta

idstringobligatorio

Identificador de la proforma a reemplazar.

Body

prfmaclnteidstringobligatorio

Identificador del cliente receptor; debe existir y estar activo.

prfmampidstringobligatorio

Identificador del método de pago; debe existir y estar activo.

prfmasubtotalnumberobligatorio

Subtotal de la proforma; debe ser mayor o igual a cero y coincidir con la suma de los totales de los items.

prfmadescuentonumberobligatorio

Descuento total aplicado; debe ser mayor o igual a cero.

prfmatotalnumberobligatorio

Total de la proforma; debe ser igual a subtotal - descuento y no puede ser negativo.

dprfmaproductosarrayobligatorio

Arreglo completo del detalle final; representa el estado final de los items. Cada item contiene: dprfmaid (opcional), dprfmaesinventariable (boolean), dprfmacodigo (string, condicional), dprfmadescripcion (string), dprfmacantidad (number > 0), dprfmapreciounitario (number > 0), dprfmapreciototal (number > 0).

Reglas de negocio

1

Solo un usuario con rol jefe o empleado puede reemplazar proformas.

2

Solo permite reemplazar proformas de la empresa del usuario autenticado.

3

La empresa del usuario autenticado debe estar activa.

4

El usuario autenticado debe estar activo.

5

Solo una proforma en estado emitida puede editarse.

6

El body representa el detalle completo final; no es una lista parcial de cambios.

7

Una línea con dprfmaid enviado se actualiza; sin dprfmaid se inserta como nueva.

8

Una línea existente que no aparece en el arreglo se elimina.

9

No se permiten dprfmaid duplicados en el arreglo.

10

Todo dprfmaid enviado debe pertenecer a la proforma indicada.

11

El cliente y el método de pago deben existir y estar activos.

12

No se permiten códigos de producto inventariable duplicados entre los items.

13

Todo item inventariable requiere dprfmacodigo, que debe corresponder a un producto existente y activo.

14

El backend no recalcula los totales; valida la consistencia de los montos.

15

Esta operación no descuenta stock ni afecta el inventario.

16

Al completar el reemplazo se regenera el PDF con el contenido actualizado.

Errores esperados

401No autorizado

No se envió un token JWT válido o el token no contiene información válida del usuario.

400El id de proforma es requerido

No se envió el parámetro id en la ruta.

400El id de proforma es requerido

prfmaid en el body fue enviado vacío.

400El id de cliente es requerido

prfmaclnteid fue enviado vacío o no es un texto.

400El id de método de pago es requerido

prfmampid fue enviado vacío o no es un texto.

400El valor debe ser un número válido

Uno de los campos numéricos no es un número ni texto numérico.

400El número es requerido

Uno de los campos numéricos fue enviado vacío.

400El subtotal debe ser mayor o igual a cero

prfmasubtotal tiene un valor negativo.

400El descuento debe ser mayor o igual a cero

prfmadescuento tiene un valor negativo.

400El total debe ser mayor o igual a cero

prfmatotal tiene un valor negativo.

400Los items de proforma son requeridos

dprfmaproductos no es un arreglo o está vacío.

400dprfmaesinventariable debe ser un booleano

dprfmaesinventariable en un item no es un valor booleano.

400La cantidad debe ser mayor a cero

dprfmacantidad de un item es menor o igual a 0.

400El precio unitario debe ser mayor a cero

dprfmapreciounitario de un item es menor o igual a 0.

400El nombre de producto es requerido

dprfmadescripcion de un item fue enviado vacío.

400El total del item debe ser mayor a cero

dprfmapreciototal de un item es menor o igual a 0.

400El código de producto debe ser un texto

dprfmacodigo de un item no es un texto válido.

400El código de producto es requerido para items inventariables

Un item tiene dprfmaesinventariable: true pero dprfmacodigo está vacío.

400El código de producto es requerido

Un item no inventariable tiene dprfmacodigo enviado pero vacío.

404Proforma no encontrada

No existe una proforma con el id indicado dentro de la empresa del usuario autenticado.

409Solo las proformas emitidas pueden editarse

La proforma no está en estado emitida; las proformas pagadas o anuladas no pueden editarse.

409El subtotal no coincide con la suma de los items

La suma de dprfmapreciototal de todos los items no coincide con prfmasubtotal.

409El total no coincide con el subtotal menos el descuento

prfmatotal no es igual a prfmasubtotal - prfmadescuento.

409El total de la proforma no puede ser negativo

prfmasubtotal - prfmadescuento da un valor negativo.

409El detalle de proforma no pertenece a esta proforma

Uno o más dprfmaid enviados no pertenecen a la proforma indicada.

409La proforma tiene ids de detalle duplicados

Hay dprfmaid repetidos en el arreglo de items.

409La proforma tiene productos duplicados en los items

Hay dos o más items inventariables con el mismo dprfmacodigo.

409El código de producto inventariable no existe

El dprfmacodigo de un item inventariable no corresponde a un producto existente.

409El producto inventariable no está activo

El producto referenciado por dprfmacodigo no está en estado activo.

500La empresa no existe

La empresa asociada al usuario autenticado no fue encontrada.

500La empresa no está activa

La empresa asociada al usuario autenticado está inactiva.

500El usuario no existe

El usuario autenticado no fue encontrado dentro de su empresa.

500El usuario no pertenece a la empresa

El usuario autenticado no pertenece a la empresa indicada por su sesión.

500El usuario no está activo

El usuario autenticado está inactivo y no puede usar el sistema.

500El usuario no es jefe o empleado

El usuario autenticado no tiene un rol permitido para reemplazar proformas.

Notas de uso

1

Este endpoint no recibe query params.

2

El body debe contener el estado final completo del detalle; no envíes solo cambios parciales.

3

Las líneas sin dprfmaid se insertan como nuevas; las líneas con dprfmaid se actualizan.

4

Las líneas existentes que no aparecen en el arreglo se eliminan.

5

Esta operación no descuenta stock; el descuento de inventario ocurre al pagar la proforma.

6

El PDF se regenera automáticamente al completar el reemplazo.