API Facturación Electrónica - Integración Kart21
Crear Venta Kart21
Endpoint: POST /api/v1/fe/create_sale_kart21
Controller: FeController::createSaleKart21
Request Class: CreateSaleKart21Request
Autenticación: Bearer Token requerido
Middleware: check.activate.organization
Descripción
Crea y emite una factura electrónica basada en datos provenientes de Kart21 (sistema POS para restaurantes y retail).
Estructura del Request
Evento Principal
Campo |
Tipo |
Requerido |
Descripción |
id |
integer |
✅ |
ID del evento |
event |
string |
✅ |
Tipo de evento ("order.close") |
object_id |
string |
✅ |
ID del objeto relacionado |
Datos de la Orden
Campo |
Tipo |
Requerido |
Descripción |
data.id |
string |
✅ |
ID de la orden |
data.number |
string |
✅ |
Número de la orden |
data.status |
integer |
✅ |
Estado de la orden (2 = CLOSED) |
data.status_description |
string |
✅ |
Descripción del estado |
data.order_type |
integer |
✅ |
Tipo de orden (0 = REGULAR) |
data.order_dt |
string |
✅ |
Fecha y hora de la orden |
data.closed_dt |
string |
✅ |
Fecha y hora de cierre |
data.subtotal |
number |
✅ |
Subtotal de la orden |
data.tax |
number |
✅ |
Impuestos |
data.total |
number |
✅ |
Total de la orden |
data.paid |
number |
✅ |
Monto pagado |
Usuario
Campo |
Tipo |
Requerido |
Descripción |
data.create_user.id |
integer |
✅ |
ID del usuario que creó |
data.create_user.first_name |
string |
✅ |
Nombre del usuario |
data.create_user.last_name |
string |
✅ |
Apellido del usuario |
data.create_user.email |
string |
✅ |
Email del usuario |
Items de la Orden
Campo |
Tipo |
Requerido |
Descripción |
data.items[].id |
integer |
✅ |
ID del item |
data.items[].lineitem_number |
integer |
✅ |
Número de línea |
data.items[].active |
boolean |
✅ |
Si está activo |
data.items[].status |
integer |
✅ |
Estado del item |
data.items[].class_id |
integer |
✅ |
ID de la clase |
data.items[].discount |
number |
✅ |
Descuento aplicado |
data.items[].quantity |
number |
✅ |
Cantidad |
data.items[].total |
number |
✅ |
Total del item |
Ejemplo de Request (Basado en Test)
{
"id": 1,
"event": "order.close",
"object_id": "0000000001",
"data": {
"id": "0000000001",
"parent_order_id": null,
"number": "0000000001",
"status": 2,
"status_description": "CLOSED",
"order_type": 0,
"order_type_description": "REGULAR",
"order_dt": "2024-07-26T14:10:07.247",
"closed_dt": "2024-07-26T14:10:18.027",
"subtotal": 3.75,
"tax": 0.2625,
"discount": 0.0,
"items_discount": 0.0,
"fee": 0.0,
"gratuity": 0.0,
"adjustment": 0.0,
"cancel_fee": 0.0,
"total": 4.0125,
"total_refunds": 0.0,
"balance": 0.0,
"paid": 4.01,
"create_user": {
"id": 2,
"first_name": "Test",
"last_name": "FIKABLE",
"email": "support@fikable.com"
},
"items": [
{
"id": 322,
"lineitem_number": 1,
"active": true,
"status": 1,
"status_description": "PERMANENT",
"class_id": 11,
"discount": 0.0,
"price": 3.75,
"quantity": 1.0,
"total": 3.75,
"tax": 0.2625,
"tax_percent": 0.07,
"item": {
"id": 7,
"name": "Café Americano",
"short_name": "Café",
"description": "Café americano regular",
"price": 3.75,
"cost": 1.25,
"tax_percent": 0.07,
"active": true,
"category_id": 2
}
}
],
"payments": [
{
"id": 123,
"amount": 4.01,
"type": 1,
"type_description": "CASH",
"reference": null,
"status": 1,
"status_description": "APPROVED"
}
]
}
}
Respuesta de Éxito
{
"success": true,
"message": "Orden Kart21 procesada exitosamente",
"job_id": "uuid-generated-job-id",
"order_number": "0000000001"
}
Validaciones Específicas
- Event Type: Debe ser "order.close"
- Status: Debe ser 2 (CLOSED)
- Items: Mínimo 1 item requerido
- Payments: Al menos un pago requerido
- Totals: Validación de coherencia en totales
Casos de Uso
- Restaurantes: Órdenes de comida y bebida
- Retail: Ventas de productos diversos
- POS: Sistema punto de venta integrado
- Multi-pago: Soporte para múltiples formas de pago
Códigos de Respuesta HTTP
Código |
Descripción |
200 |
Orden procesada exitosamente |
400 |
Datos de entrada inválidos |
401 |
No autorizado |
422 |
Error de validación |
500 |
Error interno del servidor |
Notas Técnicas
- Procesamiento: Asíncrono usando
CreateSaleKart21Job
- Webhook: Diseñado para recibir webhooks de Kart21
- Monedas: USD, PAB soportadas
- Impuestos: Cálculo basado en tax_percent de items
- Estados: Solo procesa órdenes con status "CLOSED"
- Pagos: Soporte para efectivo, tarjetas, y otros métodos