API Contabilidad General - Sage ACICloud
Crear Asiento Contable Individual
Endpoint: POST /api/acicloud/general_journal_entry
Controller: ACIcloudController::generalJournalEntry
Autenticación: Bearer Token requerido
Middleware: check.activate.organization
Campos de Request
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|---|---|---|---|
entry_number |
string | ✅ | Número único del asiento | "GJE-2025-001" |
date |
string | ✅ | Fecha del asiento (YYYY-MM-DD) | "2025-01-29" |
description |
string | ✅ | Descripción del asiento | "Ajuste de depreciación enero" |
reference |
string | ❌ | Referencia externa | "DEP-2025-01" |
source |
string | ❌ | Origen del asiento | "MANUAL" |
lines |
array | ✅ | Líneas del asiento (mín. 2) | [] |
lines[].account_code |
string | ✅ | Código de cuenta contable | "1200" |
lines[].description |
string | ✅ | Descripción de la línea | "Depreciación acumulada equipos" |
lines[].debit_amount |
decimal | ❌ | Monto débito | 1500.00 |
lines[].credit_amount |
decimal | ❌ | Monto crédito | 0.00 |
lines[].department |
string | ❌ | Departamento | "ADMIN" |
lines[].project |
string | ❌ | Proyecto asociado | "PROJ001" |
lines[].memo |
string | ❌ | Memo adicional | "Depreciación mensual" |
Validaciones
- entry_number: Único, máximo 50 caracteres
- date: Formato YYYY-MM-DD, no futuro
- lines: Mínimo 2 líneas requeridas
- Balance: Suma de débitos debe igualar suma de créditos
- account_code: Debe existir en el plan de cuentas
- amounts: Solo positivos, se requiere debit_amount O credit_amount
Ejemplo de Request
{
"entry_number": "GJE-2025-001",
"date": "2025-01-29",
"description": "Ajuste de depreciación enero 2025",
"reference": "DEP-2025-01",
"source": "MANUAL",
"lines": [
{
"account_code": "6200",
"description": "Gasto por depreciación - Equipos",
"debit_amount": 1500.00,
"credit_amount": 0.00,
"department": "ADMIN",
"memo": "Depreciación mensual equipos de oficina"
},
{
"account_code": "1250",
"description": "Depreciación acumulada - Equipos",
"debit_amount": 0.00,
"credit_amount": 1500.00,
"department": "ADMIN",
"memo": "Acumulación depreciación enero"
}
]
}
Respuesta de Éxito
{
"success": true,
"message": "Asiento contable creado exitosamente",
"data": {
"entry_number": "GJE-2025-001",
"sage_id": "SAGE_GJE_001",
"total_debit": 1500.00,
"total_credit": 1500.00,
"lines_count": 2,
"balance_verified": true,
"created_at": "2025-01-29 21:30:00",
"sync_status": "completed"
}
}
Crear Múltiples Asientos Contables
Endpoint: POST /api/acicloud/general_journal_entries
Controller: ACIcloudController::generalJournalEntries
Autenticación: Bearer Token requerido
Middleware: check.activate.organization
Campos de Request
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|---|---|---|---|
batch_number |
string | ✅ | Número de lote | "BATCH-2025-001" |
batch_date |
string | ✅ | Fecha del lote | "2025-01-29" |
batch_description |
string | ✅ | Descripción del lote | "Asientos de cierre enero 2025" |
entries |
array | ✅ | Lista de asientos contables | [] |
Cada elemento en entries debe tener la misma estructura que el endpoint individual.
Ejemplo de Request
{
"batch_number": "BATCH-2025-001",
"batch_date": "2025-01-29",
"batch_description": "Asientos de cierre enero 2025",
"entries": [
{
"entry_number": "GJE-2025-001",
"date": "2025-01-29",
"description": "Ajuste de depreciación enero",
"lines": [
{
"account_code": "6200",
"description": "Gasto por depreciación",
"debit_amount": 1500.00,
"credit_amount": 0.00
},
{
"account_code": "1250",
"description": "Depreciación acumulada",
"debit_amount": 0.00,
"credit_amount": 1500.00
}
]
},
{
"entry_number": "GJE-2025-002",
"date": "2025-01-29",
"description": "Provisión cuentas por cobrar",
"lines": [
{
"account_code": "6300",
"description": "Provisión cuentas incobrables",
"debit_amount": 500.00,
"credit_amount": 0.00
},
{
"account_code": "1150",
"description": "Provisión acumulada CxC",
"debit_amount": 0.00,
"credit_amount": 500.00
}
]
}
]
}
Respuesta de Éxito
{
"success": true,
"message": "Lote de asientos contables procesado exitosamente",
"data": {
"batch_number": "BATCH-2025-001",
"entries_processed": 2,
"entries_successful": 2,
"entries_failed": 0,
"total_debit": 2000.00,
"total_credit": 2000.00,
"processing_time": "00:00:05",
"created_at": "2025-01-29 21:30:00",
"results": [
{
"entry_number": "GJE-2025-001",
"sage_id": "SAGE_GJE_001",
"status": "success",
"message": "Asiento creado exitosamente"
},
{
"entry_number": "GJE-2025-002",
"sage_id": "SAGE_GJE_002",
"status": "success",
"message": "Asiento creado exitosamente"
}
]
}
}
Obtener Asientos Importados
Endpoint: GET /api/acicloud/general_journal_entry_imp
Controller: ACIcloudController::getGeneralJournalEntryImp
Autenticación: Bearer Token requerido
Middleware: check.activate.organization
Parámetros de Query (Opcionales)
| Parámetro | Tipo | Requerido | Descripción | Ejemplo |
|---|---|---|---|---|
page |
integer | ❌ | Página a obtener | 2 |
per_page |
integer | ❌ | Registros por página | 50 |
batch_number |
string | ❌ | Filtrar por lote | "BATCH-2025-001" |
date_from |
string | ❌ | Fecha desde | "2025-01-01" |
date_to |
string | ❌ | Fecha hasta | "2025-01-31" |
Respuesta de Éxito
{
"success": true,
"data": [
{
"id": 1,
"entry_number": "GJE-2025-001",
"date": "2025-01-29",
"description": "Ajuste de depreciación enero",
"sage_id": "SAGE_GJE_001",
"batch_number": "BATCH-2025-001",
"total_debit": 1500.00,
"total_credit": 1500.00,
"lines_count": 2,
"import_status": "completed",
"created_at": "2025-01-29 21:30:00",
"updated_at": "2025-01-29 21:30:00",
"errors": null
},
{
"id": 2,
"entry_number": "GJE-2025-002",
"date": "2025-01-29",
"description": "Provisión cuentas por cobrar",
"sage_id": "SAGE_GJE_002",
"batch_number": "BATCH-2025-001",
"total_debit": 500.00,
"total_credit": 500.00,
"lines_count": 2,
"import_status": "completed",
"created_at": "2025-01-29 21:30:00",
"updated_at": "2025-01-29 21:30:00",
"errors": null
}
],
"pagination": {
"current_page": 1,
"per_page": 25,
"total": 25,
"total_pages": 1
},
"summary": {
"total_entries": 25,
"total_debit": 125000.00,
"total_credit": 125000.00,
"successful_imports": 25,
"failed_imports": 0
}
}
Crear Ventas Contables
Endpoint: POST /api/acicloud/sales
Controller: ACIcloudController::salesImp
Autenticación: Bearer Token requerido
Middleware: check.activate.organization
Campos de Request
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|---|---|---|---|
sale_number |
string | ✅ | Número de venta | "SALE-2025-001" |
customer_id |
string | ✅ | ID del cliente | "CUST001" |
date |
string | ✅ | Fecha de la venta | "2025-01-29" |
due_date |
string | ❌ | Fecha de vencimiento | "2025-02-28" |
currency |
string | ❌ | Moneda | "USD" |
exchange_rate |
decimal | ❌ | Tipo de cambio | 1.00 |
payment_terms |
string | ❌ | Términos de pago | "NET30" |
reference |
string | ❌ | Referencia | "ORD-001" |
items |
array | ✅ | Items de venta | [] |
items[].product_code |
string | ✅ | Código del producto | "PROD001" |
items[].description |
string | ✅ | Descripción | "Laptop Dell" |
items[].quantity |
decimal | ✅ | Cantidad | 2.00 |
items[].unit_price |
decimal | ✅ | Precio unitario | 1200.00 |
items[].tax_rate |
decimal | ❌ | Tasa de impuesto | 0.07 |
items[].discount_percent |
decimal | ❌ | Descuento porcentual | 5.00 |
Ejemplo de Request
{
"sale_number": "SALE-2025-001",
"customer_id": "CUST001",
"date": "2025-01-29",
"due_date": "2025-02-28",
"currency": "USD",
"payment_terms": "NET30",
"reference": "ORD-001",
"items": [
{
"product_code": "PROD001",
"description": "Laptop Dell Inspiron 15",
"quantity": 2.00,
"unit_price": 1200.00,
"tax_rate": 0.07,
"discount_percent": 0.00
},
{
"product_code": "PROD002",
"description": "Mouse Inalámbrico",
"quantity": 2.00,
"unit_price": 25.00,
"tax_rate": 0.07,
"discount_percent": 0.00
}
]
}
Respuesta de Éxito
{
"success": true,
"message": "Venta creada exitosamente",
"data": {
"sale_number": "SALE-2025-001",
"sage_id": "SAGE_SALE_001",
"subtotal": 2450.00,
"tax_amount": 171.50,
"total_amount": 2621.50,
"created_at": "2025-01-29 21:30:00",
"sync_status": "completed"
}
}
Obtener Ventas Importadas
Endpoint: GET /api/acicloud/sales_imp
Controller: ACIcloudController::getSalesImp
Autenticación: Bearer Token requerido
Middleware: check.activate.organization
Respuesta de Éxito
{
"success": true,
"data": [
{
"id": 1,
"sale_number": "SALE-2025-001",
"customer_id": "CUST001",
"customer_name": "ABC Corporation S.A.",
"sage_id": "SAGE_SALE_001",
"date": "2025-01-29",
"total_amount": 2621.50,
"import_status": "completed",
"created_at": "2025-01-29 21:30:00",
"errors": null
}
],
"pagination": {
"current_page": 1,
"per_page": 25,
"total": 45,
"total_pages": 2
}
}
Códigos de Respuesta HTTP
| Código | Descripción |
|---|---|
| 200 | Consulta exitosa |
| 201 | Asiento/Venta creado exitosamente |
| 400 | Datos de entrada inválidos |
| 401 | No autorizado |
| 422 | Error de validación / Balance no cuadra |
| 500 | Error interno del servidor |
Ejemplos de cURL
Crear Asiento Individual
curl -X POST "https://api.docucenter.com/api/acicloud/general_journal_entry" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"entry_number": "GJE-2025-001",
"date": "2025-01-29",
"description": "Ajuste de depreciación",
"lines": [
{
"account_code": "6200",
"description": "Gasto depreciación",
"debit_amount": 1500.00,
"credit_amount": 0.00
},
{
"account_code": "1250",
"description": "Depreciación acumulada",
"debit_amount": 0.00,
"credit_amount": 1500.00
}
]
}'
Crear Lote de Asientos
curl -X POST "https://api.docucenter.com/api/acicloud/general_journal_entries" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"batch_number": "BATCH-2025-001",
"batch_date": "2025-01-29",
"batch_description": "Asientos de cierre enero",
"entries": [...]
}'
Crear Venta
curl -X POST "https://api.docucenter.com/api/acicloud/sales" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"sale_number": "SALE-2025-001",
"customer_id": "CUST001",
"date": "2025-01-29",
"items": [
{
"product_code": "PROD001",
"description": "Laptop Dell",
"quantity": 1.00,
"unit_price": 1200.00
}
]
}'
Notas Técnicas
- Multi-tenant: Todos los endpoints respetan el contexto de organización
- Balance Contable: Se valida que débitos = créditos automáticamente
- Plan de Cuentas: Se valida que las cuentas existan en el sistema
- Numeración: Los números de asiento deben ser únicos
- Fechas: No se permiten fechas futuras para asientos
- Monedas: Soporte para múltiples monedas con tipo de cambio
Principios Contables
- Partida Doble: Cada asiento debe tener al menos una línea débito y crédito
- Balance: Suma de débitos debe igualar suma de créditos
- Integridad: Validación de cuentas contra plan de cuentas
- Trazabilidad: Cada asiento mantiene referencia a su origen
- Inmutabilidad: Los asientos no pueden modificarse una vez creados
Integración con Sage ACICloud
Los asientos contables se integran directamente con el libro mayor de Sage ACICloud, manteniendo la integridad contable y permitiendo reportes consolidados.