Editar
Actualiza parcialmente un centro de costos existente.
Descripcion general
Este endpoint permite actualizar parcialmente un centro de costos. Todos los campos del cuerpo son opcionales: si omites una clave, ese campo no se toca; si la envías como null, ese campo se limpia (cuando aplica). El identificador en la URL es el cost_center_number del CC dentro de tu organización. Una solicitud exitosa devuelve 200 con la forma completa del centro de costos actualizado.
Endpoint
https://app.integranom.com/api/v1/cost-centers/{cost_center_number}Path param: cost_center_number — entero positivo, el número de centro de costos dentro de la organización.
Actualizacion minima
Envía solo los campos que quieras cambiar. El resto del centro de costos queda intacto.
{ "name": "Centro de costos Ventas Internacionales" }Limpiar campos y desanidar
null (y "" para strings) limpia el campo. En particular, parent_cost_center_code: null desancla el centro de costos y lo convierte en raíz (depth: 0).
Nota: code no es nullable — es una columna requerida en la base de datos.
{
"description": null,
"parent_cost_center_code": null
}Cascada a departamentos vinculados
Tras actualizar el CC, el handler corre un updateMany sobre cada departamento vivo vinculado para espejar los valores del CC en name, code, description, is_active, sort_order. Esto mantiene la invariante de vinculación intacta, hayas o no tocado esos campos en este PATCH.
{
"code": "VEN-INT",
"name": "Centro de costos Ventas Internacionales",
"is_active": true
}Campos del cuerpo
| Campo | Tipo | Notas |
|---|---|---|
code | string | ≤ 60 caracteres, se almacena en mayúsculas. No nullable — es columna requerida. |
name | string | No vacío tras recortar. |
description | string | null | null o "" limpian la descripción. |
parent_cost_center_code | string | null | null convierte el CC en raíz. El nuevo padre debe existir y no puede ser el propio CC ni un descendiente. |
is_active | boolean | Flag activo controlado por el usuario. Independiente del borrado — un CC puede estar inactivo y seguir apareciendo en GET. Al ponerlo en false, se desvincula de cada empleo el CC (cost_center_code → null) y el departamento (department_code → null) de los empleos cuyo departamento esté vinculado a este CC; además el flag se espeja a los departamentos vinculados. |
sort_order | integer ≥ 0 |
Reparenting
Si parent_cost_center_code cambia:
- Primero corre una verificación de ciclos: el nuevo padre no puede ser el propio CC ni un descendiente suyo (devuelve
400). - Se actualizan
pathydepthdel CC, y se recalculanpath/depthpara todos los descendientes del subárbol, en la misma transacción.
Vinculación de departamentos
No se expone en PATCH /api/v1/cost-centers/{n}. La vinculación es unidireccional: los departamentos se atan a los CCs mediante los endpoints de departamentos:
POST /api/v1/departmentsconcost_center_code— crea un departamento ya vinculado.PATCH /api/v1/departments/{n}concost_center_code— vincula o desvincula (connull) un departamento existente.POST /api/v1/departments/{n}/cost-center— genera un CC nuevo a partir de un departamento existente.
Forma de la respuesta
200 OK — misma forma que la respuesta de crear en modo single:
{
"id": "ck...",
"cost_center_number": 5,
"parent_id": null,
"depth": 0,
"name": "Centro de costos Ventas",
"code": "VEN-CC",
"description": null,
"is_active": true,
"sort_order": 0,
"created_at": "...",
"updated_at": "..."
}Errores
| Status | Causa |
|---|---|
400 | cost_center_number inválido en la URL; falla de validación del cuerpo; parent_cost_center_code no encontrado; intento de poner el padre en sí mismo o en un descendiente. |
404 | El centro de costos con ese cost_center_number no existe (o fue eliminado) en esta organización. |
409 | Carrera por code duplicado durante la escritura. |

