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

# Casos: negocios y tickets abiertos por fase de trabajo

> Vista Casos del staff: negocios y tickets abiertos agrupados por fase, con los pipelines de negocios y de tickets, sus etapas y el mapeo etapa → fase. Ordena (urgencia por defecto), filtra y pagina en el servidor: con `paging=columns` trae 50 por fase y `columnPages` (total real y cursor); con `paging=list`, páginas de 50 y `listPage`. Con `groupBy=stage` y un pipeline, las columnas son sus etapas (sin regla de entrada), con el riel de cerrados por etapa final y, en negocios, el ponderado por columna. Sin `paging` devuelve la hoja completa, hasta 1000 casos por tipo como antes.



## OpenAPI

````yaml /generated/specs/sales.json get /api/v1/cases/board
openapi: 3.0.0
info:
  title: Raul API - Ventas
  description: >-
    Cotizaciones, pipeline, outreach comercial, equipos cotizables y ventas de
    equipamiento.
  version: 2.0.0
  contact: {}
servers:
  - url: https://api.raul.ugps.io
    description: Production
security: []
tags: []
paths:
  /api/v1/cases/board:
    get:
      tags:
        - cases
      summary: 'Casos: negocios y tickets abiertos por fase de trabajo'
      description: >-
        Vista Casos del staff: negocios y tickets abiertos agrupados por fase,
        con los pipelines de negocios y de tickets, sus etapas y el mapeo etapa
        → fase. Ordena (urgencia por defecto), filtra y pagina en el servidor:
        con `paging=columns` trae 50 por fase y `columnPages` (total real y
        cursor); con `paging=list`, páginas de 50 y `listPage`. Con
        `groupBy=stage` y un pipeline, las columnas son sus etapas (sin regla de
        entrada), con el riel de cerrados por etapa final y, en negocios, el
        ponderado por columna. Sin `paging` devuelve la hoja completa, hasta
        1000 casos por tipo como antes.
      operationId: CaseBoardController_board
      parameters:
        - name: pipelineId
          required: false
          in: query
          description: Sólo los casos de ese pipeline (de negocios o de tickets)
          schema:
            type: string
            format: uuid
        - name: search
          required: false
          in: query
          description: Texto en el título, la empresa o el contacto (1 a 100 caracteres)
          schema:
            type: string
        - name: closedSince
          required: false
          in: query
          description: >-
            Vista Lista: suma los cerrados desde esa fecha (ISO con zona; no
            futura y hasta 366 días atrás)
          schema:
            type: string
            format: date-time
        - name: closedOnly
          required: false
          in: query
          description: 'Con closedSince: sólo los cerrados desde esa fecha'
          schema:
            enum:
              - 'true'
              - 'false'
            type: string
        - name: includeHidden
          required: false
          in: query
          description: >-
            Incluye los casos ocultos por la regla de entrada, marcados con
            `hiddenBy`
          schema:
            enum:
              - 'true'
              - 'false'
            type: string
        - name: sort
          required: false
          in: query
          description: >-
            Urgencia (por defecto: rojo, naranjo y el resto; a igual color, el
            que espera hace más tiempo; sin alerta, prioridad y antigüedad), más
            recientes o última actividad
          schema:
            enum:
              - urgency
              - recent
              - activity
            type: string
        - name: groupBy
          required: false
          in: query
          description: >-
            Columnas del Tablero: por fase de trabajo (por defecto) o por etapa
            del pipeline elegido (`stage` requiere `pipelineId`). Por etapa hay
            una columna por etapa, sin regla de entrada; `column` es el id de la
            etapa y las finales traen sus cerrados de la semana en
            `closedRecently.byStage`
          schema:
            enum:
              - phase
              - stage
            type: string
        - name: kind
          required: false
          in: query
          description: Tipo de caso; `product` es el pipeline de tickets Producto
          schema:
            enum:
              - opportunity
              - ticket
              - product
            type: string
        - name: ownerIds
          required: false
          in: query
          description: Responsables separados por coma (hasta 50); `none` = sin responsable
          schema:
            type: string
        - name: priorities
          required: false
          in: query
          description: Prioridades 1 a 4 separadas por coma
          schema:
            type: string
        - name: stale
          required: false
          in: query
          description: Sólo los casos sin movimiento hace más de 30 días
          schema:
            enum:
              - 'true'
              - 'false'
            type: string
        - name: tagIds
          required: false
          in: query
          description: 'Etiquetas separadas por coma (hasta 20): alguna de ellas'
          schema:
            type: string
        - name: clientId
          required: false
          in: query
          description: Empresa del caso
          schema:
            type: string
            format: uuid
        - name: origin
          required: false
          in: query
          description: Origen del ticket; deja fuera los negocios
          schema:
            enum:
              - client
              - internal
            type: string
        - name: ticketType
          required: false
          in: query
          description: Tipo de ticket; deja fuera los negocios
          schema:
            enum:
              - problem
              - service_request
            type: string
        - name: ticketCategoryId
          required: false
          in: query
          description: Categoría del ticket; deja fuera los negocios
          schema:
            type: number
        - name: updatedFrom
          required: false
          in: query
          description: Actualizado desde ese día (hora de Chile, inclusivo)
          schema:
            format: date
            type: string
        - name: updatedTo
          required: false
          in: query
          description: Actualizado hasta ese día (hora de Chile, inclusivo)
          schema:
            format: date
            type: string
        - name: paging
          required: false
          in: query
          description: >-
            `columns`: 50 casos por fase con `columnPages`; `list`: páginas de
            50 con `listPage`. Sin él, la hoja completa (hasta 1000 casos por
            tipo, el contrato anterior)
          schema:
            enum:
              - columns
              - list
            type: string
        - name: column
          required: false
          in: query
          description: 'Con paging=columns: sólo esa fase («Cargar más»)'
          schema:
            type: string
        - name: cursor
          required: false
          in: query
          description: >-
            Con paging=columns y column: `nextCursor` de la página anterior de
            la fase, del mismo orden
          schema:
            type: string
        - name: page
          required: false
          in: query
          description: 'Con paging=list: página desde 0'
          schema:
            type: number
        - name: sortField
          required: false
          in: query
          description: >-
            Con paging=list: columna de la Tabla que reemplaza el orden; lo
            cerrado sigue al final
          schema:
            enum:
              - type
              - title
              - client
              - stage
              - owner
              - priority
              - alert
              - lastActivity
              - created
            type: string
        - name: sortDirection
          required: false
          in: query
          description: Con sortField; por defecto asc
          schema:
            enum:
              - asc
              - desc
            type: string
      responses:
        '200':
          description: Fases, pipelines y casos
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CaseBoardResponseDto'
        '400':
          description: Filtros, cursor o paginación inválidos (case_board_filters_invalid)
        '403':
          description: >-
            Usuario con empresa (case_board_staff_only), sin ventas ni tickets
            (case_board_modules_blocked) o llamada delegada de alguien que no es
            staff UGPS verificado
components:
  schemas:
    CaseBoardResponseDto:
      type: object
      properties:
        columns:
          type: array
          items:
            $ref: '#/components/schemas/CaseBoardColumnDto'
        pipelines:
          type: array
          items:
            $ref: '#/components/schemas/CaseBoardPipelineViewDto'
        items:
          type: array
          items:
            $ref: '#/components/schemas/CaseItemDto'
        hidden:
          $ref: '#/components/schemas/CaseBoardHiddenDto'
        closedRecently:
          description: Cerrados en los últimos 7 días con los mismos filtros
          allOf:
            - $ref: '#/components/schemas/CaseBoardClosedRecentlyDto'
        sort:
          type: string
          enum:
            - urgency
            - recent
            - activity
          description: Orden aplicado
        groupBy:
          type: string
          enum:
            - phase
            - stage
          description: >-
            Columnas aplicadas: por fase o por etapa (entonces `columns` son las
            etapas del pipeline y `columnId` de cada caso es su etapa)
        columnPages:
          description: 'Con paging=columns: una entrada por fase pedida'
          type: array
          items:
            $ref: '#/components/schemas/CaseBoardColumnPageDto'
        listPage:
          description: Con paging=list
          allOf:
            - $ref: '#/components/schemas/CaseBoardListPageDto'
        indicators:
          description: >-
            Totales de lo abierto y visible, sin los filtros de tipo,
            responsable, prioridad y movimiento; no viene al pedir una sola fase
          allOf:
            - $ref: '#/components/schemas/CaseBoardIndicatorsDto'
        owners:
          description: Responsables presentes en la hoja; no viene al pedir una sola fase
          type: array
          items:
            $ref: '#/components/schemas/CaseRefDto'
        dueAlerts:
          $ref: '#/components/schemas/CaseDueAlertsDto'
        replyAlert:
          $ref: '#/components/schemas/CaseReplyAlertDto'
        waitingStages:
          $ref: '#/components/schemas/CaseWaitingStagesDto'
        mentionAlert:
          $ref: '#/components/schemas/CaseMentionAlertDto'
      required:
        - columns
        - pipelines
        - items
        - hidden
        - sort
        - groupBy
        - dueAlerts
        - replyAlert
        - waitingStages
        - mentionAlert
    CaseBoardColumnDto:
      type: object
      properties:
        id:
          type: string
          example: pending
        name:
          type: string
          example: Pendiente
        color:
          type: string
          example: '#F59E0B'
        order:
          type: number
        isFinal:
          type: boolean
          description: 'Fase de cerrados: sólo la usa la vista Lista'
      required:
        - id
        - name
        - color
        - order
        - isFinal
    CaseBoardPipelineViewDto:
      type: object
      properties:
        kind:
          type: string
          enum:
            - opportunity
            - ticket
        id:
          type: string
          format: uuid
        name:
          type: string
        isDefault:
          type: boolean
        stages:
          type: array
          items:
            $ref: '#/components/schemas/CaseStageDto'
        columnByStage:
          type: object
          additionalProperties:
            type: string
          description: Fase de cada etapa (id de etapa → id de fase) con el mapeo vigente
        entryRule:
          nullable: true
          type: object
          allOf:
            - $ref: '#/components/schemas/CaseEntryRuleDto'
      required:
        - kind
        - id
        - name
        - isDefault
        - stages
        - columnByStage
        - entryRule
    CaseItemDto:
      type: object
      properties:
        kind:
          type: string
          enum:
            - opportunity
            - ticket
        id:
          type: string
          format: uuid
        title:
          type: string
        client:
          nullable: true
          type: object
          allOf:
            - $ref: '#/components/schemas/CaseClientDto'
        clientName:
          type: string
          nullable: true
        contact:
          nullable: true
          type: object
          allOf:
            - $ref: '#/components/schemas/CaseContactDto'
        contactName:
          type: string
          nullable: true
        owner:
          nullable: true
          type: object
          allOf:
            - $ref: '#/components/schemas/CaseRefDto'
        scope:
          type: string
          enum:
            - client
            - internal
          nullable: true
        tags:
          type: array
          items:
            $ref: '#/components/schemas/CaseTagDto'
        pipeline:
          $ref: '#/components/schemas/CaseRefDto'
        stage:
          $ref: '#/components/schemas/CaseStageDto'
        columnId:
          type: string
        priority:
          type: number
          enum:
            - 1
            - 2
            - 3
            - 4
          nullable: true
        scheduledResumeAt:
          type: string
          format: date-time
          nullable: true
          description: 'Negocio: reactivación programada (Waiting)'
        nextDue:
          nullable: true
          type: object
          allOf:
            - $ref: '#/components/schemas/CaseDueDto'
        monthlyAmount:
          nullable: true
          description: >-
            Negocio: monto mensual (el manual en UF o el total mensual de su
            última cotización); tickets: `null`
          type: object
          allOf:
            - $ref: '#/components/schemas/CaseMoneyDto'
        awaitingReply:
          nullable: true
          description: Cliente esperando respuesta
          type: object
          allOf:
            - $ref: '#/components/schemas/CaseAwaitingReplyDto'
        lastActivityAt:
          type: string
          format: date-time
          description: Último evento de cualquier fuente del caso, o su creación
        stageEnteredAt:
          type: string
          format: date-time
          nullable: true
          description: 'Ticket: entrada a su etapa actual'
        pendingMention:
          nullable: true
          description: 'Ticket: la mención sin respuesta más antigua'
          type: object
          allOf:
            - $ref: '#/components/schemas/CasePendingMentionDto'
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        hiddenBy:
          type: string
          enum:
            - entryRule
          nullable: true
          description: Oculto por la regla de entrada (sólo con includeHidden=true)
        alert:
          description: Alerta del caso en horas hábiles, a la hora de la respuesta
          allOf:
            - $ref: '#/components/schemas/CaseItemAlertDto'
      required:
        - kind
        - id
        - title
        - client
        - clientName
        - contact
        - contactName
        - owner
        - scope
        - tags
        - pipeline
        - stage
        - columnId
        - priority
        - scheduledResumeAt
        - nextDue
        - monthlyAmount
        - awaitingReply
        - lastActivityAt
        - stageEnteredAt
        - pendingMention
        - createdAt
        - updatedAt
        - hiddenBy
        - alert
    CaseBoardHiddenDto:
      type: object
      properties:
        total:
          type: number
        byPipeline:
          type: object
          additionalProperties:
            type: number
          description: Ocultos por id de pipeline
      required:
        - total
        - byPipeline
    CaseBoardClosedRecentlyDto:
      type: object
      properties:
        since:
          type: string
          format: date-time
        total:
          type: number
        byStage:
          type: object
          additionalProperties:
            type: number
          description: >-
            Con groupBy=stage: cerrados de la semana por id de etapa (riel de
            cada etapa final)
      required:
        - since
        - total
    CaseBoardColumnPageDto:
      type: object
      properties:
        columnId:
          type: string
        total:
          type: number
          description: Casos de la fase con los filtros, no sólo los cargados
        byStage:
          type: object
          additionalProperties:
            type: number
          description: Casos de la fase por `${pipelineId}:${stageId}`
        nextCursor:
          type: string
          nullable: true
          description: Cursor de la página siguiente de la fase; `null` si no hay más
        weighted:
          type: object
          additionalProperties:
            type: number
          description: >-
            Con groupBy=stage en un pipeline de negocios: monto mensual
            ponderado por la probabilidad de la etapa de todos los casos de la
            columna, por moneda
      required:
        - columnId
        - total
        - byStage
        - nextCursor
    CaseBoardListPageDto:
      type: object
      properties:
        page:
          type: number
          description: Página desde 0
        pageSize:
          type: number
          example: 50
        total:
          type: number
      required:
        - page
        - pageSize
        - total
    CaseBoardIndicatorsDto:
      type: object
      properties:
        opportunities:
          type: number
        tickets:
          type: number
        product:
          type: number
          description: Tickets del pipeline Producto
        unassigned:
          type: number
        stale:
          type: number
          description: Sin movimiento hace más de 30 días
      required:
        - opportunities
        - tickets
        - product
        - unassigned
        - stale
    CaseRefDto:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
      required:
        - id
        - name
    CaseDueAlertsDto:
      type: object
      properties:
        blinkSeconds:
          type: number
          description: >-
            Segundos de parpadeo de una tarjeta en alerta hasta que alguien
            actúe; la UI guarda 8 (encendido) o 0 (sólo color)
        default:
          $ref: '#/components/schemas/CaseDueAlertRuleDto'
        byType:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/CaseDueAlertRuleDto'
          description: >-
            Umbral por id de tipo de actividad de la tarea; la clave heredada
            `nextAction` se acepta pero ya no se aplica
      required:
        - blinkSeconds
        - default
        - byType
    CaseReplyAlertDto:
      type: object
      properties:
        warnHours:
          type: number
          description: Horas desde el mensaje del cliente para naranjo
        criticalHours:
          type: number
          description: Horas desde el mensaje del cliente para rojo
        windowDays:
          type: number
          nullable: true
          description: Días de mensajes que cuentan; `null` = sin límite
      required:
        - warnHours
        - criticalHours
        - windowDays
    CaseWaitingStagesDto:
      type: object
      properties:
        stageKeys:
          description: 'Etapas de espera de tickets: `ticket:<pipelineId>:<stageId>`'
          type: array
          items:
            type: string
        warnHours:
          type: number
          description: Horas hábiles en la etapa para naranjo
        criticalHours:
          type: number
          description: Horas hábiles en la etapa para rojo
      required:
        - stageKeys
        - warnHours
        - criticalHours
    CaseMentionAlertDto:
      type: object
      properties:
        warnHours:
          type: number
          description: Horas hábiles desde la mención para naranjo
        criticalHours:
          type: number
          description: Horas hábiles desde la mención para rojo
      required:
        - warnHours
        - criticalHours
    CaseStageDto:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        color:
          type: string
        order:
          type: number
        isFinal:
          type: boolean
        isWon:
          type: boolean
        isLost:
          type: boolean
        probability:
          type: number
          nullable: true
          description: >-
            Probabilidad de cierre de una etapa de negocios (0 a 1; ganada 1,
            perdida 0); `null` en tickets o sin configurar
      required:
        - id
        - name
        - color
        - order
        - isFinal
        - isWon
        - isLost
        - probability
    CaseEntryRuleDto:
      type: object
      properties:
        type:
          type: string
          enum:
            - minStageOrder
            - scheduledResume
          description: >-
            Sin `type` = `minStageOrder`. `scheduledResume` (sólo negocios)
            oculta el negocio hasta su reactivación programada
        minStageOrder:
          type: number
          description: Orden mínimo de etapa para entrar a Casos (`minStageOrder`)
    CaseClientDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        hasLogo:
          type: boolean
        logoUrl:
          type: string
          nullable: true
          description: URL firmada del logo; `null` en una llamada delegada (MCP)
      required:
        - id
        - name
        - hasLogo
        - logoUrl
    CaseContactDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        hasPhoto:
          type: boolean
      required:
        - id
        - name
        - hasPhoto
    CaseTagDto:
      type: object
      properties:
        id:
          type: number
        name:
          type: string
        color:
          type: string
      required:
        - id
        - name
        - color
    CaseDueDto:
      type: object
      properties:
        at:
          type: string
          format: date-time
        createdAt:
          type: string
          format: date-time
          description: >-
            Creación de la tarea: mientras no vence, silencia las alertas que
            empezaron antes
        source:
          type: string
          enum:
            - task
        typeId:
          type: number
          nullable: true
        typeName:
          type: string
      required:
        - at
        - createdAt
        - source
        - typeId
        - typeName
    CaseMoneyDto:
      type: object
      properties:
        amount:
          type: number
          example: 12.5
        currency:
          type: string
          example: UF
      required:
        - amount
        - currency
    CaseAwaitingReplyDto:
      type: object
      properties:
        since:
          type: string
          format: date-time
        channel:
          type: string
          example: WhatsApp
        firstReply:
          type: boolean
          description: >-
            El staff nunca respondió el caso: cuenta desde su creación y no
            caduca
        origin:
          nullable: true
          type: object
          allOf:
            - $ref: '#/components/schemas/CaseActivityOriginDto'
      required:
        - since
        - channel
        - firstReply
        - origin
    CasePendingMentionDto:
      type: object
      properties:
        since:
          type: string
          format: date-time
        userId:
          type: string
          format: uuid
        userName:
          type: string
      required:
        - since
        - userId
        - userName
    CaseItemAlertDto:
      type: object
      properties:
        level:
          type: string
          enum:
            - none
            - warning
            - critical
        reason:
          type: string
          enum:
            - reply
            - mention
            - waiting
            - due
            - minutes
          nullable: true
          description: >-
            Respuesta pendiente, mención sin respuesta, etapa de espera o
            vencimiento
        since:
          type: string
          format: date-time
          nullable: true
          description: Inicio de la espera o instante del vencimiento
      required:
        - level
        - reason
        - since
    CaseDueAlertRuleDto:
      type: object
      properties:
        warnHours:
          type: number
          description: Horas antes del vencimiento para naranjo
        criticalHours:
          type: number
          description: Horas antes del vencimiento para rojo; 0 = al vencer
      required:
        - warnHours
        - criticalHours
    CaseActivityOriginDto:
      type: object
      properties:
        kind:
          type: string
          enum:
            - ticket
            - visit
            - thread
            - opportunity
        id:
          type: string
          description: >-
            Identificador del registro; en una conversación, el id del hilo en
            la Bandeja
        label:
          type: string
          description: 'Etiqueta legible: «Visita del 3-oct», «WhatsApp», título'
        channel:
          type: string
          enum:
            - email
            - whatsapp
          description: Canal de la conversación (sólo kind = thread)
      required:
        - kind
        - id
        - label

````

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