---
# System prepended metadata

title: Disponibilidad

---

# Disponibilidad

permisos de módulo:

- `readAvailability`
- `writeAvailablity`

## 1. Solicitudes

Colección: `fleetRequirements`
Campos:

- `startDate`: Fecha de inicio. Requirida.
- `endDate`: Fecha de fin. Opcional.
- `status`: Estado de solicitud. Opciones: `programmed | active | expired`
- `statusName`: Nombre de estado. Opciones: `Programada | Vigente | Expirada`

Los estados son actualizados automáticamente y se libera los ensambles asignados cuando expire la solicitud (lambda `updateFleetRequirementStatus`, frecuencia: 5 minutos)

## 2. Asignación de ensambles

Colecciones:

- Ensambles: `assemblies`
- Asignaciones de ensambles: `assemblyAssignments`


### 2.1 Endpoint de opciones de filtro

`GET {BASE_URL}/typeTransportUnit/api/typeTransportUnit/searchAssemblyOptions`

Es el mismo endpoint que se usa en la sección de ensambles. Se usará para las opciones de filtro de la tabla de selección de ensambles y para la tabla de ensambles en el detalle de solicitud.

#### Query params

- `type`: Columna. Opciones disponibles: `'trucker' | 'transportUnit' | 'trailer' | 'secondTrailer' | 'dolly'`
- `operation`: Operación para la cual se necesita las opciones de ensamble. Opciones disponibles: `create | list`. Para ambas tablas (detalle de solicitud y asignación de ensambles) usar opción `list`.
- `fleetRequirementId`: ID de solicitud. Opcional. Para la tabla de detalle de solicitud. Considera sólamente los ensambles asignados a la solicitud especificada para obtener las opciones. Mandar tanto para la tabla de detalle de solicitud como para la tabla de asignación.
- `includeUnassigned`: Incluir ensambles no asignados. Opcional. Opciones `true | false`. Por defecto `false`. Si se manda `fleetRequirementId` controla si se incluyen los ensambles no asignados aparte de los ensambles asignados a la solicitud especificada. Para la tabla de asignación enviar `true`, para la tabla de detalle enviar `false` o no enviar.
- `page`: página de paginación
- `size`: tamaño de página
- `search`: Búsqueda

#### Ejemplo de pedido

`GET https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/searchAssemblyOptions?type=trucker&page=0&size=10&operation=list&fleetRequirementId=68f2f4f0a9cdca9246d74bc9&includeUnassigned=true`


#### Ejemplo de respuesta

```
{
    "message": "Opciones de ensamble recuperadas exitosamente.",
    "options": [
        {
            "_id": "678a5ac29288cc2c5ae1fc0a",
            "name": "Alberto Espinoza - 984738"
        },
        {
            "_id": "678eacc49664ddebbc222955",
            "name": "Hugo Torrez - 79849849"
        },
        {
            "_id": "677fc608bfd98704cdb0c51f",
            "name": "Pietrooo Torrico - 84915132"
        },
        {
            "_id": "678571150d0a629c5cb3b6af",
            "name": "Valentin Rojas - 789198498"
        }
    ]
}
```

### 2.2 Endpoint de listado de ensambles

`GET {BASE_URL}/typeTransportUnit/api/typeTransportUnit/assembly`

Usar para alimentar la tabla de selección de ensambles para la asignación.

#### Query params

- `page`: página de paginación
- `size`: tamaño de página
- `fleetRequirementId`: ID de solicitud. Se incluyen los ensambles no asignados o asignados a la solicitud especificada. Si no se manda no se excluye ensambles en base a asignación.
- `search`: Búsqueda
- `column`: Columnas de filtro, separadas por `,`. Columnas permitidas:
    - `transportUnit`: Camión (mandar IDs)
    - `trucker`: Operador (mandar IDs)
    - `trailer`: Remolque (mandar IDs)
    - `secondTrailer`: 2do remolque (mandar IDs)
    - `dolly`: Dolly (mandar IDs)
- `operation`: Operaciones de filtro, separados por `,`. Valores permitidos: `is`, `isAnyOf`, `isNot`
- `value`: Valores de filtro, separados por `,`, múltiples valores para una misma columna separados por `~`, valor `-` filtra documentos sin ese campo
- `typeFilter`: Tipo de combinación de múltiples filtros. Valores permitidos: `and` y `or` (por defecto `and`)

#### Ejemplo de pedido

```
GET https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/assembly?page=0&size=50&fleetRequirementId=68f2f573cebc561a13641dbb&column=transportUnit&operation=isAnyOf&value=6787fbbcb961033b479d5e00&typeFilter=and
```

#### Ejemplo de respuesta

```
{
    "message": "Ensambles recuperados exitosamente.",
    "totalRecords": 5,
    "totalPages": 1,
    "assemblies": [
        {
            "_id": "68b0669627ee3dc1b65d905f",
            "company": {
                "companyId": "65e7de4064347a92253f9a36",
                "companyName": "ZEMOG",
                "taxId": "URE180429TM6"
            },
            "vehicleConfiguration": "T3S2R4",
            "trucker": {
                "userId": "6787d5b4ee31f4d0da7dcb34",
                "driverLicense": "451265456",
                "firstName": "Jhon",
                "lastName": "Huanca"
            },
            "transportUnit": {
                "transportUnitId": "66be55f34a3c0729d2981a25",
                "plate": "EWREW34",
                "economicNumber": "RTR5645",
                "vehicleType": "T",
                "numAxis": 3,
                "numWheels": 10
            },
            "trailer": {
                "transportUnitId": "66b5088428f9228e2f208bb8",
                "plate": "AAA124",
                "economicNumber": "AA4",
                "vehicleType": "S",
                "numAxis": 2,
                "numWheels": 8
            },
            "secondTrailer": {
                "transportUnitId": "66aa8c1ab96bfe12947c0063",
                "plate": "HHG3434",
                "economicNumber": "ERERERE",
                "vehicleType": "R",
                "numAxis": 3,
                "numWheels": 12
            },
            "dolly": {
                "dollyId": "66a122fc1969b4c020e5ed9e",
                "economicNumber": "D02",
                "type": "C",
                "numWheels": 4
            },
            "row": {
                "enable": true,
                "created": "2025-08-28T14:24:22.236Z",
                "lastUpdated": "2025-08-28T14:24:22.236Z",
                "createUserId": "65e7de4664347a92253f9a3e",
                "updateUserId": "65e7de4664347a92253f9a3e"
            },
            "assignedFleetRequirementId": "68f2f573cebc561a13641dbb",
            "truckerAssignedLoadingOrders": [],
            "transportUnitAssignedLoadingOrders": [],
            "assigned": false
        },
        ...
    ]
}
```

### 2.3 Endpoint de asignación y reasignación de ensambles

`PUT {BASE_URL}/typeTransportUnit/api/typeTransportUnit/assignAssemblies`

Usar para realizar la asignación de ensambles.

#### Body

- `fleetRequirementId`: ID de solicitud
- `assemblyIds`: IDs de ensambles seleccionados para asignar
- `unassignAssemblyIds`: IDs de ensambles previamente asignados, deseleccionados para desasignar 

#### Ejemplo de pedido

`PUT https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/assignAssemblies`

```
{
    "fleetRequirementId": "68f284380eb7afc7b152e100",
    "assemblyIds": [
        "68b0669627ee3dc1b65d905f"
    ],
    "unassignAssemblyIds": [
        "68069264ba8ddae6f4c66c98"
    ]
}
```

#### Ejemplo de respuesta

```
{
    "message": "Ensambles asignados exitosamente.",
    "assemblyAssignments": [
        {
            "_id": "6902df4c4a02f1b65182aa1d",
            "fleetRequirementId": "68fb99433048d91f39162c56",
            "storehouseId": "67bca2269e107918e87513cf",
            "storehouseName": "AJEMEX",
            "expeditionType": "Z3",
            "companyId": "65ce0f94a81da6be526f433e",
            "companyName": "GMODELO",
            "transportCompanyId": "65e7de4064347a92253f9a36",
            "transportCompanyName": "ZEMOG",
            "assemblyId": "67900c70f6638741dc47151f",
            "truckId": "678e181bec8259e5491d671a",
            "truckPlate": "EEWW212",
            "truckEconomicNumber": "323324WQR",
            "truckerId": "678eacc49664ddebbc222955",
            "truckerName": "Hugo Torrez",
            "truckerDriverLicense": "79849849",
            "trailerId": "678feb9d5e3227cbfcea5312",
            "trailerPlate": "WWW3333",
            "trailerEconomicNumber": "REWQWEEWQE",
            "availabilityStatusCode": "pending",
            "availabilityStatusName": "Pendiente",
            "availabilityReasonCode": null,
            "availabilityReasonName": null,
            "availabilityStorehouseId": null,
            "availabilityStorehouseName": null,
            "arrivalDay": null,
            "arrivalTime": null,
            "arrivalDate": null,
            "createdAt": "2025-10-30T03:45:15.485Z",
            "createdByUserId": "65ce0f95a81da6be526f4341",
            "lastUpdatedAt": "2025-10-30T03:45:15.485Z",
            "lastUpdatedByUserId": "65ce0f95a81da6be526f4341",
            "enable": true
        }
    ]
}
```

### 2.4 Endpoint de listado de asignaciones de ensamble

`GET {BASE_URL}/typeTransportUnit/api/typeTransportUnit/assemblyAssignments`

Usos:
1. Tabla de asignaciones en detalle de solicitud. (Enviando `fleetRequirementId`)
2. Tabla de actualización manual de disponibilidad. (Sin enviar `fleetRequirementId`)
3. Tabla de disponibilidad en detalle de solicitud con asignaciones activas. (Mismo que 1. Enviando `fleetRequirementId`)
4. Descarga de sábana de disponibilidad (Enviando `startDay`, `endDay`, `time` y `format=xlsx`)

#### Query params

- `page`: página de paginación
- `size`: tamaño de página
- `fleetRequirementId`: ID de solicitud. Se incluyen las asignaciones asignadas a la solicitud especificada. Si no se manda no se excluye ensambles en base a asignación.
- `search`: Búsqueda
- `column`: Columnas de filtro, separadas por `,`. Columnas permitidas:
    - `transportUnit`: Camión (mandar IDs)
    - `trucker`: Operador (mandar IDs)
    - `trailer`: Remolque (mandar IDs)
    - `secondTrailer`: 2do remolque (mandar IDs)
    - `dolly`: Dolly (mandar IDs)
- `operation`: Operaciones de filtro, separados por `,`. Valores permitidos: `is`, `isAnyOf`, `isNot`
- `value`: Valores de filtro, separados por `,`, múltiples valores para una misma columna separados por `~`, valor `-` filtra documentos sin ese campo
- `typeFilter`: Tipo de combinación de múltiples filtros. Valores permitidos: `and` y `or` (por defecto `and`)
- `startDay`: Día inicial de snapshot. Opcional. Formato `AAAA-MM-DD` (UTC).
- `endDay`: Día final de snapshot. Opcional Formato `AAAA-MM-DD` (UTC).
- `time`: Tiempo de snapshot. Opcional. Formato `HH-MM` (UTC). Si no se envía se asumen todos los horarios.
- `format`: Formato de respuesta. Opciones `json` (por defecto) y `xlsx` para descarga de sábana.
- `outputFormat`: Formato de output. Opciones `assignment` (por defecto) y `fleetRequirement` para tabla de detalle de solicitudes en pantalla de dashboard. Cuando es `fleetRequirement`, si bien la búsqueda se hace sobre asignaciones y asignaciones históricas, al final se agrupan las asignaciones por solicitud y se proporcionan datos de las solicitudes.

#### Ejemplo de pedido

`GET https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/assemblyAssignments?page=0&size=50&fleetRequirementId=68f284380eb7afc7b152e100&column=transportUnit&operation=isAnyOf&value=68068e331289f17a6246593e&typeFilter=and`


#### Ejemplo de respuesta

```
{
    "message": "Asignaciones de ensambles recuperados exitosamente.",
    "totalRecords": 1,
    "totalPages": 1,
    "assemblyAssignments": [
        {
            "_id": "6902df4c4a02f1b65182aa1d",
            "fleetRequirementId": "68fb99433048d91f39162c56",
            "storehouseId": "67bca2269e107918e87513cf",
            "storehouseName": "AJEMEX",
            "expeditionType": "Z3",
            "companyId": "65ce0f94a81da6be526f433e",
            "companyName": "GMODELO",
            "transportCompanyId": "65e7de4064347a92253f9a36",
            "transportCompanyName": "ZEMOG",
            "assemblyId": "67900c70f6638741dc47151f",
            "truckId": "678e181bec8259e5491d671a",
            "truckPlate": "EEWW212",
            "truckEconomicNumber": "323324WQR",
            "truckerId": "678eacc49664ddebbc222955",
            "truckerName": "Hugo Torrez",
            "truckerDriverLicense": "79849849",
            "trailerId": "678feb9d5e3227cbfcea5312",
            "trailerPlate": "WWW3333",
            "trailerEconomicNumber": "REWQWEEWQE",
            "secondTrailerId": null,
            "secondTrailerPlate": null,
            "secondTrailerEconomicNumber": null,
            "dollyId": null,
            "dollyEconomicNumber": null,
            "availabilityStatusCode": "pending",
            "availabilityStatusName": "Pendiente",
            "availabilityReasonCode": null,
            "availabilityReasonName": null,
            "availabilityStorehouseId": null,
            "availabilityStorehouseName": null,
            "arrivalDay": null,
            "arrivalTime": null,
            "arrivalDate": null,
            "createdAt": "2025-10-30T03:45:15.485Z",
            "createdByUserId": "65ce0f95a81da6be526f4341",
            "lastUpdatedAt": "2025-10-30T03:45:15.485Z",
            "lastUpdatedByUserId": "65ce0f95a81da6be526f4341",
            "enable": true
        }
    ],
    "availabilityReasonOptions": [
        {
            "id": "maintenance",
            "name": "Mantenimiento"
        },
        {
            "id": "noTrucker",
            "name": "Sin operador"
        },
        {
            "id": "sinister",
            "name": "Siniestro"
        },
        {
            "id": "programmed",
            "name": "Programado"
        }
    ],
    "availabilityStorehouseOptions": [
        {
            "id": "66be2529b044aa8f5dcf9d8b",
            "name": "CCT"
        },
        {
            "id": "66be2526b044aa8f5dcf9d6f",
            "name": "CCY"
        },
        {
            "id": "66be252eb044aa8f5dcf9db5",
            "name": "CCZ"
        },
        {
            "id": "66be2528b044aa8f5dcf9d83",
            "name": "CMC"
        },
        {
            "id": "66be2527b044aa8f5dcf9d79",
            "name": "CMG"
        },
        {
            "id": "66be2525b044aa8f5dcf9d65",
            "name": "CMM"
        },
        {
            "id": "66be252bb044aa8f5dcf9d95",
            "name": "CMP"
        },
        {
            "id": "66be252bb044aa8f5dcf9d9d",
            "name": "CMT"
        }
    ],
    "scheduleTimes": [
        "10:00",
        "15:00",
        "17:00",
        "19:00",
        "00:30"
    ]
}
}
```


#### Ejemplo de pedido de reporte de sábana

```
GET https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/assemblyAssignments?startDay=2025-11-17&endDay=2025-11-18&time=15:00&format=xlsx
```

#### Ejemplo de pedido para detalle de solicitudes en dashboard


```
GET https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/assemblyAssignments?format=json&startDay=2025-11-17&endDay=2025-11-18&time=15:00&outputFormat=fleetRequirement
```

**Respuesta:**

```
{
    "message": "Asignaciones de ensambles recuperados exitosamente.",
    "totalRecords": 32,
    "totalPages": 1,
    "assemblyAssignments": [
        {
            "_id": "69133868a27d46946ef0112b",
            "startDate": "2025-11-11T06:00:00.000Z",
            "storehouseName": "CCT",
            "expeditionType": "Z3",
            "operationTypeTagName": "BOTE",
            "operationTypeTagColor": "#abb8c3",
            "transportCompanyName": "ZEMOG",
            "numAssemblies": 4,
            "availableAssemblies": 0,
            "occupiedAssemblies": 0,
            "fleetRequirementId": "",
            "downloadType": "Por corte",
            "downloadDate": "2025-11-18 15:00:00",
            "availabilityLastUpdatedAtMx": "",
            "availabilityLastUpdatedAtLocal": "",
            "truckerSchema": 1,
            "dollyClass": "8 llantas",
            "arrivalDateMx": "",
            "arrivalDateLocal": ""
        },
        ...
    ],
    ...
```

### 2.5 Endpoint de opciones de filtro para asignaciones

`GET {BASE_URL}/typeTransportUnit/api/typeTransportUnit/assemblyAssignmentOptions`

Para la pantalla de disponibilidad.

#### Query params

- `field`: Columna. Opciones disponibles: `'trucker' | 'transportUnit' | 'trailer' | 'secondTrailer' | 'dolly' | 'storehouse' | 'expeditionType'`

- `fleetRequirementId`: ID de solicitud. Opcional. Considera sólamente las asignaciones a la solicitud especificada para obtener las opciones.
- `page`: página de paginación
- `size`: tamaño de página
- `search`: Búsqueda
- `day`: Día de snapshot. Opcional. Formato `AAAA-MM-DD` (UTC).
- `time`: Tiempo de snapshot. Opcional. Formato `HH-MM` (UTC).

#### Ejemplo de pedido

`GET https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/assemblyAssignmentOptions?field=trucker&page=0&size=10&search=hug`


#### Ejemplo de respuesta

```
{
    "message": "Opciones de asignaciones recuperadas exitosamente.",
    "totalRecords": 1,
    "totalPages": 1,
    "options": [
        {
            "id": "678eacc49664ddebbc222955",
            "name": "Hugo Torrez - 79849849"
        }
    ]
}
```

### 2.6 Endpoint de actualización de disponibilidad

`PUT {BASE_URL}/typeTransportUnit/api/typeTransportUnit/updateAvailability`


#### Body

Array `updates` de objetos, cada uno con los siguientes campos:

- `assemblyAssignmentId`: ID de asignación. Obligatorio
- `availabilityStatusCode`: Código de estado de disponibilidad. Opcional.
- `availabilityReasonCode`: Código de razón de disponibilidad. Opcional.
- `availabilityStorehouseId`: ID de instalación de lugar de disponibilidad. Opcional.
- `arrivalDay`: Día de llegada. (UTC -6)
- `arrivalTime`: Hora de llegada. (UTC -6)

#### Ejemplo de pedido

`PUT https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/updateAvailability`


```
{
    "updates": [
        {
            "assemblyAssignmentId": "6902df4c4a02f1b65182aa1d",
            "availabilityStatusCode": "occupied",
            "availabilityReasonCode": "maintenance",
            "availabilityStorehouseId": "66be2525b044aa8f5dcf9d65",
            "arrivalDay": "2025-10-30",
            "arrivalTime": "15:30"
        }
    ]
}
```

#### Ejemplo de respuesta

```
{
    "message": "Asignaciones actualizadas exitosamente.",
    "assemblyAssignments": [
        {
            "_id": "6902df4c4a02f1b65182aa1d",
            "fleetRequirementId": "68fb99433048d91f39162c56",
            "storehouseId": "67bca2269e107918e87513cf",
            "storehouseName": "AJEMEX",
            "expeditionType": "Z3",
            "companyId": "65ce0f94a81da6be526f433e",
            "companyName": "GMODELO",
            "transportCompanyId": "65e7de4064347a92253f9a36",
            "transportCompanyName": "ZEMOG",
            "assemblyId": "67900c70f6638741dc47151f",
            "truckId": "678e181bec8259e5491d671a",
            "truckPlate": "EEWW212",
            "truckEconomicNumber": "323324WQR",
            "truckerId": "678eacc49664ddebbc222955",
            "truckerName": "Hugo Torrez",
            "truckerDriverLicense": "79849849",
            "trailerId": "678feb9d5e3227cbfcea5312",
            "trailerPlate": "WWW3333",
            "trailerEconomicNumber": "REWQWEEWQE",
            "secondTrailerId": null,
            "secondTrailerPlate": null,
            "secondTrailerEconomicNumber": null,
            "dollyId": null,
            "dollyEconomicNumber": null,
            "availabilityStatusCode": "pending",
            "availabilityStatusName": "Ocupado",
            "availabilityReasonCode": "maintenance",
            "availabilityReasonName": "Mantenimiento",
            "availabilityStorehouseId": "66be2525b044aa8f5dcf9d65",
            "availabilityStorehouseName": "CMM",
            "arrivalDay": "2025-10-30",
            "arrivalTime": "15:30",
            "arrivalDate": "2025-10-30T21:30:00.000Z",
            "createdAt": "2025-10-30T03:45:15.485Z",
            "createdByUserId": "65ce0f95a81da6be526f4341",
            "lastUpdatedAt": "2025-10-30T07:17:24.553Z",
            "lastUpdatedByUserId": "65ce0f95a81da6be526f4341",
            "enable": true
        }
    ]
}
```

#### Uso para pantalla de disponibilidad

**Llamado a endpoint de opciones**: Se utiliza el endpoint de opciones de asignaciones.


**Llamado a endpoint de listado de asignaciones**: Se reutiliza el endpint de listado de asignaciones sólo sin especificar el ID de solicitud. Ejemplo:

`https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/assemblyAssignments?page=0&size=50`

Revisar los campos nuevos en ejemplo de respuesta.


**Opciones de disponibilidad**: Las opciones para los campos relacionados a disponibilidad se mandan en el endpoint de listado de asignaciones con el formato común `{ "id": ..., "name": ... }`:

- `availabilityStatusOptions`: Opciones para estado
- `availabilityReasonOptions`: Opciones para razón
- `availabilityStorehouseOptions`: Opciones para lugar de disponibilidad


#### Uso para listado de disponibilidad en detalle de solicitud

**Opciones de horario**: En la respuesta del endpoint de listado de asignaciones se se manda el campo `scheduleTimes` con los horarios configurados para la compañía embarcadora.

**Opciones de filtros**: Se reutiliza el endpoint de opciones de filtro para asignaciones, si el usuario selecciona una fecha pasada, se le pasan los parámetros `day` y `time` (UTC) al endpoint de opciones también.

**Listado**: Se reutiliza el endpoint de listado de asignaciones, si el usuario selecciona una fecha pasada, se le pasan los parámetros `day` y `time` (UTC) al endpoint de opciones también.


## 3. Uploader Para Actualización de Disponibilidad

#### 3.1 Plantilla

La plantilla es un archivo estático con validación de opciones.

Link:

https://fmsstages-filestasks-1b138qf473xbw.s3.us-east-1.amazonaws.com/Plantilla+disponibilidad.xlsx

#### 3.2 Endpoint de inicio de subida

Para subir un archivo del usuario, se hace un pedido al endpoint

`GET {BASE_URL}/rates/api/rates/startUpdate`

Query params:

- `type=availability`: Tipo de uploader (siempre `availability` para disponibilidad)
- `fileName`: Nombre del archivo subido por el usuario.
- `pusherUuid`: UUID que será usado para canal de Pusher para ir mandando las actualizaciones del procesamiento del archivo (para tabla de subidas).


Ejemplo:

```
https://apiqa.deltaxbeta.com/rates/api/rates/startUpdate?type=availability&fileName=Plantilla+disponibilidad.xlsx&pusherUuid=4605a4be-eee4-4e80-9720-bcf24af246fc
```

Respuesta:

```
{
    "message": "Subida de tarifario iniciada exitosamente.",
    "preSignedUrl": "https://ab-availability-qa.s3.us-west-1.amazonaws.com/Plantilla%20disponibilidad_1762314984064.xlsx?AWSAccessKeyId=ASIA4ZO6GY5L54Q3CBLP&Content-Type=application%2Fvnd.openxmlformats-officedocument.spreadsheetml.sheet&Expires=1762315284&Signature=CTt9bq1MUublQtKpmcxAQwzK7Yk%3D&X-Amzn-Trace-Id=Root%3D1-690acae5-53a520c81fe40ccc557d5f34%3BParent%3D747f309ad3b07598%3BSampled%3D0%3BLineage%3D1%3Ad6cf2ec1%3A0&x-amz-security-token=IQoJb3JpZ2luX2VjELz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMSJHMEUCICENvY3kMCWosxG8hKpDmRCEnMKbcQgvbaMiEcFBJiG4AiEArEJwmhfBZy6ouB%2FveE5ofn6vL8vfsI%2FYR%2BIfhBDHBZMqpgMIhf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARACGgw4NzkzMjM2OTQ5MzUiDB%2BSqGGrjFTmVVSWbyr6AhA0nCHV13tRTSjWgnxweOAzGeiSNTvaMDUUzp8Ou2qP%2BlO6yYQqQ315l9UCkl87UQJgomJr%2Fsix72FEWBCauIg12ELVHWy%2BVoWV4Hgqw1iTTub9FC0AEAsV8UYHQlPc3ANpe5ZPqCNMGt%2B3HOzP6mWQ2fvGGFRXX74jXGUUcDig01sDUzPENFe84nzupf12sOjT7M5eQC%2Fyucw2dQrY%2FPg6urJg%2FoMPFJEMElhLvwI%2F3HZtivHhYzwfh7k6PDlFeL2OiuGxeQc%2Fk541IfyiYg63DThN0uLz%2BGeiElNjoOmumrxI6GYvhIKEZ7o0dSu2e0JDHpCWMAya0t61h%2BgBjf%2BGDGwq1yFKbL%2Fx5raV7yqU31eoNnAn4vcqNdjoH%2FLCLPH5BT3DRFENvLRR0VvTZOQ3fJc6Dzcg2nU2KAqi8w8Fqyp2KrAn33ofRYYGCjYs8nAqiSZKwwkyM9SacM%2Bk2%2BCc0bz%2FIBtf8m1ZL5UV37QjkKnWKybvSI43zDDllavIBjqdARRqvVk2OD6Slf%2BdPIYnrLa0WBDrMieonuEcTA1nW6xuCNaUnyhmhfsKOlrGvR%2FvLTo08ZghHWkKFdcQYhrhrMldKF9WEmJKbIcHi6BG4HcXGmOX8touz5yTTbhEr6ByWNi1JMDajUmH19L5Ab4V2TjeVzgeqC7Zh3pWhF8VeWxb2j%2F5hK8epwhfJnkWh9nmqAwdiSvnfMhG6jhIwfU%3D",
    "upload": {
        "status": "pending-upload",
        "statusDescription": "Subiendo archivo",
        "fileName": "Plantilla disponibilidad_1762314984064.xlsx",
        "inputFileName": "Plantilla disponibilidad",
        "url": "https://ab-availability-qa.s3.us-west-1.amazonaws.com/Plantilla disponibilidad_1762314984064.xlsx",
        "processStartDate": "2025-11-05T03:56:24.064Z",
        "userId": "65ce0f95a81da6be526f4341",
        "companyId": "65e7de4064347a92253f9a36",
        "userName": "Demo ABI",
        "userMail": "ab.demo@deltax.la",
        "pusherUuid": "4605a4be-eee4-4e80-9720-bcf24af246fc",
        "uploadStartDate": "2025-11-05T03:56:24.064Z",
        "type": "availability",
        "_id": "690acae8cddd8906a91450f4"
    }
}
```

En la respuesta llega el documento `upload` que irá siendo actualizado durante el procesamiento del archivo, así como el `preSignedUrl` que deberá ser usado para subir el archivo a S3.

Luego del llamado del endpoint de inicio de subida, se sube el archivo a S3 mediante el presigned URL. El bucket está conectado con una lambda que recibe el archivo subido para ir procesandolo. Mientras se va procesando la lambda va actualizando el upload y va mandando el valor actualizado por Pusher.


#### 3.3 Listado de subidas

Una vez subido el archivo se lleva al usuario a la tabla de subidas. Para alimentar esta tabla se utiliza el endpoint de listado de subidas:

`GET {BASE_URL}/rates/api/rates/uploads`

Query params:

- `type=availability`: Tipo. Siempre `availability` para disponibilidad.
- `search`: Búsqueda (opcional). Búsqueda por nombre de archivo.
- `page`: Página (opcional, default 0)
- `size`: Tamaño de página (opcional, default 20)


Ejemplo:

```
https://apiqa.deltaxbeta.com/rates/api/rates/uploads?type=availability&search=plan&page=0&size=5
```

Respuesta:

```
{
    "message": "Subidas recuperadas exitosamente.",
    "totalPage": 1,
    "totalDocs": 1,
    "uploads": [
        {
            "_id": "690acae8cddd8906a91450f4",
            "status": "pending-upload",
            "statusDescription": "Subiendo archivo",
            "fileName": "Plantilla disponibilidad_1762314984064.xlsx",
            "inputFileName": "Plantilla disponibilidad",
            "url": "https://ab-availability-qa.s3.us-west-1.amazonaws.com/Plantilla disponibilidad_1762314984064.xlsx",
            "processStartDate": "2025-11-05T03:56:24.064Z",
            "userId": "65ce0f95a81da6be526f4341",
            "companyId": "65e7de4064347a92253f9a36",
            "userName": "Demo ABI",
            "userMail": "ab.demo@deltax.la",
            "pusherUuid": "4605a4be-eee4-4e80-9720-bcf24af246fc",
            "uploadStartDate": "2025-11-05T03:56:24.064Z",
            "type": "availability"
        }
    ]
}
```



#### 3.4 Eliminación/Cancelación de subida

Si el usuario hace click en 'Cancelar' luego de haber subido un archivo, se debe llamar el endpoint de eliminación de subida:

`DELETE {BASE_URL}/rates/api/rates/uploads/{uploadId}?type=availability`

Ejemplo:

`DELETE https://apiqa.deltaxbeta.com/rates/api/rates/uploads/690acae8cddd8906a91450f4?type=availability` 

Esto eliminará la subida y se cancelará el proceso, de manera que no se verá la subida en la tabla ni tampoco se realizarán las modificaciones del archivo. Para esto es necesario que se haga el archivo ni bien se hace la subida, si se hace el pedido muy tarde, y el proceso ya ha comenzado, ya no es posible cancelarlo.

## 4. Dashboard

### 4.1 Endpoint de datos de Analytics

El endpoint de analytics recibe un día y filtros opcionales, calcula y devuelve:

- Datos agregados
- Opciones de filtro
- Datos de disponibilidad agrupadas por instalación 

URL: `{BASE_URL}/typeTransportUnit/api/typeTransportUnit/availabilityAnalytics`

Query params:

- `page`: Página. Opcional (default 0)
- `size`: Tamaño de página. Opcional (default 10)
- `day`: Día de consulta. Formato `AAAA-MM-DD`. Opcional (default día actual)
- `startDay`: Día inicial de rango. Formato `AAAA-MM-DD`. Opcional (default undefined)
- `endDay`: Día final de rango. Formato `AAAA-MM-DD`. Opcional (default undefined)
- `storehouseIds`: IDs de instalación. Opcional. En caso de múltiples, separar por coma. por coma.
- `transportCompanyIds`: IDs de empresas de transporte. Opcional. En caso de múltiples, separar por coma. por coma.
- `expeditionTypes`: Tipos de expedición. Opcional. En caso de múltiples, separar por coma. por coma.
- `orderBy`. Columna para el ordenamiento. Opciones fijas: `storehouseName | numAssemblies |assignedAssemblies | availableAssemblies | occupiedAssemblies | complianceRate | complianceStatus`. Opcional (default `storehouseName`)
- `orderDir`. Dirección de ordenamiento. Opciones fijas: `asc | desc`. Opcional (defaul `asc`)

**Día específico vs. rango:** Si se envía `day` se toma como rango el inicio y fin del día especificado. Si se manda `startDay` y `endDay` se ignora `day` y se toma el inicio de `startDay` y el fin de `endDay` (UTC-6) como rango de fechas para filtras las solicitudes.


Ejemplo de pedido: 

`GET https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/availabilityAnalytics?page=0&size=50&day=2025-11-05&storehouseIds=66be256ab044aa8f5dcf9fc1,66be25c4b044aa8f5dcfa2cd&transportCompanyIds=65e7de4064347a92253f9a36&expeditionTypes=XC,Z2&orderBy=complianceStatus&orderDir=desc
`

Ejemplo de respuesta:

```
{
    "message": "Datos de disponibilidad recuperados exitosamente",
    "aggregates": {
        "numAssemblies": 19,
        "assignedAssemblies": 2,
        "availableAssemblies": 1,
        "occupiedAssemblies": 3
    },
    "storehouses": [
        {
            "_id": "66be256ab044aa8f5dcf9fc1",
            "name": "ACAMBARO"
        },
        {
            "_id": "66be25c4b044aa8f5dcfa2cd",
            "name": "ACAPONETA"
        }
    ],
    "transportCompanies": [
        {
            "_id": "65e7de4064347a92253f9a36",
            "name": "ZEMOG"
        }
    ],
    "expeditionTypes": [
        {
            "_id": "XC"
        },
        {
            "_id": "Z2"
        }
    ],
    "storehouseData": [
        {
            "storehouseId": "66be256ab044aa8f5dcf9fc1",
            "storehouseName": "ACAMBARO",
            "numAssemblies": 7,
            "assignedAssemblies": 2,
            "availableAssemblies": 1,
            "occupiedAssemblies": 3,
            "maintenanceAssemblies": 1,
            "noTruckerAssemblies": 1,
            "sinisterAssemblies": 0,
            "programmedAssemblies": 1,
            "inAnotherOperationAssemblies": 0,
            "complianceRate": 0.14285714285714285,
            "compliancePercentage": 14.29,
            "complianceStatus": "critical",
            "complianceStatusName": "Crítico",
            "D2numAssemblies": 0,
            "D2availableAssemblies": 0,
            "E1numAssemblies": 0,
            "E1availableAssemblies": 0,
            "O1numAssemblies": 0,
            "O1availableAssemblies": 0,
            "O2numAssemblies": 0,
            "O2availableAssemblies": 0,
            "O3numAssemblies": 0,
            "O3availableAssemblies": 0,
            "O4numAssemblies": 0,
            "O4availableAssemblies": 0,
            "X1numAssemblies": 0,
            "X1availableAssemblies": 0,
            "X2numAssemblies": 0,
            "X2availableAssemblies": 0,
            "X6numAssemblies": 0,
            "X6availableAssemblies": 0,
            "XCnumAssemblies": 7,
            "XCavailableAssemblies": 1,
            "XFnumAssemblies": 0,
            "XFavailableAssemblies": 0,
            "XGnumAssemblies": 0,
            "XGavailableAssemblies": 0,
            "XRnumAssemblies": 0,
            "XRavailableAssemblies": 0,
            "Z1numAssemblies": 0,
            "Z1availableAssemblies": 0,
            "Z2numAssemblies": 0,
            "Z2availableAssemblies": 0,
            "Z3numAssemblies": 0,
            "Z3availableAssemblies": 0,
            "Z4numAssemblies": 0,
            "Z4availableAssemblies": 0,
            "Z6numAssemblies": 0,
            "Z6availableAssemblies": 0,
            "Z9numAssemblies": 0,
            "Z9availableAssemblies": 0,
            "ZBnumAssemblies": 0,
            "ZBavailableAssemblies": 0,
            "ZFnumAssemblies": 0,
            "ZFavailableAssemblies": 0,
            "ZGnumAssemblies": 0,
            "ZGavailableAssemblies": 0,
            "ZHnumAssemblies": 0,
            "ZHavailableAssemblies": 0
        },
        {
            "storehouseId": "66be25c4b044aa8f5dcfa2cd",
            "storehouseName": "ACAPONETA",
            "numAssemblies": 12,
            "assignedAssemblies": 0,
            "availableAssemblies": 0,
            "occupiedAssemblies": 1,
            "maintenanceAssemblies": 1,
            "noTruckerAssemblies": 0,
            "sinisterAssemblies": 0,
            "programmedAssemblies": 0,
            "inAnotherOperationAssemblies": 0,
            "complianceRate": 0,
            "compliancePercentage": 0,
            "complianceStatus": "critical",
            "complianceStatusName": "Crítico",
            "D2numAssemblies": 0,
            "D2availableAssemblies": 0,
            "E1numAssemblies": 0,
            "E1availableAssemblies": 0,
            "O1numAssemblies": 0,
            "O1availableAssemblies": 0,
            "O2numAssemblies": 0,
            "O2availableAssemblies": 0,
            "O3numAssemblies": 0,
            "O3availableAssemblies": 0,
            "O4numAssemblies": 0,
            "O4availableAssemblies": 0,
            "X1numAssemblies": 0,
            "X1availableAssemblies": 0,
            "X2numAssemblies": 0,
            "X2availableAssemblies": 0,
            "X6numAssemblies": 0,
            "X6availableAssemblies": 0,
            "XCnumAssemblies": 6,
            "XCavailableAssemblies": 0,
            "XFnumAssemblies": 0,
            "XFavailableAssemblies": 0,
            "XGnumAssemblies": 0,
            "XGavailableAssemblies": 0,
            "XRnumAssemblies": 0,
            "XRavailableAssemblies": 0,
            "Z1numAssemblies": 0,
            "Z1availableAssemblies": 0,
            "Z2numAssemblies": 6,
            "Z2availableAssemblies": 0,
            "Z3numAssemblies": 0,
            "Z3availableAssemblies": 0,
            "Z4numAssemblies": 0,
            "Z4availableAssemblies": 0,
            "Z6numAssemblies": 0,
            "Z6availableAssemblies": 0,
            "Z9numAssemblies": 0,
            "Z9availableAssemblies": 0,
            "ZBnumAssemblies": 0,
            "ZBavailableAssemblies": 0,
            "ZFnumAssemblies": 0,
            "ZFavailableAssemblies": 0,
            "ZGnumAssemblies": 0,
            "ZGavailableAssemblies": 0,
            "ZHnumAssemblies": 0,
            "ZHavailableAssemblies": 0
        }
    ],
    "transportCompanyData": [
        {
            "_id": "65e7de4064347a92253f9a36",
            "transportCompanyName": "ZEMOG",
            "numAssemblies": 19,
            "assignedAssemblies": 2,
            "availableAssemblies": 1,
            "occupiedAssemblies": 4,
            "maintenanceAssemblies": 2,
            "noTruckerAssemblies": 1,
            "sinisterAssemblies": 0,
            "programmedAssemblies": 1,
            "inAnotherOperationAssemblies": 0,
            "complianceRate": 0.25,
            "compliancePercentage": 25
        }
    ]
}
```



### 4.2 Sábana de disponibilidad

Se utiliza el mismo endpoint de listado de asignaciones con los siguientes parámetros:

- `format=xlsx`: Formato. Especifica que el formato es excel en lugar de JSON de respuesta.
- `localTimeZoneHourDiff`: Horas de diferencia con UTC. Opcional (default -6) Mandar el número directo con la diferencia de horas del navegador del usuario.

El endpoint soporta los mismos filtros y búsqueda que el listado normal.

No se envía `day` y `time` para el caso de solicitudes activas.
Si se envía `day` y `time` se muestran los históricos.
La respuesta contiene la URL de descarga del archivo de reporte generado.

Ejemplo:

`https://apiqa.deltaxbeta.com/typeTransportUnit/api/typeTransportUnit/assemblyAssignments?page=0&size=50&fleetRequirementId=690ebddf2dbc182bce8881ea&format=xlsx&localTimeZoneHourDiff=-4`

Respuesta:

```
{
    "message": "Reporte generado correctamente",
    "url": "https://qastages-filestasks-mu0fheh3byo8.s3.us-west-1.amazonaws.com/Reporte%20de%20disponibilidad%201762581882309.xlsx"
}
```



#### Mapeo de campos


Las columnas de los campos de la sábana con su correspondencia que se añade en los objetos de respuesta.
Se incluyen los mismos campos que se usan para el reporte en el caso de formato JSON.

[Mapeo de campos](https://docs.google.com/spreadsheets/d/1kNjbhoKvsefd7UAfxswFGqOeSI1TghMaDkmBcdAjPAg/edit?usp=sharing)



## 5. Solicitudes (v2)

### 5.1 Actualización de solicitudes

```
PUT {BASE_PATH}/gmodelo/api/gmodelo/updateFleetRequirement/{FLEET_REQUIREMENT_ID}
```

**Campos en body:**

- `startDate`: Fecha de inicio. Formato AAAA-MM-DD (UTC-6). Opcional
- `endDate`: Fecha de fin. Formato AAAA-MM-DD (UTC-6). Opcional
- `numAssemblies`: Ensambles requeridos. Número. Opcional

**Ejemplo:**


```
PUT https://apiqa.deltaxbeta.com/gmodelo/api/gmodelo/updateFleetRequirement/6914760f61a61eab8b269835

{
    "startDate": "2025-11-15",
    "endDate": "2025-11-19",
    "numAssemblies": 4
}
```

**Respuesta:**

```
{
    "message": "Solicitud de flota modificada exitosamente",
    "fleetRequirement": {
        "_id": "6914760f61a61eab8b269835",
        "companyId": "65ce0f94a81da6be526f433e",
        "companyName": "GMODELO",
        "storehouseId": "67bca2269e107918e87513cf",
        "storehouseName": "AJEMEX",
        "storehouseTimeZone": "UTC-6",
        "transportCompanyId": "65e7de4064347a92253f9a36",
        "transportCompanyName": "ZEMOG",
        "transportCompanyCode": "0010077402",
        "expeditionType": "Z2",
        "expeditionTypeDescription": "Full Propio",
        "operationTypeTagId": "687558077130376ce6f6f65a",
        "operationTypeTagName": "BOTE",
        "operationTypeTagColor": "#abb8c3",
        "numAssemblies": 4,
        "assignedAssemblies": 3,
        "availableAssemblies": 0,
        "occupiedAssemblies": 0,
        "maintenanceAssemblies": 0,
        "noTruckerAssemblies": 0,
        "sinisterAssemblies": 0,
        "programmedAssemblies": 0,
        "inAnotherOperationAssemblies": 0,
        "complianceRate": 0,
        "compliancePercentage": 0,
        "complianceStatus": "critical",
        "complianceStatusName": "Crítico",
        "startDay": "2025-11-15",
        "startDate": "2025-11-15T06:00:00.000Z",
        "endDay": "2025-11-19",
        "endDate": "2025-11-20T05:59:59.999Z",
        "status": "active",
        "statusName": "Vigente",
        "createdAt": "2025-11-12T11:57:01.810Z",
        "lastUpdatedAt": "2025-11-18T06:43:55.060Z",
        "enable": true,
        "lastUpdatedByUserId": "65ce0f95a81da6be526f4341"
    }
}
```
