# Configuración de despliegue mobile (`ui_mobile_layouts`)

La columna `maincompany.ui_mobile_layouts` almacena la configuración mobile por empresa: layouts de listados (`screens`) y opciones de despliegue (módulos ocultos, labels, OCR, flags de Home).

## Endpoints admin

| Método | Ruta | Descripción |
|--------|------|-------------|
| GET | `/api/ui-mobile-layout/modules` | Catálogo de module IDs válidos |
| GET | `/api/ui-mobile-layout/config` | Config efectiva + `sources` |
| PATCH | `/api/ui-mobile-layout/config` | Guardar override de empresa (parcial) |
| DELETE | `/api/ui-mobile-layout/config` | Quitar overrides de config (conserva `screens`) |
| GET | `/api/ui-mobile-layout/get?screen=` | Layout de una pantalla |
| PATCH | `/api/ui-mobile-layout/update` | Upsert layout de pantalla |
| DELETE | `/api/ui-mobile-layout/delete?screen=` | Borrar override de pantalla |

Permiso: `UIMobileLayoutVoter::MANAGE_UI_MOBILE_LAYOUT`.

## Catálogo de módulos

`GET /api/ui-mobile-layout/modules` devuelve los IDs que el admin puede usar en `hiddenModuleIds` y `moduleLabels`:

```json
{
  "data": [
    { "id": "Packages", "defaultLabel": "Paquetes", "poboxOnly": false },
    { "id": "SeaLabel", "defaultLabel": "Etiqueta marítima", "poboxOnly": true }
  ]
}
```

IDs válidos: `SeaLabel`, `AirLabel`, `Packages`, `Prepacks`, `Warehouse`, `Shipments`, `LoadUnit`, `Consolidated`, `Customers`, `Invoice`, `DeliveryList`, `Location`, `Pickup`, `Alert`, `SendReempack`, `SendRequest`, `Quote`, `calculator`.

## PATCH `/api/ui-mobile-layout/config`

Body parcial; solo se actualizan las claves enviadas:

```json
{
  "hiddenModuleIds": ["Quote"],
  "moduleLabels": { "Quote": "Factura Proforma" },
  "features": { "ocr": { "package": true, "prepack": true, "whrec": false } },
  "showCalculator": true,
  "showNewPoBox": false,
  "menuCardRoundedCorners": true
}
```

- `hiddenModuleIds` y `moduleLabels`: reemplazo completo.
- `features.ocr`: merge sobre el sub-objeto existente.
- Flags Home: actualización individual por clave.

## JSON persistido

```json
{
  "screens": [],
  "hiddenModuleIds": ["Quote"],
  "moduleLabels": { "Quote": "Factura Proforma" },
  "features": { "ocr": { "package": true } },
  "showCalculator": false,
  "showNewPoBox": false,
  "menuCardRoundedCorners": false
}
```

## Cascada de resolución

Por campo: **empresa custom → platform (id=1) → default**.

| Campo | Default |
|-------|---------|
| `hiddenModuleIds` | `[]` |
| `moduleLabels` | `{}` |
| `features.ocr` | `{}` |
| `showCalculator` / `showNewPoBox` / `menuCardRoundedCorners` | `false` |
| `screens` | fallback por pantalla |
| `allowedPoboxCompanies` | acrónimos con `enabled: true` en `companyPoboxAccess.json` |

## Profile

`GET /api/user/profile` incluye `uiConfigMobile` con el mismo shape que `GET /config` → `data` (sin `sources`):

- `screens`
- `hiddenModuleIds`
- `moduleLabels`
- `features`
- `showCalculator`
- `showNewPoBox`
- `menuCardRoundedCorners`
- `allowedPoboxCompanies`

`allowedPoboxCompanies` se gestiona en `/api/company-pobox-access/*`, no en `/config`.
