# Editar (/docs/developers/api-reference/job-positions/edit)

## Descripcion general [#descripcion-general]

Este endpoint permite actualizar parcialmente un puesto. 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 `job_position_number` del puesto dentro de tu organización. Una solicitud exitosa devuelve `200` con la forma completa del puesto actualizado.

Los puestos eliminados se tratan como no encontrados (`404`).

**Validación de las bandas salariales contra los valores efectivos:** la restricción `salary_band_min ≤ salary_band_max` se valida contra los **valores efectivos** tras aplicar el patch. Si tocas solo `salary_band_min`, se usa el `salary_band_max` actual de la base de datos para verificar la coherencia; lo mismo en sentido contrario. Si la comparación falla, la respuesta es `400` con el campo `salary_band_max`.

## Endpoint [#endpoint]

`PATCH https://app.integranom.com/api/v1/job-positions/{job_position_number}`

**Path param:** `job_position_number` — entero positivo, el número de puesto dentro de la organización.

## Actualizacion minima [#actualizacion-minima]

***

Envía solo los campos que quieras cambiar. El resto del puesto queda intacto.

```json
{ "name": "Gerente Comercial" }
```

**cURL**

```bash
curl -X PATCH "https://app.integranom.com/api/v1/job-positions/5" \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Gerente Comercial" }'
```

**Respuesta**

```json
{
"id": "ck...",
"job_position_number": 5,
"name": "Gerente Comercial",
"code": "GER-VEN",
"description": "Gerencia comercial",
"salary_band_min": "15000.00",
"salary_band_max": "35000.00",
"is_active": true,
"sort_order": 0,
"created_at": "2026-05-24T10:00:00.000Z",
"updated_at": "2026-05-24T11:15:32.000Z"
}
```

## Limpiar campos [#limpiar-campos]

***

`null` (y `""` para strings) limpia el campo. Por ejemplo, para quitar el `code` del puesto:

```json
{ "code": null }
```

Lo mismo aplica a `description`, `salary_band_min` y `salary_band_max`: envíalos como `null` para limpiarlos.

**cURL**

```bash
curl -X PATCH "https://app.integranom.com/api/v1/job-positions/5" \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "code": null }'
```

**Respuesta**

```json
{
"id": "ck...",
"job_position_number": 5,
"name": "Gerente Comercial",
"code": null,
"description": "Gerencia comercial",
"salary_band_min": "15000.00",
"salary_band_max": "35000.00",
"is_active": true,
"sort_order": 0,
"created_at": "2026-05-24T10:00:00.000Z",
"updated_at": "2026-05-24T11:18:09.000Z"
}
```

## Marcar como inactivo [#marcar-como-inactivo]

***

`is_active` lo controla el usuario y es **independiente del borrado**: un puesto puede estar inactivo y seguir apareciendo en `GET /api/v1/job-positions`. Al desactivarlo (`is_active: false`) se **desvincula el puesto de cada empleo** que lo referenciaba (su `job_position_code` queda en `null`). Para retirarlo del listado, usa [DELETE](/docs/developers/api-reference/job-positions/delete).

```json
{ "is_active": false }
```

**cURL**

```bash
curl -X PATCH "https://app.integranom.com/api/v1/job-positions/5" \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'
```

**Respuesta**

```json
{
"id": "ck...",
"job_position_number": 5,
"name": "Gerente Comercial",
"code": null,
"description": "Gerencia comercial",
"salary_band_min": "15000.00",
"salary_band_max": "35000.00",
"is_active": false,
"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                                                                                                                                                             |
| ----------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `name`            | string             | No vacío tras recortar.                                                                                                                                           |
| `code`            | string \| null     | `null` o `""` limpian el código. Se almacena en mayúsculas; debe ser único por organización.                                                                      |
| `description`     | string \| null     | `null` o `""` limpian la descripción.                                                                                                                             |
| `salary_band_min` | number ≥ 0 \| null | `null` limpia la banda inferior. Se devuelve como string decimal.                                                                                                 |
| `salary_band_max` | number ≥ 0 \| null | `null` limpia la banda superior. La coherencia `min ≤ max` se valida contra los valores efectivos tras aplicar el patch.                                          |
| `is_active`       | boolean            | Flag activo controlado por el usuario. Independiente del borrado. Al ponerlo en `false`, se **desvincula el puesto de cada empleo** (`job_position_code → null`). |
| `sort_order`      | integer ≥ 0        |                                                                                                                                                                   |

Si envías `risk_class`, con cualquier valor, la respuesta es `400` con ese campo: la clase de riesgo IMSS se captura en el [registro patronal](/docs/developers/api-reference/employer-registrations/edit).

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

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

## Errores [#errores]

| Status | Causa                                                                                                                                                                                                               |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `400`  | `job_position_number` inválido en la URL; falla de validación del cuerpo (incluido `risk_class`); incoherencia en las bandas salariales (`min > max` efectivo).                                                     |
| `404`  | El puesto con ese `job_position_number` no existe (o fue eliminado) en esta organización.                                                                                                                           |
| `409`  | Carrera por `code` duplicado durante la escritura; o `is_active: false` en un puesto con plazas sin cancelar; o una banda salarial que deja fuera el salario diario autorizado por 30 de alguna plaza sin cancelar. |