Endpoints / Proformas

POST

Crear proforma

Registra una nueva proforma en estado emitida para la empresa del usuario autenticado, con detalle completo de items, y genera su documento PDF inicial.

POST/proformas

Caso de Uso

Se usa cuando la aplicación necesita emitir una nueva proforma desde el punto de venta con los productos o servicios seleccionados, los datos del cliente, sucursal, caja y método de pago. Al usarlo, el usuario obtiene la estructura completa de la proforma creada, incluyendo el identificador generado, los datos del emisor y receptor, y el documento PDF.

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

Este endpoint no recibe parámetros de ruta.

Body

prfmasuidstringobligatorio

Identificador de la sucursal emisora; debe existir y estar activa.

prfmacjidstringobligatorio

Identificador de la caja emisora; debe existir, pertenecer a la sucursal y estar activa.

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.

prfmadescuentonumber opcional

Descuento total aplicado a la proforma; debe ser mayor o igual a cero. Si no se envía, se asume 0.

prfmatotalnumberobligatorio

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

dprfmaproductosarrayobligatorio

Arreglo no vacío de items de la proforma. Cada item contiene: dprfmaesinventariable (boolean), dprfmacodigo (string, condicional), dprfmadescripcion (string), dprfmacantidad (number > 0), dprfmapreciounitario (number > 0), dprfmapreciototal (number > 0).

Reglas de negocio

1

La proforma siempre se crea en estado emitida.

2

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

3

La empresa del usuario autenticado debe estar activa.

4

El usuario autenticado debe estar activo.

5

La sucursal debe existir y estar activa dentro de la empresa.

6

La caja debe existir, estar activa y pertenecer a la sucursal indicada.

7

El cliente debe existir y estar activo dentro de la empresa.

8

El método de pago debe existir y estar activo dentro de la empresa.

9

Debe existir una secuencia configurada para la combinación empresa + sucursal.

10

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

11

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

12

El backend no recalcula los totales; valida la consistencia de los montos enviados por el frontend.

13

La suma de dprfmapreciototal de todos los items debe coincidir con prfmasubtotal.

14

prfmasubtotal - prfmadescuento debe coincidir con prfmatotal.

15

Se genera un documento PDF automáticamente al crear la proforma.

16

prfmaidentificador se genera como {códigoEmpresa}-{identificadorSucursal}-{identificadorCaja}-{secuencia}.

Errores esperados

401No autorizado

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

500El id de sucursal es requerido

prfmasuid fue enviado vacío.

500El id de caja es requerido

prfmacjid fue enviado vacío.

500El id de cliente es requerido

prfmaclnteid fue enviado vacío.

500El id de método de pago es requerido

prfmampid fue enviado vacío.

500El número es requerido

prfmasubtotal, prfmatotal o un campo numérico de item fue enviado vacío.

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

Uno de los campos numéricos no es un número válido.

500El subtotal debe ser mayor o igual a cero

prfmasubtotal tiene un valor negativo.

500El descuento debe ser mayor o igual a cero

prfmadescuento tiene un valor negativo.

500El total debe ser mayor o igual a cero

prfmatotal tiene un valor negativo.

500Los items de proforma son requeridos

dprfmaproductos fue enviado vacío o no es un arreglo.

500dprfmaesinventariable debe ser un booleano

dprfmaesinventariable en un item no es un valor booleano.

500La cantidad debe ser mayor a cero

dprfmacantidad de un item es menor o igual a 0.

500El precio unitario debe ser mayor a cero

dprfmapreciounitario de un item es menor o igual a 0.

500El nombre de producto es requerido

dprfmadescripcion de un item fue enviado vacío.

500El total del item debe ser mayor a cero

dprfmapreciototal de un item es menor o igual a 0.

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

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

500El código de producto es requerido

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

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 crear proformas.

500La sucursal no existe

prfmasuid no corresponde a una sucursal existente en la empresa.

500La sucursal no está activa

La sucursal indicada no está en estado activo.

500La caja no existe

prfmacjid no corresponde a una caja existente en la empresa.

500La caja no pertenece a la sucursal seleccionada

La caja indicada no está asociada a la sucursal enviada.

500La caja no está activa

La caja indicada no está en estado activo.

500El cliente no existe

prfmaclnteid no corresponde a un cliente existente en la empresa.

500El cliente no está activo

El cliente indicado no está en estado activo.

500El método de pago no existe

prfmampid no corresponde a un método de pago existente en la empresa.

500El método de pago no está activo

El método de pago indicado no está en estado activo.

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.

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.

409La secuencia no existe para esta empresa y sucursal

No hay una secuencia configurada para la combinación de empresa y sucursal.

500La proforma no fue creada

Ocurrió un error interno al guardar la cabecera de la proforma.

500El item de proforma no fue creado

Ocurrió un error interno al guardar un item de la proforma.

Notas de uso

1

Este endpoint no recibe parámetros de ruta ni query params.

2

El backend no recalcula los importes; el frontend debe enviar un payload consistente.

3

La respuesta incluye el documento PDF generado automáticamente en proforma.documento.

4

prfmaidentificador se genera automáticamente con el formato {códigoEmpresa}-{identificadorSucursal}-{identificadorCaja}-{secuencia}.