Skip to main content
POST
/
api
/
ventas
Convertir Cotización a Venta
curl --request POST \
  --url https://api.example.com/api/ventas \
  --header 'Authorization: <authorization>' \
  --header 'Content-Type: <content-type>' \
  --data '
{
  "cotizacion_id": 123,
  "id_tido": 123,
  "serie": "<string>",
  "numero": 123,
  "fecha_emision": "<string>",
  "id_cliente": 123,
  "cliente_documento": "<string>",
  "cliente_datos": "<string>",
  "cliente_direccion": "<string>",
  "subtotal": 123,
  "igv": 123,
  "total": 123,
  "tipo_moneda": "<string>",
  "id_tipo_pago": 123,
  "afecta_stock": true,
  "productos": [
    {
      "id_producto": 123,
      "cantidad": 123,
      "precio_unitario": 123,
      "valor_unitario": 123,
      "nombre": "<string>"
    }
  ],
  "observaciones": "<string>",
  "empresas_ids": [
    {}
  ]
}
'
{
  "422": {},
  "500": {},
  "success": true,
  "message": "<string>",
  "data": {
    "id_venta": 123,
    "cotizacion_id": 123,
    "serie": "<string>",
    "numero": 123,
    "total": 123,
    "estado_sunat": "<string>"
  }
}
Convierte una cotización aprobada en una venta (factura o boleta). La venta creada mantiene la referencia a la cotización original mediante el campo cotizacion_id.

Autenticación

Requiere token Bearer y permiso ventas.create.

Headers

Authorization
string
required
Token de autenticación Bearer
Content-Type
string
required
application/json

Body Parameters

Vinculación con Cotización

cotizacion_id
integer
ID de la cotización que se está convirtiendo en venta. Este campo establece la relación entre ambos documentos.

Información del Comprobante

id_tido
integer
required
Tipo de documento SUNAT:
  • 1: Factura (serie F001)
  • 3: Boleta de Venta (serie B001)
serie
string
required
Serie del comprobante (máx 4 caracteres). Ej: F001, B001
numero
integer
required
Número correlativo del comprobante
fecha_emision
string
required
Fecha de emisión del comprobante (formato: YYYY-MM-DD)

Cliente

id_cliente
integer
ID del cliente (debe coincidir con el de la cotización)
cliente_documento
string
Documento del cliente (RUC/DNI)
cliente_datos
string
Nombre/Razón social del cliente
cliente_direccion
string
Dirección del cliente

Totales

subtotal
decimal
required
Base imponible (operaciones gravadas)
igv
decimal
required
Impuesto General a las Ventas (18%)
total
decimal
required
Total del comprobante
tipo_moneda
string
required
Moneda: PEN o USD

Pago y Stock

id_tipo_pago
integer
Tipo de pago: 1 (Contado) o 2 (Crédito)
afecta_stock
boolean
Si la venta debe descontar stock automáticamente. Por defecto: false

Productos

productos
array
required
Lista de productos de la venta (copiar de la cotización)

Información Adicional

observaciones
string
Observaciones adicionales
empresas_ids
array
IDs de empresas asociadas (para distribución multi-empresa)

Flujo Recomendado

  1. Obtener la cotización: GET /api/cotizaciones/{id}
  2. Verificar estado: Confirmar que estado = "aprobada"
  3. Generar número de comprobante: GET /api/ventas/proximo-numero?serie=F001&id_tido=1
  4. Crear la venta con cotizacion_id incluido
  5. Enviar a SUNAT: POST /api/comprobantes/enviar/{ventaId}

Respuesta Exitosa

success
boolean
true si la venta se creó exitosamente
message
string
Mensaje de confirmación
data
object
Venta creada con sus relaciones

Ejemplo de Solicitud

{
  "cotizacion_id": 16,
  "id_tido": 1,
  "serie": "F001",
  "numero": 245,
  "fecha_emision": "2026-03-06",
  "id_cliente": 45,
  "cliente_documento": "20123456789",
  "cliente_datos": "DISTRIBUIDORA COMERCIAL SAC",
  "cliente_direccion": "Av. Los Pinos 456, San Isidro",
  "subtotal": 17000.00,
  "igv": 3060.00,
  "total": 20060.00,
  "tipo_moneda": "PEN",
  "id_tipo_pago": 2,
  "afecta_stock": true,
  "productos": [
    {
      "id_producto": 123,
      "cantidad": 5,
      "precio_unitario": 3400.00,
      "valor_unitario": 2881.36,
      "nombre": "Laptop HP ProBook 450 G9"
    },
    {
      "id_producto": 124,
      "cantidad": 5,
      "precio_unitario": 118.00,
      "valor_unitario": 100.00,
      "nombre": "Mouse Inalámbrico Logitech"
    }
  ],
  "observaciones": "Venta generada desde cotización COT-000016"
}

Ejemplo de Respuesta

{
  "success": true,
  "message": "Venta registrada exitosamente",
  "data": {
    "id_venta": 523,
    "cotizacion_id": 16,
    "id_tido": 1,
    "serie": "F001",
    "numero": 245,
    "fecha_emision": "2026-03-06",
    "total": 20060.00,
    "tipo_moneda": "PEN",
    "estado": "registrada",
    "estado_sunat": "pendiente",
    "afecta_stock": true,
    "stock_real_descontado": false
  }
}

Relación con Cotización

Una vez creada la venta:
  • La cotización puede consultarse desde la venta mediante la relación cotizacion_id
  • Puedes obtener todas las ventas de una cotización con: GET /api/cotizaciones/{id} (campo ventas)
  • El estado de la cotización debe actualizarse manualmente si se requiere (ej: cambiar a “aprobada” o “convertida”)

Descuento de Stock

Si afecta_stock = true, el sistema:
  1. Descuenta automáticamente el stock de cada producto
  2. Registra movimientos en movimientos_stock con tipo salida
  3. Marca stock_real_descontado = true en la venta
Si prefieres gestionar el stock manualmente, establece afecta_stock = false y usa:
  • GET /api/ventas/{id}/preview-descontar-stock para previsualizar
  • POST /api/ventas/{id}/descontar-stock para descontar después

Códigos de Error

422
error
Errores de validación o cotización no encontrada
500
error
Error interno al crear la venta

Notas de Implementación

  • La venta NO se envía automáticamente a SUNAT. Usa POST /api/comprobantes/enviar/{ventaId} después de crearla.
  • Si la cotización tenía cuotas, NO se copian automáticamente. Debes crear las cuotas de venta por separado (tabla dias_ventas).
  • El campo cotizacion_id es opcional, pero recomendado para mantener trazabilidad.

Build docs developers (and LLMs) love