# Endpoint: `get_wa_usr`

**Archivo:** `intranet/sys/mods/flights/motor.php` · línea 1470  
**Propósito:** Endpoint de prueba/debug para validar la identificación de un número de WhatsApp conocido dentro del contexto del bot de Humming Airways. **No debe usarse en producción.**

---

## Descripción

Invoca `WAPI_BUILD_CONTEXT` con el número de soporte técnico de xGestion (`XGESTION_TECH_SUPPORT`) fijado como `wa_id`, forzando `sys_id = HummingAirwaysDbId` (139). Devuelve el contexto completo que el bot usaría para ese número: usuario identificado, cuenta, sucursal, roles, locación y razones de elegibilidad.

Sirve para verificar, sin usar un teléfono real, que la cadena de identificación (`wa_id → usr_id → acc_id → loc_id → rol`) funciona correctamente en el entorno apuntado.

---

## Autenticación

Bearer token en header `Authorization`, validado contra `API_ENVIRONMENT` (definido en config).

| Entorno | Constante     | `sys_id` forzado |
|---------|---------------|------------------|
| PRD     | `env = 1`     | 139              |
| DEV     | `env = 2`     | 139              |
| LOC     | `env = 3`     | 139              |

Si el token es inválido o está ausente, la capa de auth de `motor.php` retorna `HTTP 403` antes de llegar a este bloque.

---

## Request

```
POST /intranet/sys/mods/flights/motor.php
Authorization: Bearer <token>
Content-Type: application/json

{ "execute": "get_wa_usr" }
```

No requiere parámetros adicionales: `wa_id` y `sys_id` están hardcodeados en el código.

---

## Constantes involucradas

| Constante             | Valor           | Definida en              |
|-----------------------|-----------------|--------------------------|
| `get_wa_usr`          | `'get_wa_usr'`  | `constants.php` · l.2272 |
| `XGESTION_TECH_SUPPORT` | `'5491150049002'` | `constants.php` · l.790  |
| `HummingAirwaysDbId`  | `139`           | `airlines.php` · l.885   |

---

## Flujo interno — `WAPI_BUILD_CONTEXT`

`wsp.php` · función `WAPI_BUILD_CONTEXT()` · línea 1907.

```
wa_id (limpiado, solo dígitos)
  │
  ├─ [1] Resolución del sistema
  │       SELECT sistema FROM system.sistemas WHERE id = 139
  │       → $x[sysName], $x[keyInfo][keySys]
  │
  ├─ [2] Modo simulación
  │       SELECT vPayApiToken FROM system.users WHERE wa_id = '5491150049002'
  │       Si vPayApiToken tiene dígitos → reemplaza wa_id (simula otro número)
  │
  ├─ [3] Sucursal por defecto
  │       SQL_SUC_DEFAULT(139) → $x[suc_id]
  │
  ├─ [4] Identificación del usuario
  │       WAPI_USER_IDENTIFICATION($x) → $x[usr_id]
  │       Si identificado → SELECT user FROM system.users → $x[usrName]
  │                        → WAPI_REGISTER($x)
  │       Si no → $x[usr_id] = usrJohnDoeId
  │
  ├─ [5] Datos de intranet (rol, cuenta, perfil)
  │       JOIN system.users_sistemas + system.sistemas WHERE sys_id=139
  │       → $x[rusEnv], $x[acc_id], $x[rol], $x[perfil_id]
  │       → SELECT cuenta FROM db_139.cuentas → $x[accName]
  │
  ├─ [6] Fallback de cuenta por teléfono
  │       Si acc_id == 0 → SELECT por right(numero,10) en db_139.telefonos
  │       → $x[acc_id], $x[accName], $x[loc_id]
  │
  └─ [7] Resolución de locación
          Si loc_id == 0 → SELECT desde db_139.locaciones WHERE cuenta_id
          → $x[loc_id]
```

---

## Response

JSON con el contexto completo de identificación. Campos principales:

| Campo        | Tipo    | Descripción                                                  |
|--------------|---------|--------------------------------------------------------------|
| `wa_id`      | string  | Número WA sanitizado (solo dígitos)                          |
| `sys_id`     | int     | `139` (Humming Airways)                                      |
| `sysName`    | string  | `"Humming Airways"` (desde `system.sistemas`)                |
| `usr_id`     | int     | ID del usuario en `system.users`; `usrJohnDoeId` si no encontrado |
| `usrName`    | string  | Nombre del usuario (campo `user` en `system.users`)          |
| `acc_id`     | int     | ID de cuenta en `db_139.cuentas`                             |
| `accName`    | string  | Nombre de la cuenta                                          |
| `suc_id`     | int     | ID de sucursal por defecto del sistema                       |
| `loc_id`     | int     | ID de locación asociada a la cuenta                          |
| `rol`        | int     | Bitmask de roles del usuario en `system.users_sistemas`      |
| `rusEnv`     | int     | Entorno de acceso intranet                                   |
| `perfil_id`  | int     | Perfil del usuario en el sistema                             |
| `keyInfo`    | object  | Mensajes de diagnóstico de cada paso de resolución           |
| `keyErr`     | array   | Errores ocurridos durante la construcción del contexto       |
| `checksum`   | int     | Checksum calculado por `WAPI_BUILD_CONTEXT`                  |

**Ejemplo de respuesta exitosa:**
```json
{
  "wa_id": "5491150049002",
  "sys_id": 139,
  "sysName": "Humming Airways",
  "usr_id": 42,
  "usrName": "Claudio Mucci",
  "acc_id": 7,
  "accName": "Claudio Mucci",
  "suc_id": 3,
  "loc_id": 12,
  "rol": 255,
  "rusEnv": 1,
  "perfil_id": 5,
  "checksum": 0,
  "keyInfo": {
    "keySys": "Sistema: Humming Airways",
    "keySuc": "Sucursal por defecto: 3",
    "keyUsr": "Usuario identificado: 42 - Claudio Mucci",
    "keyAcc": "Cuenta encontrada por rus: 7 - Claudio Mucci",
    "keyLoc": "Locación encontrada por cuenta: 12"
  },
  "keyErr": []
}
```

---

## Limitaciones y advertencias

- **Hardcoded:** `wa_id` y `sys_id` están fijos en el código. Este endpoint no acepta parámetros de usuario.
- **Sin control de acceso:** No verifica `CHKUSR`. El único gate es el Bearer token de la API.
- **Solo para Humming:** `sys_id` siempre es 139. No sirve para otros sistemas del ERP.
- **Modo simulación activo:** Si el usuario `5491150049002` tiene `vPayApiToken` poblado con un número, el contexto se construye para ese número simulado, no para el número original.
- **Registra actividad:** `WAPI_REGISTER($x)` se ejecuta si el usuario es identificado. En producción esto puede generar registros de actividad no deseados.

---

## Casos de uso válidos

1. Verificar que el número de soporte técnico está correctamente vinculado a `system.users` con `wa_id`.
2. Confirmar que la cadena `usr_id → acc_id → loc_id → rol` resuelve correctamente en el entorno apuntado.
3. Depurar el flujo de `WAPI_BUILD_CONTEXT` sin necesitar un teléfono físico o acceso al bot.
4. Validar que el modo simulación (campo `vPayApiToken`) funciona al cambiar de entorno.

---

## Archivos relacionados

| Archivo | Rol |
|---------|-----|
| [motor.php](../intranet/sys/mods/flights/motor.php) | Definición del endpoint (`execute=get_wa_usr`) |
| [wsp.php](../intranet/includes/fns/wsp.php) | `WAPI_BUILD_CONTEXT`, `WAPI_USER_IDENTIFICATION`, `WAPI_REGISTER` |
| [constants.php](../intranet/includes/constants.php) | `get_wa_usr`, `XGESTION_TECH_SUPPORT` |
| [airlines.php](../intranet/includes/fns/airlines.php) | `HummingAirwaysDbId = 139` |