> ## 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.

# Crear reporte programado

> Crea un nuevo reporte programado. El tipo de reporte determina la validación aplicada:
- trips_history: permite reportConfig con fuelNormRate y fuelPrice opcionales
- stops_history: sin configuración adicional
- speed_excess: requiere reportConfig.speedLimit obligatorio, minDuration opcional

**Reglas de frecuencia:**
- daily: solo executionTime. No enviar weekDays ni monthDays.
- weekly: requiere weekDays (0=domingo a 6=sábado). No enviar monthDays.
- monthly: requiere monthDays (1-31). No enviar weekDays.

**controlDays:** array de días en inglés (monday, tuesday, etc.) que indica qué días incluir en los datos del reporte.




## OpenAPI

````yaml /openapi.json post /api/scheduled-reports
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 - Vehículos
    description: Operaciones relacionadas con tipos de vehículos
  - 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 - Restricciones
    description: Operaciones relacionadas con restricciones
  - name: Integraciones - Flespi
    description: Operaciones relacionadas con Flespi
  - name: Integraciones - Vehículo
    description: Información de vehículo por patente (endpoint genérico)
  - name: Otros - Conductores
    description: Operaciones relacionadas con conductores
  - 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 - 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: Mantenimiento - Importación de Facturas
    description: Importación de facturas con extracción por IA
  - 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
paths:
  /api/scheduled-reports:
    post:
      tags:
        - Reportes - Reportes Programados
      summary: Crear reporte programado
      description: >
        Crea un nuevo reporte programado. El tipo de reporte determina la
        validación aplicada:

        - trips_history: permite reportConfig con fuelNormRate y fuelPrice
        opcionales

        - stops_history: sin configuración adicional

        - speed_excess: requiere reportConfig.speedLimit obligatorio,
        minDuration opcional


        **Reglas de frecuencia:**

        - daily: solo executionTime. No enviar weekDays ni monthDays.

        - weekly: requiere weekDays (0=domingo a 6=sábado). No enviar monthDays.

        - monthly: requiere monthDays (1-31). No enviar weekDays.


        **controlDays:** array de días en inglés (monday, tuesday, etc.) que
        indica qué días incluir en los datos del reporte.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - reportType
                - assetIds
                - frequency
                - executionTime
                - periodValue
                - periodUnit
                - controlDays
                - format
                - recipients
              properties:
                name:
                  type: string
                  description: Nombre del reporte
                reportType:
                  type: string
                  enum:
                    - trips_history
                    - stops_history
                    - speed_excess
                  description: Tipo de reporte (inmutable post-creación)
                assetIds:
                  type: array
                  items:
                    type: string
                  minItems: 1
                  description: ObjectIds de assets
                reportConfig:
                  type: object
                  description: Configuración específica según tipo de reporte
                  properties:
                    speedLimit:
                      type: number
                      description: Requerido para speed_excess
                    minDuration:
                      type: number
                      description: Opcional para speed_excess (segundos)
                    fuelNormRate:
                      type: number
                      description: Opcional para trips_history
                    fuelPrice:
                      type: number
                      description: Opcional para trips_history
                includeSummary:
                  type: boolean
                  default: false
                frequency:
                  type: string
                  enum:
                    - daily
                    - weekly
                    - monthly
                  description: >-
                    daily: solo hora. weekly: requiere weekDays, no permite
                    monthDays. monthly: requiere monthDays, no permite weekDays.
                weekDays:
                  type: array
                  items:
                    type: integer
                    minimum: 0
                    maximum: 6
                  description: >-
                    Requerido si frequency es weekly (0=domingo, 6=sábado). No
                    enviar con daily ni monthly.
                monthDays:
                  type: array
                  items:
                    type: integer
                    minimum: 1
                    maximum: 31
                  description: >-
                    Requerido si frequency es monthly. No enviar con daily ni
                    weekly.
                executionTime:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                  example: '08:30'
                  description: Hora de ejecución en formato HH:mm
                periodValue:
                  type: integer
                  minimum: 1
                periodUnit:
                  type: string
                  enum:
                    - hours
                    - days
                controlDays:
                  type: array
                  items:
                    type: string
                    enum:
                      - monday
                      - tuesday
                      - wednesday
                      - thursday
                      - friday
                      - saturday
                      - sunday
                  minItems: 1
                  description: Días cuyos datos se incluyen en el reporte
                format:
                  type: array
                  items:
                    type: string
                    enum:
                      - pdf
                      - xlsx
                  minItems: 1
                  description: Formatos de archivo a generar (pdf o xlsx).
                recipients:
                  type: array
                  items:
                    type: string
                    format: email
                  minItems: 1
                isActive:
                  type: boolean
                  default: true
      responses:
        '201':
          description: Reporte programado creado exitosamente
          content:
            application/json:
              schema:
                type: object
                properties:
                  _id:
                    type: string
                    description: ID del reporte programado
                  name:
                    type: string
                    description: Nombre del reporte
                  clientId:
                    type: object
                    properties:
                      _id:
                        type: string
                      name:
                        type: string
                  createdBy:
                    type: object
                    properties:
                      _id:
                        type: string
                      firstName:
                        type: string
                      lastName:
                        type: string
                      email:
                        type: string
                  reportType:
                    type: string
                    enum:
                      - trips_history
                      - stops_history
                      - speed_excess
                  assetIds:
                    type: array
                    items:
                      type: object
                      properties:
                        _id:
                          type: string
                        name:
                          type: string
                        plate:
                          type: string
                  reportConfig:
                    type: object
                    properties:
                      speedLimit:
                        type: number
                      minDuration:
                        type: number
                      fuelNormRate:
                        type: number
                      fuelPrice:
                        type: number
                  includeSummary:
                    type: boolean
                  frequency:
                    type: string
                    enum:
                      - daily
                      - weekly
                      - monthly
                    description: >-
                      daily: solo hora. weekly: requiere weekDays. monthly:
                      requiere monthDays.
                  weekDays:
                    type: array
                    items:
                      type: integer
                      minimum: 0
                      maximum: 6
                    description: Solo aplica si frequency es weekly (0=domingo, 6=sábado)
                  monthDays:
                    type: array
                    items:
                      type: integer
                      minimum: 1
                      maximum: 31
                    description: Solo aplica si frequency es monthly
                  executionTime:
                    type: string
                    pattern: ^([01]\d|2[0-3]):[0-5]\d$
                    example: '08:30'
                  periodValue:
                    type: integer
                  periodUnit:
                    type: string
                    enum:
                      - hours
                      - days
                  controlDays:
                    type: array
                    items:
                      type: string
                      enum:
                        - monday
                        - tuesday
                        - wednesday
                        - thursday
                        - friday
                        - saturday
                        - sunday
                    description: Días de la semana cuyos datos se incluyen en el reporte
                  format:
                    type: array
                    items:
                      type: string
                      enum:
                        - pdf
                        - xlsx
                    description: >-
                      Formatos de archivo. Si se envían múltiples, se genera un
                      ZIP.
                  recipients:
                    type: array
                    items:
                      type: string
                      format: email
                  isActive:
                    type: boolean
                  nextRunAt:
                    type: string
                    format: date-time
                  lastRunAt:
                    type: string
                    format: date-time
                  createdAt:
                    type: string
                    format: date-time
                  updatedAt:
                    type: string
                    format: date-time
        '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
      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-`.

````