> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ugps.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Asociar una orden terminada a mantenciones

> «Asociar a una mantención» (spec #3790): una OT completada o cerrada se asocia a las mantenciones que hizo, todas o ninguna. Cada una queda «Hecha» con la fecha de completado de la OT y su km (nunca la lectura de hoy). Si ninguna condición real del último servicio le queda por delante (ni más km, ni más horas, ni una fecha posterior), cierra la mantención y pasa a ser la referencia entera; un Supuesto al entrar (≈) no decide y se reemplaza con el valor de la OT. Si alguna condición real es mayor, queda solo en el historial. Se compara por la lectura de la condición y, si falta, por fecha. La fila «OT sin mantención» se borra. Responde 409 `MAINTENANCE_ASSOCIATION_WORK_ORDER_NOT_DONE` con la OT abierta, `MAINTENANCE_ASSOCIATION_ITEM_IN_OPEN_WORK_ORDER` si la mantención está en otra OT abierta y `MAINTENANCE_ASSOCIATION_ITEM_UNAVAILABLE` si ya no está pendiente; 422 `MAINTENANCE_ASSOCIATION_ODOMETER_REQUIRED` sin km para una tarea por km y `MAINTENANCE_LAST_SERVICE_ABOVE_READING` si el km pasa la lectura actual.



## OpenAPI

````yaml /openapi.json post /api/maintenance/work-orders/{id}/maintenances
openapi: 3.0.0
info:
  title: UGPS Atlas API
  version: 1.0.0
  description: >-
    Documentación de la API REST principal de UGPS Atlas (plataforma de rastreo
    GPS)
servers:
  - url: https://api.ugps.io
    description: Servidor de producción
security:
  - bearerAuth: []
  - cookieAuth: []
tags:
  - name: Auth - Autenticación
    description: Operaciones de autenticación
  - name: Usuarios - Usuarios
    description: Operaciones relacionadas con usuarios
  - name: Usuarios - Roles
    description: Operaciones relacionadas con roles
  - name: Usuarios - Permisos
    description: Operaciones relacionadas con permisos
  - name: Activos - Assets
    description: Operaciones relacionadas con activos
  - name: Activos - Tipos
    description: Operaciones relacionadas con tipos de activos
  - name: Activos - Grupos
    description: Operaciones relacionadas con grupos de activos
  - name: Activos - Campos personalizados
    description: >-
      Campos propios que cada empresa define para sus activos (nombre interno,
      tipo, reglas y opciones)
  - name: Activos - Grupos de campos
    description: Grupos que ordenan los campos personalizados de la empresa
  - name: Activos - Vehículos
    description: Operaciones relacionadas con tipos de vehículos
  - name: Activos - QR
    description: >-
      QR del activo (identidad escaneable del activo): resolver, stickers,
      reemplazo e historial
  - name: Tracking - Trackers
    description: Operaciones relacionadas con trackers
  - name: Tracking - Viajes
    description: Operaciones relacionadas con viajes y paradas
  - name: Tracking - Geocercas
    description: Operaciones relacionadas con geocercas
  - name: Alertas - Alertas
    description: Operaciones relacionadas con alertas
  - name: Alertas - Disparadores
    description: Operaciones relacionadas con disparadores de alertas
  - name: Alertas - Notificaciones
    description: Operaciones relacionadas con notificaciones
  - name: Clientes - Clientes
    description: Operaciones relacionadas con clientes
  - name: Clientes - Restricciones
    description: Operaciones relacionadas con restricciones
  - name: Integraciones - Flespi
    description: Operaciones relacionadas con Flespi
  - name: Otros - Conductores
    description: Operaciones relacionadas con conductores
  - name: Formularios dinámicos
    description: Plantillas de formulario propias de Atlas, asignables a activos
  - name: Inspecciones
    description: >-
      Inspecciones de activos enviadas desde la app al escanear el QR, con
      resultado apta / no apta
  - name: Otros - Capas
    description: Operaciones relacionadas con capas
  - name: User Tracker Access
    description: Operaciones de acceso personalizado a trackers por usuario
  - name: Reportes - Historial de Posiciones
    description: Estadísticas y detalle de posiciones GPS por activo
  - name: Reportes - Excesos de Velocidad
    description: Reportes de excesos de velocidad por tracker
  - name: Reportes - Ralentí
    description: Reportes de ralentí (motor encendido sin movimiento) por tracker
  - name: Reportes - Horas de Trabajo
    description: >-
      Reportes de horas de trabajo (conducción + paradas dentro de horario
      laboral) por tracker
  - name: Reportes - Última Actividad
    description: Reporte de estado de comunicación y última posición de activos
  - name: Reportes - Reportes Programados
    description: Gestión de reportes programados (CRUD)
  - name: Device Health
    description: Operaciones de salud de dispositivos del cliente
  - name: Activity Log
    description: Registro de actividad del cliente
  - name: Work - Importaciones
    description: Operaciones de importación de datos
  - name: Work - Plantillas
    description: Operaciones de plantillas de importación
  - name: Cargo - Transportistas
    description: Gestión de transportistas
  - name: Cargo - Pedidos
    description: Gestión de pedidos de carga
  - name: Cargo - Monitoreo
    description: Monitoreo en vivo de carga y transporte
  - name: Integraciones - Navixy
    description: Integración con plataforma Navixy
  - name: Mantenimiento - Dashboard
    description: Dashboard y métricas generales de mantenimiento
  - name: Mantenimiento - Proveedores
    description: Gestión de proveedores de servicio
  - name: Mantenimiento - Tareas
    description: Catálogo de tareas con que se arman las pautas de mantención
  - name: Mantenimiento - Pautas
    description: Pautas de mantención, con sus tareas del catálogo y su familia de activos
  - name: Mantenimiento - Estado
    description: Estado de mantenimiento de activos
  - name: Mantenimiento - Perfiles
    description: Perfiles de mantenimiento por activo
  - name: Mantenimiento - Fallas
    description: Gestión de fallas activas
  - name: Mantenimiento - DVIR
    description: Driver Vehicle Inspection Reports
  - name: Mantenimiento - Defectos
    description: Gestión de defectos detectados
  - name: Mantenimiento - Programaciones
    description: Programación de mantenimientos preventivos
  - name: Mantenimiento - Próximos
    description: Ítems de mantenimiento próximos
  - name: Mantenimiento - Órdenes de Trabajo
    description: Gestión de órdenes de trabajo
  - name: Mantenimiento - Registros de Servicio
    description: Registros históricos de servicios realizados
  - name: Mantenimiento - Problemas
    description: Gestión de problemas de mantenimiento
  - name: Mantenimiento - Tareas de Servicio
    description: Tareas específicas dentro de órdenes de trabajo
  - name: Mantenimiento - Inventario
    description: Gestión de partes, ubicaciones y stock
  - name: Mantenimiento - Costos
    description: Gestión y agregación de costos de mantenimiento
  - name: Trabajo - Tareas
    description: Gestión de tareas, tareas recurrentes, rutas y operaciones en lote
  - name: Trabajo - Empleados
    description: Gestión de empleados, departamentos y sus catálogos (tags, trackers)
  - name: Otros - Lugares
    description: Gestión de lugares (places) del cliente
  - name: Cargo - Activos
    description: Disponibilidad de activos de carga
  - name: Cargo - Ubicaciones
    description: Gestión de ubicaciones de carga
  - name: Cargo - Rendimiento
    description: Métricas de rendimiento de pedidos de carga
  - name: Reportes - Check-ins
    description: Reporte de check-ins de tareas
  - name: Reportes - Utilización
    description: Reporte de utilización de activos
  - name: Reportes - Visitas por Geocercas
    description: Reporte de visitas a geocercas
  - name: Reportes - Visitas por Trackers
    description: Reporte de visitas por tracker/activo
  - name: Reportes - Progreso de Geozonas
    description: Reporte de progreso de cobertura de geozonas (agricultura)
  - name: Reportes - Temperatura
    description: Reporte de temperatura por activo
  - name: Reportes - Exportación
    description: Exportación de reportes a archivo
  - name: Público - Business Time
    description: Reloj de servidor (endpoint público, sin autenticación)
  - name: Formularios
    description: Definiciones y envíos de formularios de la app
  - name: Sistema
    description: Endpoints de salud del servicio (liveness/readiness), sin autenticación
  - name: Facturación
    description: >-
      Portal del cliente — facturas publicadas de la empresa (proyección de
      Raúl)
  - name: Tienda de módulos
    description: >-
      Catálogo de módulos y productos UGPS con el estado de cada uno para el
      usuario
  - name: Soporte
    description: Portal del cliente — tickets de soporte de la empresa (proyección de Raúl)
  - name: Asistente
    description: Historial de conversaciones del Asistente de Atlas (spec
paths:
  /api/maintenance/work-orders/{id}/maintenances:
    post:
      tags:
        - Mantenimiento - Órdenes de Trabajo
      summary: Asociar una orden terminada a mantenciones
      description: >-
        «Asociar a una mantención» (spec #3790): una OT completada o cerrada se
        asocia a las mantenciones que hizo, todas o ninguna. Cada una queda
        «Hecha» con la fecha de completado de la OT y su km (nunca la lectura de
        hoy). Si ninguna condición real del último servicio le queda por delante
        (ni más km, ni más horas, ni una fecha posterior), cierra la mantención
        y pasa a ser la referencia entera; un Supuesto al entrar (≈) no decide y
        se reemplaza con el valor de la OT. Si alguna condición real es mayor,
        queda solo en el historial. Se compara por la lectura de la condición y,
        si falta, por fecha. La fila «OT sin mantención» se borra. Responde 409
        `MAINTENANCE_ASSOCIATION_WORK_ORDER_NOT_DONE` con la OT abierta,
        `MAINTENANCE_ASSOCIATION_ITEM_IN_OPEN_WORK_ORDER` si la mantención está
        en otra OT abierta y `MAINTENANCE_ASSOCIATION_ITEM_UNAVAILABLE` si ya no
        está pendiente; 422 `MAINTENANCE_ASSOCIATION_ODOMETER_REQUIRED` sin km
        para una tarea por km y `MAINTENANCE_LAST_SERVICE_ABOVE_READING` si el
        km pasa la lectura actual.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: ID del recurso
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - items
              properties:
                items:
                  type: array
                  minItems: 1
                  maxItems: 50
                  items:
                    type: object
                    required:
                      - itemId
                    properties:
                      itemId:
                        type: string
                        description: Id de la mantención abierta (de `candidates`).
                      odometer:
                        type: integer
                        minimum: 0
                        description: >-
                          Km del camión en la OT, para las tareas por km. Sin
                          valor se usa el odómetro diario del día de completado
                          o el km de la OT.
                      engineHours:
                        type: number
                        minimum: 0
                        description: Horas de motor en la OT, para las tareas por horas.
      responses:
        '200':
          description: Mantenciones asociadas
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    example: success
                  data:
                    type: object
                    properties:
                      workOrder:
                        type: object
                        description: La OT terminada que se asocia.
                        properties:
                          id:
                            type: string
                          workOrderNumber:
                            type: integer
                            nullable: true
                          status:
                            type: string
                            example: completed
                          completedDay:
                            type: string
                            nullable: true
                            description: >-
                              Día de completado en Chile (AAAA-MM-DD), la fecha
                              de la «Hecha».
                            example: '2026-11-02'
                          odometer:
                            type: number
                            nullable: true
                          engineHours:
                            type: number
                            nullable: true
                      assetLabel:
                        type: string
                      rows:
                        type: array
                        items:
                          type: object
                          properties:
                            itemId:
                              type: string
                            name:
                              type: string
                            programName:
                              type: string
                              nullable: true
                            outcome:
                              type: string
                              enum:
                                - moves_reference
                                - history_only
                                - done_once
                                - rejected
                              description: >-
                                `moves_reference`: cierra la mantención y la OT
                                pasa a ser su último servicio. `history_only`:
                                la OT es más vieja que el último servicio real y
                                queda solo en el historial. `done_once`: una
                                mantención de una vez queda hecha.
                            service:
                              nullable: true
                              allOf:
                                - type: object
                                  description: >-
                                    Km, horas y fecha (AAAA-MM-DD en Chile) de
                                    un servicio o de una referencia.
                                  properties:
                                    odometer:
                                      type: number
                                      nullable: true
                                    engineHours:
                                      type: number
                                      nullable: true
                                    date:
                                      type: string
                                      nullable: true
                                    assumed:
                                      type: array
                                      description: >-
                                        Las condiciones que eran un Supuesto al
                                        entrar (≈).
                                      items:
                                        type: string
                                        enum:
                                          - odometer
                                          - engineHours
                                          - date
                            previous:
                              nullable: true
                              allOf:
                                - type: object
                                  description: >-
                                    Km, horas y fecha (AAAA-MM-DD en Chile) de
                                    un servicio o de una referencia.
                                  properties:
                                    odometer:
                                      type: number
                                      nullable: true
                                    engineHours:
                                      type: number
                                      nullable: true
                                    date:
                                      type: string
                                      nullable: true
                                    assumed:
                                      type: array
                                      description: >-
                                        Las condiciones que eran un Supuesto al
                                        entrar (≈).
                                      items:
                                        type: string
                                        enum:
                                          - odometer
                                          - engineHours
                                          - date
                            review:
                              type: boolean
                              description: Se guarda marcado «Revisa el dato».
                            reason:
                              type: object
                              nullable: true
                              properties:
                                code:
                                  type: string
                                message:
                                  type: string
                            doneItemId:
                              type: string
                              nullable: true
                              description: La «Hecha» que quedó; solo al aplicar.
                      summary:
                        type: object
                        properties:
                          associated:
                            type: integer
                          rejected:
                            type: integer
        '400':
          description: Error de validación
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties:
                      error:
                        type: string
                        example: El email es requerido
                  - type: object
                    properties:
                      status:
                        type: string
                        example: failed
                      message:
                        type: string
                        example: Error de validación
                      errors:
                        type: array
                        items:
                          type: object
                          properties:
                            path:
                              type: string
                            message:
                              type: string
        '401':
          description: No autorizado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Token inválido o expirado
        '403':
          description: Sin permisos
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: No tiene permisos para realizar esta acción
        '404':
          description: Recurso no encontrado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Recurso no encontrado
        '409':
          description: Conflicto con el estado actual del recurso
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    example: failed
                  code:
                    type: string
                    example: TRACKER_SENSOR_DIN_CONFLICT
                  message:
                    type: string
                    example: >-
                      Esa entrada digital ya está asignada a otro sensor del
                      dispositivo
        '422':
          description: >-
            Falta el km o las horas de la OT, o pasan la lectura actual del
            camión.
        '500':
          description: Error interno del servidor
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties:
                      message:
                        type: string
                        example: Error interno del servidor
                  - type: object
                    properties:
                      status:
                        type: string
                        example: failed
                      message:
                        type: string
                        example: Error interno del servidor
      security:
        - bearerAuth: []
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Token de sesión Better Auth o API token (`atk_...`) en el header
        `Authorization: Bearer <token>`. Los JWT legacy ya no son válidos.
    cookieAuth:
      type: apiKey
      in: cookie
      name: better-auth.session_token
      description: >-
        Cookie de sesión Better Auth emitida al iniciar sesión en el frontend
        web. En producción el nombre lleva prefijo `__Secure-`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.