Operaciones
Referencia detallada de los recursos de Operaciones de la API: turnos y citas, contratos, métodos de pago y envíos.
Los recursos de Operaciones cubren la gestión del día a día del negocio. Todos los endpoints están bajo https://api.yo-facturo.com y se autentican con el header X-API-Key. Cada recurso indica su endpoint base y los scopes necesarios para leer y escribir.
Turnos y citas
Las citas representan sesiones agendadas de un servicio o alquiler con un cliente. Soportan ubicación flexible, recordatorios automáticos por varios canales y servicios recurrentes.
Endpoint base: /api/v1/appointments
Scopes: appointments:read, appointments:write
Campos
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
scheduled_datetime | string (date-time) | Sí | Fecha y hora de la cita en formato ISO 8601. |
service_id | string (24) | No | ID del servicio. Requerido si no se envía rental_id. |
rental_id | string (24) | No | ID del alquiler. Requerido si no se envía service_id. |
customer_id | string (24) | null | No | ID del cliente registrado al que se vincula la cita. |
duration_minutes | integer | No | Duración en minutos (entre 5 y 525600). Por defecto se toma del servicio. |
location_type | string | No | Tipo de ubicación: service_location, customer_address o custom. |
custom_location | object | No | Ubicación personalizada (name, address, city, state, country, postal_code, instructions, coordinates). |
service_location_index | integer | No | Índice de la ubicación del servicio cuando hay varias. |
reminder_enabled | boolean | No | Activa el envío de recordatorios automáticos. |
reminder_hours | array<integer> | No | Horas antes de la cita en que se envían recordatorios (1 a 168). |
reminder_channels | array<string> | No | Canales de recordatorio: email, push, sms o whatsapp. |
session_number | integer | No | Número de sesión para servicios recurrentes. |
entity_type | string | No | Tipo de entidad asociada: service o rental. |
guest_name | string | No | Nombre del invitado para citas sin cliente registrado (máx. 200). |
guest_email | string (email) | No | Email del invitado (máx. 254). |
guest_phone | string | No | Teléfono del invitado (máx. 50). |
notes | string | No | Notas de la cita (máx. 1000). |
sale_status | string | No | Estado de la venta asociada: pending o completed. Por defecto pending. |
rewards_applied | array<string> | No | Recompensas o puntos canjeados aplicados a la cita. |
Debe enviarse al menos uno de service_id o rental_id; scheduled_datetime es siempre obligatorio.
Endpoints
| Método | Endpoint | Descripción |
|---|---|---|
GET | /list/ | Listar registros (con filtros y paginación) |
GET | /{id}/ | Obtener un registro por su ID |
POST | / | Crear un registro |
PUT | /{id}/ | Actualizar un registro |
DELETE | /{id}/ | Eliminar un registro |
POST | /bulk/create/ | Crear varios registros en una sola petición |
PUT | /bulk/update/ | Actualizar varios registros en una sola petición |
POST | /bulk/delete/ | Eliminar varios registros en una sola petición |
Ejemplo — Petición
POST /api/v1/appointments/ — agendar una cita a un servicio:
{
"service_id": "66f1a2b3c4d5e6f7a8b9c0d1",
"customer_id": "66f1a2b3c4d5e6f7a8b9c0d2",
"scheduled_datetime": "2026-06-10T15:00:00Z",
"duration_minutes": 60,
"location_type": "service_location",
"reminder_enabled": true,
"reminder_hours": [24, 2],
"reminder_channels": ["email", "push"],
"notes": "Primera sesión de consultoría"
}Ejemplo — Respuesta
{
"success": true,
"data": {
"_id": "66f1a2b3c4d5e6f7a8b9c0d3",
"service": { "service": "66f1a2b3c4d5e6f7a8b9c0d1", "name": "Consultoría" },
"customer": { "customer": "66f1a2b3c4d5e6f7a8b9c0d2", "name": "Juan Pérez" },
"scheduled_datetime": "2026-06-10T15:00:00Z",
"duration_minutes": 60,
"status": "scheduled",
"location_type": "service_location",
"notes": "Primera sesión de consultoría"
}
}Contratos
Los contratos gestionan alquileres permanentes: inquilino, garantes, cláusulas, ajustes periódicos del alquiler (ICL, IPC, porcentaje fijo) y facturación mensual automática.
Endpoint base: /api/v1/contracts
Scopes: contracts:read, contracts:write
Campos
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
rental_id | string | Sí | ID del alquiler permanente al que pertenece el contrato. |
start_date | string (date-time) | Sí | Fecha de inicio del contrato en formato ISO 8601. |
end_date | string (date-time) | Sí | Fecha de fin del contrato en formato ISO 8601. |
initial_rent | number | Sí | Alquiler inicial del contrato. |
tenant | object | Sí | Datos del inquilino (full_name y document_number requeridos; también document_type, email, phone, address). |
security_deposit | number | No | Depósito de garantía. |
billing_day | integer | No | Día del mes en que se factura (1 a 28). |
adjustment_type | string | No | Tipo de ajuste: none, icl, ipc, fixed_percentage, cpi o custom. |
adjustment_frequency_months | integer | No | Frecuencia del ajuste en meses (1 a 12). |
adjustment_percentage | number | No | Porcentaje de ajuste cuando el tipo es fijo (0 a 100). |
guarantors | array<object> | No | Garantes del contrato (full_name, document_type, document_number, guarantee_type). |
clauses | array<object> | No | Cláusulas del contrato (title, content, is_mandatory). |
additional_charges | array<object> | No | Cargos adicionales (description, amount, frequency, is_recurring). |
notes | string | No | Notas del contrato. |
Endpoints
| Método | Endpoint | Descripción |
|---|---|---|
GET | /list/ | Listar registros (con filtros y paginación) |
GET | /{id}/ | Obtener un registro por su ID |
POST | / | Crear un registro |
PUT | /{id}/ | Actualizar un registro |
DELETE | /{id}/ | Eliminar un registro |
POST | /bulk/create/ | Crear varios registros en una sola petición |
PUT | /bulk/update/ | Actualizar varios registros en una sola petición |
POST | /bulk/delete/ | Eliminar varios registros en una sola petición |
Además del CRUD estándar, los contratos exponen endpoints de ciclo de vida y facturación:
| Método | Endpoint | Descripción |
|---|---|---|
POST | /{id}/sign | Firmar y activar el contrato. |
POST | /{id}/terminate | Terminar un contrato activo. |
POST | /{id}/renew | Renovar un contrato por vencer o vencido. |
POST | /{id}/adjust | Aplicar un ajuste de alquiler. |
POST | /{id}/generate-invoice | Generar la factura mensual del contrato. |
GET | /expiring | Listar contratos por vencer. |
GET | /summary | Resumen estadístico de los contratos. |
Ejemplo — Petición
POST /api/v1/contracts/ — crear un contrato de alquiler:
{
"rental_id": "66f1a2b3c4d5e6f7a8b9c0e1",
"start_date": "2026-06-01T00:00:00Z",
"end_date": "2029-06-01T00:00:00Z",
"initial_rent": 150000,
"security_deposit": 150000,
"billing_day": 10,
"adjustment_type": "icl",
"adjustment_frequency_months": 12,
"tenant": {
"full_name": "Juan Pérez",
"document_type": "DNI",
"document_number": "30123456",
"email": "[email protected]",
"phone": "+5491122334455"
},
"notes": "Contrato de alquiler de vivienda"
}Ejemplo — Respuesta
{
"success": true,
"data": {
"_id": "66f1a2b3c4d5e6f7a8b9c0e2",
"rental_id": "66f1a2b3c4d5e6f7a8b9c0e1",
"contract_number": "CTR-0042",
"start_date": "2026-06-01T00:00:00Z",
"end_date": "2029-06-01T00:00:00Z",
"initial_rent": 150000,
"current_rent": 150000,
"billing_day": 10,
"status": "draft",
"tenant": { "full_name": "Juan Pérez", "document_number": "30123456" }
}
}Métodos de pago
Los métodos de pago definen las formas de cobro disponibles en ventas y puntos de venta. Soportan jerarquía (métodos padre e hijos), orden personalizado y un porcentaje de impacto sobre el precio.
Endpoint base: /api/v1/payment_methods
Scopes: payment_methods:read, payment_methods:write
Este recurso usa un controlador propio (no el CRUD estándar). Los campos completos de cada método de pago se obtienen con un GET; abajo se documentan los campos aceptados al crear uno.
Campos
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
code | string | Sí | Código interno único del método de pago. |
name | string | Sí | Nombre del método de pago. |
type | string | No | Tipo de método (por ejemplo other). |
name_en | string | No | Nombre del método en inglés. |
icon | string | No | Identificador del ícono del método. |
description | string | No | Descripción del método de pago. |
Endpoints
| Método | Endpoint | Descripción |
|---|---|---|
GET | / | Punto de entrada HATEOAS del recurso. |
GET | /list/ | Listar métodos de pago (page, per_page, status, sort, sort_dir). |
GET | /active/ | Listar solo los métodos activos (para selectores). |
GET | /{id}/ | Obtener un método de pago por su ID. |
POST | / | Crear un método de pago. |
PUT | /{id}/ | Actualizar un método de pago. |
DELETE | /{id}/ | Eliminar un método de pago (no se pueden eliminar los predeterminados). |
POST | /{id}/toggle-status/ | Activar o desactivar un método de pago. |
POST | /reorder/ | Reordenar los métodos de pago. |
GET | /hierarchy/ | Obtener los métodos de pago en árbol jerárquico. |
Ejemplo — Petición
POST /api/v1/payment_methods/ — crear un método de pago personalizado:
{
"code": "transferencia_propia",
"name": "Transferencia a mi banco",
"name_en": "Bank transfer",
"type": "other",
"icon": "wallet",
"description": "Transferencia bancaria a cuenta propia"
}Ejemplo — Respuesta
{
"success": true,
"data": {
"_id": "66f1a2b3c4d5e6f7a8b9c0f1",
"code": "transferencia_propia",
"name": "Transferencia a mi banco",
"type": "other",
"icon": "wallet",
"status": "active",
"sort_order": 7
}
}Envíos
El módulo de envíos integra varios proveedores (OCA, Andreani, Correo Argentino, Mercado Envíos) y un sistema de delivery propio. Permite cotizar, crear y rastrear envíos, gestionar repartidores y dispositivos de flota con seguimiento GPS.
Endpoint base: /api/v1/shipping — repartidores en /api/v1/drivers, flota en /api/v1/fleet
Scopes: shipping:read, shipping:write
Los envíos usan controladores propios (no el CRUD estándar). El cuerpo de creación de un envío depende del proveedor configurado; los campos completos de un envío se obtienen con un GET sobre el detalle.
Endpoints de envíos
| Método | Endpoint | Descripción |
|---|---|---|
GET | /api/v1/shipping/shipments/ | Listar envíos del tenant. |
POST | /api/v1/shipping/shipments/ | Crear un envío. |
GET | /api/v1/shipping/shipments/{id}/ | Obtener el detalle de un envío. |
PATCH | /api/v1/shipping/shipments/{id}/ | Actualizar campos de un envío. |
DELETE | /api/v1/shipping/shipments/{id}/ | Eliminar un envío. |
POST | /api/v1/shipping/shipments/{id}/cancel | Cancelar un envío. |
POST | /api/v1/shipping/shipments/{id}/label | Generar la etiqueta del envío. |
GET | /api/v1/shipping/track/{tracking_number}/ | Rastrear un envío por su número de seguimiento. |
POST | /api/v1/shipping/quotes/ | Cotizar un envío entre proveedores. |
GET | /api/v1/shipping/providers/ | Listar los proveedores de envío configurados. |
Repartidores
Los repartidores son entidades propias del tenant para el delivery en campo. Al crearlos se genera un código de 8 caracteres que el repartidor usa como credencial de acceso.
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
name | string | Sí | Nombre del repartidor (2 a 100 caracteres). |
phone | string | null | No | Teléfono del repartidor (máx. 40 caracteres). |
| Método | Endpoint | Descripción |
|---|---|---|
GET | /api/v1/drivers/ | Listar los repartidores del tenant. |
POST | /api/v1/drivers/ | Registrar un repartidor (genera un código de 8 caracteres). |
GET | /api/v1/drivers/{id}/ | Obtener un repartidor por su ID. |
PATCH | /api/v1/drivers/{id}/ | Actualizar un repartidor. |
DELETE | /api/v1/drivers/{id}/ | Eliminar un repartidor. |
POST | /api/v1/drivers/{id}/regenerate-code | Regenerar el código de acceso del repartidor. |
GET | /api/v1/drivers/tier-info | Tier actual del widget y cantidad de repartidores registrados. |
Flota
Los dispositivos de flota representan vehículos con seguimiento GPS por polling. Pueden vincularse opcionalmente a un repartidor. Al crearlos se genera un código de 8 caracteres que el dispositivo usa para reportar su geolocalización.
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
name | string | Sí | Nombre del vehículo o dispositivo (2 a 100 caracteres). |
plate | string | null | No | Patente del vehículo (máx. 20 caracteres). |
linked_driver_id | string | null | No | ID del repartidor vinculado al dispositivo (opcional). |
| Método | Endpoint | Descripción |
|---|---|---|
GET | /api/v1/fleet/devices/ | Listar los dispositivos de flota del tenant. |
POST | /api/v1/fleet/devices/ | Registrar un dispositivo (genera un código de 8 caracteres). |
GET | /api/v1/fleet/devices/{id}/ | Obtener un dispositivo por su ID. |
PATCH | /api/v1/fleet/devices/{id}/ | Actualizar un dispositivo. |
DELETE | /api/v1/fleet/devices/{id}/ | Eliminar un dispositivo. |
POST | /api/v1/fleet/devices/{id}/regenerate-code | Regenerar el código de acceso del dispositivo. |
GET | /api/v1/fleet/devices/{id}/trail | Obtener el recorrido GPS registrado del dispositivo. |
Ejemplo — Petición
POST /api/v1/fleet/devices/ — registrar un dispositivo de flota:
{
"name": "Camión 1",
"plate": "AB123CD",
"linked_driver_id": null
}Ejemplo — Respuesta
{
"success": true,
"data": {
"_id": "66f1a2b3c4d5e6f7a8b9c0d1",
"name": "Camión 1",
"plate": "AB123CD",
"device_code": "K7M2X9P4",
"linked_driver_id": null,
"status": "active"
}
}