# Editar (/docs/developers/api-reference/cost-centers/edit)

## Descripcion general [#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 [#endpoint]

`PATCH 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 [#actualizacion-minima]

***

Envía solo los campos que quieras cambiar. El resto del centro de costos queda intacto.

```json
{ "name": "Centro de costos Ventas Internacionales" }
```

**cURL**

```bash
curl -X PATCH "https://app.integranom.com/api/v1/cost-centers/5" \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Centro de costos Ventas Internacionales" }'
```

**Respuesta**

```json
{
"id": "ck...",
"cost_center_number": 5,
"parent_id": "ck...",
"depth": 1,
"name": "Centro de costos Ventas Internacionales",
"code": "VEN-CC",
"description": null,
"is_active": true,
"sort_order": 0,
"created_at": "2026-05-24T10:00:00.000Z",
"updated_at": "2026-05-24T11:15:32.000Z"
}
```

## Limpiar campos y desanidar [#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.

```json
{
  "description": null,
  "parent_cost_center_code": null
}
```

**cURL**

```bash
curl -X PATCH "https://app.integranom.com/api/v1/cost-centers/5" \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "description": null,
  "parent_cost_center_code": null
}'
```

**Respuesta**

```json
{
"id": "ck...",
"cost_center_number": 5,
"parent_id": null,
"depth": 0,
"name": "Centro de costos Ventas Internacionales",
"code": "VEN-CC",
"description": null,
"is_active": true,
"sort_order": 0,
"created_at": "2026-05-24T10:00:00.000Z",
"updated_at": "2026-05-24T11:18:09.000Z"
}
```

## Cascada a departamentos vinculados [#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.

```json
{
  "code": "VEN-INT",
  "name": "Centro de costos Ventas Internacionales",
  "is_active": true
}
```

**cURL**

```bash
curl -X PATCH "https://app.integranom.com/api/v1/cost-centers/5" \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "code": "VEN-INT",
  "name": "Centro de costos Ventas Internacionales",
  "is_active": true
}'
```

**Respuesta**

```json
{
"id": "ck...",
"cost_center_number": 5,
"parent_id": null,
"depth": 0,
"name": "Centro de costos Ventas Internacionales",
"code": "VEN-INT",
"description": null,
"is_active": true,
"sort_order": 0,
"created_at": "2026-05-24T10:00:00.000Z",
"updated_at": "2026-05-24T11:22:44.000Z"
}
```

## Campos del cuerpo [#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 [#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 `path` y `depth` del CC, y se recalculan `path`/`depth` para **todos los descendientes** del subárbol, en la misma transacción.

### Vinculación de departamentos [#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/departments` con `cost_center_code` — crea un departamento ya vinculado.
* `PATCH /api/v1/departments/{n}` con `cost_center_code` — vincula o desvincula (con `null`) un departamento existente.
* `POST /api/v1/departments/{n}/cost-center` — genera un CC nuevo a partir de un departamento existente.

## Forma de la respuesta [#forma-de-la-respuesta]

`200 OK` — misma forma que la respuesta de [crear](/docs/developers/api-reference/cost-centers/create) en modo single:

```json
{
  "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 [#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.                                                                                                                            |