Skip to content

Gestión de Inventario

Este endpoint permite agregar inventario a items existentes y gestionar el stock disponible.

Endpoint: POST /api/v1/items/add-income

Descripción: Agrega inventario a un item existente, registrando un movimiento de entrada en el kardex.

Accept: application/json
Content-Type: application/json
Authorization: Bearer {token}
CampoTipoRequeridoDescripción
codestringCódigo del item
quantityintegerCantidad a agregar al inventario
costnumberNoCosto unitario del inventario
descriptionstringNoDescripción del movimiento
referencestringNoReferencia externa (factura de compra, etc.)
datestringNoFecha del movimiento (YYYY-MM-DD), por defecto hoy
{
"code": "PROD-001",
"quantity": 50,
"cost": 20.00,
"description": "Ingreso de inventario por compra"
}
{
"code": "PROD-001",
"quantity": 100,
"cost": 18.50,
"description": "Compra a proveedor ABC",
"reference": "COMP-2024-001",
"date": "2024-01-15"
}
{
"code": "PROD-002",
"quantity": 200,
"cost": 15.75,
"description": "Inventario inicial del producto",
"reference": "INV-INICIAL-001"
}
Terminal window
curl -X POST "https://dev-facturacion.e-dinky.test/api/v1/items/add-income" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_token_here" \
-d '{
"code": "PROD-001",
"quantity": 50,
"cost": 20.00,
"description": "Ingreso de inventario por compra"
}'
{
"message": "Inventario agregado exitosamente",
"status": "CREATED",
"payload": {
"item_code": "PROD-001",
"movement_id": "MOV-2024-001",
"quantity_added": 50,
"cost_per_unit": 20.00,
"total_cost": 1000.00,
"previous_stock": 25,
"new_stock": 75,
"movement_date": "2024-01-15T10:30:00Z",
"description": "Ingreso de inventario por compra",
"reference": "COMP-2024-001"
}
}
{
"message": "Item no encontrado",
"status": "NOT_FOUND",
"error": "El item con código 'PROD-999' no existe"
}

Respuesta de Error (422 Unprocessable Entity)

Section titled “Respuesta de Error (422 Unprocessable Entity)”
{
"message": "Error de validación",
"status": "UNPROCESSABLE_ENTITY",
"errors": {
"quantity": [
"La cantidad debe ser mayor a 0"
],
"code": [
"El item no permite control de inventario"
]
}
}
CódigoDescripción
201Inventario agregado exitosamente
400Error en los datos enviados
401Token de autorización inválido
404Item no encontrado
422Error de validación
500Error interno del servidor
  • code: Debe existir en el sistema
  • quantity: Debe ser un número entero positivo
  • El item debe tener allow_accounting = 1
  • El item debe ser de tipo PRODUCT
  • La cantidad debe ser mayor a 0
  • El costo debe ser mayor o igual a 0 (puede ser 0 para donaciones)
  • La fecha no puede ser futura
{
"code": "PROD-001",
"quantity": 100,
"cost": 25.00,
"description": "Compra a Proveedor XYZ",
"reference": "FACT-PROV-001"
}
{
"code": "PROD-001",
"quantity": 500,
"cost": 20.00,
"description": "Inventario inicial - migración de sistema",
"reference": "INV-INICIAL"
}
{
"code": "PROD-001",
"quantity": 5,
"cost": 30.00,
"description": "Devolución de cliente - producto defectuoso",
"reference": "DEV-CLI-001"
}
{
"code": "PROD-001",
"quantity": 10,
"cost": 22.50,
"description": "Ajuste por diferencia en inventario físico",
"reference": "AJ-POS-001"
}
{
"code": "PROD-001",
"quantity": 25,
"cost": 0.00,
"description": "Donación recibida de empresa ABC",
"reference": "DON-REC-001"
}

El sistema calcula automáticamente el costo promedio ponderado:

Nuevo Costo Promedio = (Stock Anterior × Costo Anterior + Cantidad Nueva × Costo Nuevo) / Stock Total
  • Stock anterior: 50 unidades a $20.00 = $1,000.00
  • Ingreso nuevo: 30 unidades a $25.00 = $750.00
  • Stock total: 80 unidades
  • Nuevo costo promedio: ($1,000.00 + $750.00) / 80 = $21.875
Terminal window
curl -X GET "https://dev-facturacion.e-dinky.test/api/v1/items/PROD-001" \
-H "Authorization: Bearer $TOKEN"

La respuesta incluirá:

{
"payload": {
"code": "PROD-001",
"current_cost": 21.88,
"count_available": 80,
"total_value": 1750.00
}
}
// PHP - Agregar múltiples items
$items = [
['code' => 'PROD-001', 'quantity' => 50, 'cost' => 20.00],
['code' => 'PROD-002', 'quantity' => 30, 'cost' => 15.50],
['code' => 'PROD-003', 'quantity' => 75, 'cost' => 35.25]
];
foreach ($items as $item) {
$item['description'] = 'Compra lote ' . date('Y-m-d');
$item['reference'] = 'LOTE-' . date('Ymd');
$response = Http::withHeaders([
'Authorization' => 'Bearer ' . $token,
'Content-Type' => 'application/json'
])->post('https://dev-facturacion.e-dinky.test/api/v1/items/add-income', $item);
if ($response->successful()) {
echo "✓ {$item['code']}: {$item['quantity']} unidades agregadas\n";
} else {
echo "✗ Error en {$item['code']}: " . $response->json()['message'] . "\n";
}
}
// JavaScript - Validar antes de agregar
const validateBeforeAdd = async (token, itemCode, quantity) => {
try {
// 1. Verificar que el item existe y permite inventario
const itemResponse = await axios.get(`https://dev-facturacion.e-dinky.test/api/v1/items/${itemCode}`, {
headers: { 'Authorization': `Bearer ${token}` }
});
const item = itemResponse.data.payload;
if (item.type !== 'PRODUCT') {
throw new Error('Solo se puede agregar inventario a productos');
}
if (item.allow_accounting !== 1) {
throw new Error('El item no permite control de inventario');
}
// 2. Agregar inventario
const addResponse = await axios.post('https://dev-facturacion.e-dinky.test/api/v1/items/add-income', {
code: itemCode,
quantity: quantity,
cost: 20.00,
description: 'Ingreso validado'
}, {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});
return {
success: true,
data: addResponse.data
};
} catch (error) {
return {
success: false,
message: error.message || error.response?.data?.message
};
}
};
  • Usa un formato estándar para referencias: TIPO-YYYY-NNNN
  • Ejemplos: COMP-2024-0001, INV-2024-0001, AJ-2024-0001
  • Incluye información relevante: proveedor, motivo, fecha
  • Evita descripciones genéricas como “ingreso”
  • Incluye todos los costos asociados (transporte, impuestos)
  • Usa el costo real de adquisición
  • Usa la fecha real del movimiento, no la fecha de registro
  • Mantén consistencia en el formato de fechas
  • Siempre valida que el item permita inventario
  • Verifica cantidades y costos antes de enviar
  • 📦 Solo productos: Los servicios no manejan inventario
  • 🔢 Cantidades enteras: No se permiten decimales en cantidades
  • 💰 Costo promedio: Se calcula automáticamente
  • 📅 Fechas: No se pueden registrar movimientos futuros
  • 🔄 Kardex: Cada ingreso genera un movimiento en el kardex
  • 📊 Reportes: Los ingresos aparecen en reportes de inventario
  • 🔒 Auditoría: Todos los movimientos quedan registrados permanentemente

Error: “Item no permite control de inventario”

Section titled “Error: “Item no permite control de inventario””

Solución: Actualizar el item para habilitar inventario:

Terminal window
curl -X PUT "https://dev-facturacion.e-dinky.test/api/v1/items/update" \
-H "Authorization: Bearer $TOKEN" \
-d '{"code": "PROD-001", "allow_accounting": 1, ...}'

Solución: Verificar que quantity sea un entero positivo

Solución: Verificar que el código del item sea correcto y exista en el sistema