openapi: 3.1.0
info:
  title: Comunidesk Developer Gateway
  version: 1.0.0
  description: API del gateway Comunidesk. Autenticación OAuth2 de la app más JWT de la cuenta del usuario.
servers:
  - url: "https://gateway.comunidesk.com"
    description: Gateway producción
tags:
  - name: auth
    description: OAuth2 de tu aplicación
  - name: me
    description: Capacidades del usuario autenticado
  - name: ai
    description: "IA del gateway (chat, extract y proxy /api/ai/*)"
  - name: flex-pro
    description: "Flex Pro runtime y marketplace (proxy /api/flex-pro/*)"
  - name: edificios
    description: Edificios — Catálogo de edificios y configuración de cobro.
  - name: departamentos
    description: "Departamentos / Unidades — Unidades del edificio: departamento, bodega o estacionamiento."
  - name: egresos
    description: Egresos — Egresos y cuentas por pagar de la comunidad.
  - name: gastos-comunes
    description: Gastos comunes — Periodos de gasto común y prorrateo por unidad.
  - name: pagos
    description: Pagos (gasto común) — Pagos de gasto común por departamento.
  - name: ingresos
    description: Ingresos (finanzas) — Ingresos del módulo Finanzas del edificio.
  - name: empleados
    description: Empleados — Personal del edificio.
  - name: proveedores
    description: Proveedores — Proveedores y contactos del edificio.
  - name: consumos
    description: "Consumos — Lecturas de luz, agua y gas por periodo."
  - name: mantenciones
    description: Mantenciones — Solicitudes y tickets de mantención.
  - name: multas
    description: Multas — Multas aplicadas por departamento.
  - name: visitas
    description: Visitas / Encomiendas — Registro de visitas y encomiendas.
  - name: areas-comunes
    description: Áreas comunes — Áreas comunes reservables del edificio.
  - name: reservas
    description: Reservas — Reservas de áreas comunes.
  - name: reglamentos
    description: Reglamentos — Reglamentos internos de la comunidad.
  - name: documentos-legales
    description: Documentos legales — Documentos legales del edificio.
  - name: diario-mural
    description: Diario mural — Anuncios del diario mural.
  - name: comunicaciones
    description: Comunicaciones — Comunicaciones enviadas a residentes.
  - name: tickets
    description: Tickets — Tickets de soporte y atención.
  - name: votaciones
    description: Votaciones — Votaciones y asambleas de la comunidad.
  - name: convenios
    description: Convenios de pago — Convenios de pago por deuda.
  - name: cotizaciones
    description: Cotizaciones — Cotizaciones de proveedores.
  - name: grupos-unidades
    description: Grupos de unidades — Grupos de unidades para prorrateo o cobro.
  - name: inventario
    description: Inventario — Inventario de bienes del edificio.
  - name: aprobaciones
    description: Aprobaciones — Solicitudes de aprobación internas.
  - name: seguros
    description: Seguros — Seguros por departamento.
  - name: siniestros
    description: Siniestros — Siniestros y reclamos de seguros.
  - name: plan-emergencia
    description: Plan de emergencia — Planes de emergencia del edificio.
  - name: procedimientos
    description: Procedimientos — Procedimientos internos operativos.
  - name: pagos-tesoreria
    description: Pagos (finanzas) — Pagos del módulo Finanzas del edificio.
  - name: fondos-reserva
    description: Fondos de reserva — Fondos de reserva de la comunidad.
  - name: configuracion-edificio
    description: "Configuración del edificio — Parámetros de cobro, mora, notificaciones, firma y reglas del edificio."
  - name: tipos-multa
    description: Tipos de multa — Catálogo de tipos de multa configurables por edificio.
  - name: finanzas-config
    description: Configuración finanzas — Categorías y subcategorías de egresos e ingresos del módulo Finanzas.
  - name: gastos-departamento
    description: Gastos por unidad — Prorrateo de gasto común por departamento/unidad.
  - name: asignaciones-usuario
    description: Asignaciones de usuario — Vincula un usuario a un edificio/unidad con un rol.
  - name: asignaciones-rol
    description: "Asignaciones de rol — RBAC por edificio: rol, permisos extra y exclusiones."
  - name: grupos-permisos
    description: Grupos de permisos — Grupos custom de permisos reutilizables por edificio.
  - name: permisos-usuario
    description: Permisos adicionales — Permisos extra otorgados a un usuario en un edificio.
  - name: turnos-planificacion
    description: "Turnos y planificación — Turnos de personal: fecha, horario y empleados asignados."
  - name: tareas
    description: "Tareas — Tareas de planificación operativas, opcionales a un turno."
  - name: comite-miembros
    description: Miembros del comité — Integrantes del comité de administración del edificio.
  - name: comite-reuniones
    description: Reuniones de comité — Reuniones programadas del comité con orden del día.
  - name: comite-actas
    description: Actas de comité — Actas formales asociadas a reuniones de comité.
  - name: plusvalia-config
    description: Plusvalía (config) — Factores y orientación para el índice de plusvalía del edificio.
  - name: plusvalia-snapshots
    description: Plusvalía (histórico) — Snapshots periódicos del índice de plusvalía.
  - name: transparencia
    description: "Transparencia — Portal de transparencia comunitaria (lectura agregada de finanzas, comité y seguros)."
  - name: reportes
    description: "Reportes — Reportes financieros, de morosidad, mantenciones y ocupación."
  - name: reservas-estacionamiento-visita
    description: Estacionamientos de visitas — Reservas de estacionamiento para visitas.
  - name: actividad
    description: Registro de actividad — Auditoría de acciones de usuarios en el edificio.
  - name: monitoreo-equipos
    description: Monitoreo de equipos — Configuración del agente de monitoreo en equipos del personal.
  - name: cotizaciones-seguro
    description: Cotización de seguros — Cotizaciones rápidas de seguros del edificio (distinto de cotizaciones a proveedores).
  - name: registros-horas
    description: Registro de horas — Horas trabajadas por empleado y periodo.
  - name: pagos-empleados
    description: Pagos a empleados — Liquidaciones y pagos de personal.
  - name: mantenciones-periodicas
    description: Mantenciones periódicas — Planes de mantención recurrentes del edificio.
  - name: procedimientos-ejecucion
    description: Ejecuciones de procedimiento — Instancias de ejecución de procedimientos internos.
  - name: invitaciones
    description: Invitaciones — Invitaciones pendientes a usuarios del edificio.
  - name: centro-datos
    description: Centro de datos — Cargas e importaciones masivas de datos históricos del edificio.
  - name: finanzas
    description: "Finanzas — Vista agregada del módulo Finanzas (egresos, ingresos y tesorería)."
  - name: mensajes
    description: Mensajes — Chat entre residentes y administración (hilos y mensajes del edificio).
  - name: reporte-anual
    description: "Reporte anual de gestión — Reporte anual con checklist, slides, comentarios y exportación PPTX."
  - name: gestion-transversal-personal
    description: Gestión transversal — Banco de reservas — Personal de reserva compartido entre edificios (comunidesk_transversal).
  - name: gestion-transversal-equipo
    description: Gestión transversal — Equipo de soporte — Miembros del equipo de soporte transversal con permisos por rol.
  - name: gestion-transversal-asignaciones
    description: Gestión transversal — Asignaciones — Asignaciones de personal titular y reemplazo entre edificios.
  - name: egresos-exclusiones-gc
    description: Exclusiones de egreso en gasto común — Postergación de cobro de egresos/cuotas en el gasto común mensual.
  - name: conciliaciones-bancarias
    description: "Conciliaciones bancarias — Conciliación de movimientos bancarios con gastos comunes, egresos e ingresos."
  - name: movimientos-bancarios
    description: Movimientos bancarios — Movimientos importados de cartola bancaria y su estado de conciliación.
  - name: cargas-cartola
    description: Cargas de cartola — Historial de importaciones de cartola bancaria.
paths:
  /v1/me/capabilities:
    get:
      tags:
        - me
      operationId: getCapabilities
      summary: Módulos disponibles tras el login
      description: Lista los módulos y endpoints que el usuario puede usar. Ideal para armar el menú en apps iOS/Android.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          schema:
            type: string
          description: Filtrar al contexto de un edificio
      responses:
        200:
          description: Capacidades
          content:
            application/json:
              schema:
                type: object
                properties:
                  user:
                    type: object
                  edificios:
                    type: array
                    items:
                      type: object
                  modules:
                    type: array
                    items:
                      type: object
                  groups:
                    type: array
                    items:
                      type: object
                  protocols:
                    type: object
                  webParity:
                    type: object
                    description: "Mapa de paridad web ↔ gateway: módulos REST, rutas IA y Flex Pro."
  /oauth/token:
    post:
      tags:
        - auth
      operationId: oauthToken
      summary: Obtener access token OAuth2
      security: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              required:
                - grant_type
              properties:
                grant_type:
                  type: string
                  enum:
                    - client_credentials
                    - authorization_code
                    - refresh_token
                scope:
                  type: string
                code:
                  type: string
                redirect_uri:
                  type: string
                refresh_token:
                  type: string
      responses:
        200:
          description: Token
          content:
            application/json:
              schema:
                type: object
                properties:
                  access_token:
                    type: string
                  token_type:
                    type: string
                  expires_in:
                    type: integer
                  scope:
                    type: string
  /v1/ai/models:
    get:
      tags:
        - ai
      operationId: ai__v1_ai_models_GET
      summary: /api/ai/models
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:models"
  /v1/ai/chat:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_chat_POST
      summary: /api/ai/chat
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:chat"
  /v1/ai/extract/egresos:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_extract_egresos_POST
      summary: /api/ai/egresos/extract
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:extract"
  /v1/ai/extract/cartola:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_extract_cartola_POST
      summary: /api/ai/cartola/extract
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:extract"
  /v1/ai/extract/consumos:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_extract_consumos_POST
      summary: /api/ai/consumos/extract
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:extract"
  /v1/ai/extract/empleados:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_extract_empleados_POST
      summary: /api/ai/empleados/extract
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:extract"
  /v1/ai/extract/procedimientos:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_extract_procedimientos_POST
      summary: /api/ai/procedimientos/extract
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:extract"
  /v1/ai/building-facts:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_building_facts_POST
      summary: /api/ai/building-facts
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/assist:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_assist_POST
      summary: /api/ai/assist
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/ops-assistant:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_ops_assistant_POST
      summary: /api/ai/ops-assistant
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/community-knowledge:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_community_knowledge_POST
      summary: /api/ai/community-knowledge
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/centro-datos/map:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_centro_datos_map_POST
      summary: /api/ai/centro-datos/map
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/egresos/map-modulos:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_egresos_map_modulos_POST
      summary: /api/ai/egresos/map-modulos
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/flex-pro/generate:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_flex_pro_generate_POST
      summary: /api/ai/flex-pro/generate
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/voice:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_voice_POST
      summary: /api/ai/voice
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/voice/transcribe:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_voice_transcribe_POST
      summary: /api/ai/voice/transcribe
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/edificio-onboarding/jobs:
    get:
      tags:
        - ai
      operationId: ai__v1_ai_edificio_onboarding_jobs_GET
      summary: /api/ai/edificio-onboarding/jobs
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
    post:
      tags:
        - ai
      operationId: ai__v1_ai_edificio_onboarding_jobs_POST
      summary: /api/ai/edificio-onboarding/jobs
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/edificio-onboarding/jobs/{jobId}:
    get:
      tags:
        - ai
      operationId: ai__v1_ai_edificio_onboarding_jobs_jobId__GET
      summary: "/api/ai/edificio-onboarding/jobs/{jobId}"
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
    patch:
      tags:
        - ai
      operationId: ai__v1_ai_edificio_onboarding_jobs_jobId__PATCH
      summary: "/api/ai/edificio-onboarding/jobs/{jobId}"
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/edificio-onboarding/jobs/{jobId}/upload:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_edificio_onboarding_jobs_jobId_upload_POST
      summary: "/api/ai/edificio-onboarding/jobs/{jobId}/upload"
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/ai/reporte-anual/presentacion:
    post:
      tags:
        - ai
      operationId: ai__v1_ai_reporte_anual_presentacion_POST
      summary: /api/ai/reporte-anual/presentacion
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: ai:web"
  /v1/flex-pro/modules:
    get:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_modules_GET
      summary: /api/flex-pro/modules
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:manage"
    put:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_modules_PUT
      summary: /api/flex-pro/modules
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:manage"
    delete:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_modules_DELETE
      summary: /api/flex-pro/modules
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:manage"
  /v1/flex-pro/sources:
    get:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_sources_GET
      summary: /api/flex-pro/sources
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:manage"
    post:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_sources_POST
      summary: /api/flex-pro/sources
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:manage"
  /v1/flex-pro/versions:
    get:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_versions_GET
      summary: /api/flex-pro/versions
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:manage"
    post:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_versions_POST
      summary: /api/flex-pro/versions
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:manage"
  /v1/flex-pro/runtime/active:
    get:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_runtime_active_GET
      summary: /api/flex-pro/runtime/active
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:runtime"
  /v1/flex-pro/runtime/bundle:
    get:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_runtime_bundle_GET
      summary: /api/flex-pro/runtime/bundle
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:runtime"
  /v1/flex-pro/edificio/install:
    post:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_edificio_install_POST
      summary: /api/flex-pro/edificio/install
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:manage"
  /v1/flex-pro/marketplace/publish:
    post:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_marketplace_publish_POST
      summary: /api/flex-pro/marketplace/publish
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:marketplace"
  /v1/flex-pro/marketplace/install:
    post:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_marketplace_install_POST
      summary: /api/flex-pro/marketplace/install
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:marketplace"
  /v1/flex-pro/marketplace/installs:
    get:
      tags:
        - flex-pro
      operationId: flex-pro__v1_flex_pro_marketplace_installs_GET
      summary: /api/flex-pro/marketplace/installs
      security:
        - OAuth2App: []
          ComunideskUser: []
      responses:
        200:
          description: OK
        401:
          description: Token inválido
        403:
          description: "Scope requerido: flex-pro:marketplace"
  /v1/rest/Edificios:
    get:
      tags:
        - edificios
      operationId: listEdificio
      summary: Listar Edificios
      description: Catálogo de edificios y configuración de cobro.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Edificio"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - edificios
      operationId: createEdificio
      summary: Crear Edificios
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Edificio"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Edificio"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Edificios/{id}:
    get:
      tags:
        - edificios
      operationId: getEdificio
      summary: Obtener Edificios
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Edificio"
        404:
          description: No encontrado
    patch:
      tags:
        - edificios
      operationId: updateEdificio
      summary: Actualizar Edificios
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Edificio"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - edificios
      operationId: deleteEdificio
      summary: Eliminar Edificios
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Departamentos:
    get:
      tags:
        - departamentos
      operationId: listDepartamento
      summary: Listar Departamentos / Unidades
      description: "Unidades del edificio: departamento, bodega o estacionamiento."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Departamento"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - departamentos
      operationId: createDepartamento
      summary: Crear Departamentos / Unidades
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Departamento"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Departamento"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Departamentos/{id}:
    get:
      tags:
        - departamentos
      operationId: getDepartamento
      summary: Obtener Departamentos / Unidades
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Departamento"
        404:
          description: No encontrado
    patch:
      tags:
        - departamentos
      operationId: updateDepartamento
      summary: Actualizar Departamentos / Unidades
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Departamento"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - departamentos
      operationId: deleteDepartamento
      summary: Eliminar Departamentos / Unidades
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Egresos:
    get:
      tags:
        - egresos
      operationId: listEgreso
      summary: Listar Egresos
      description: Egresos y cuentas por pagar de la comunidad.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Egreso"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - egresos
      operationId: createEgreso
      summary: Crear Egresos
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Egreso"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Egreso"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Egresos/{id}:
    get:
      tags:
        - egresos
      operationId: getEgreso
      summary: Obtener Egresos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Egreso"
        404:
          description: No encontrado
    patch:
      tags:
        - egresos
      operationId: updateEgreso
      summary: Actualizar Egresos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Egreso"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - egresos
      operationId: deleteEgreso
      summary: Eliminar Egresos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/GastosComunes:
    get:
      tags:
        - gastos-comunes
      operationId: listGastoComun
      summary: Listar Gastos comunes
      description: Periodos de gasto común y prorrateo por unidad.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/GastoComun"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - gastos-comunes
      operationId: createGastoComun
      summary: Crear Gastos comunes
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GastoComun"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GastoComun"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/GastosComunes/{id}:
    get:
      tags:
        - gastos-comunes
      operationId: getGastoComun
      summary: Obtener Gastos comunes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/GastoComun"
        404:
          description: No encontrado
    patch:
      tags:
        - gastos-comunes
      operationId: updateGastoComun
      summary: Actualizar Gastos comunes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GastoComun"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - gastos-comunes
      operationId: deleteGastoComun
      summary: Eliminar Gastos comunes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Pagos:
    get:
      tags:
        - pagos
      operationId: listPago
      summary: Listar Pagos (gasto común)
      description: Pagos de gasto común por departamento.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Pago"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - pagos
      operationId: createPago
      summary: Crear Pagos (gasto común)
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Pago"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Pago"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Pagos/{id}:
    get:
      tags:
        - pagos
      operationId: getPago
      summary: Obtener Pagos (gasto común)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Pago"
        404:
          description: No encontrado
    patch:
      tags:
        - pagos
      operationId: updatePago
      summary: Actualizar Pagos (gasto común)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Pago"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - pagos
      operationId: deletePago
      summary: Eliminar Pagos (gasto común)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Ingresos:
    get:
      tags:
        - ingresos
      operationId: listIngresoEdificio
      summary: Listar Ingresos (finanzas)
      description: Ingresos del módulo Finanzas del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/IngresoEdificio"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - ingresos
      operationId: createIngresoEdificio
      summary: Crear Ingresos (finanzas)
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/IngresoEdificio"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/IngresoEdificio"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Ingresos/{id}:
    get:
      tags:
        - ingresos
      operationId: getIngresoEdificio
      summary: Obtener Ingresos (finanzas)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/IngresoEdificio"
        404:
          description: No encontrado
    patch:
      tags:
        - ingresos
      operationId: updateIngresoEdificio
      summary: Actualizar Ingresos (finanzas)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/IngresoEdificio"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - ingresos
      operationId: deleteIngresoEdificio
      summary: Eliminar Ingresos (finanzas)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Empleados:
    get:
      tags:
        - empleados
      operationId: listEmpleado
      summary: Listar Empleados
      description: Personal del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Empleado"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - empleados
      operationId: createEmpleado
      summary: Crear Empleados
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Empleado"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Empleado"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Empleados/{id}:
    get:
      tags:
        - empleados
      operationId: getEmpleado
      summary: Obtener Empleados
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Empleado"
        404:
          description: No encontrado
    patch:
      tags:
        - empleados
      operationId: updateEmpleado
      summary: Actualizar Empleados
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Empleado"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - empleados
      operationId: deleteEmpleado
      summary: Eliminar Empleados
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Proveedores:
    get:
      tags:
        - proveedores
      operationId: listProveedor
      summary: Listar Proveedores
      description: Proveedores y contactos del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Proveedor"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - proveedores
      operationId: createProveedor
      summary: Crear Proveedores
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Proveedor"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Proveedor"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Proveedores/{id}:
    get:
      tags:
        - proveedores
      operationId: getProveedor
      summary: Obtener Proveedores
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Proveedor"
        404:
          description: No encontrado
    patch:
      tags:
        - proveedores
      operationId: updateProveedor
      summary: Actualizar Proveedores
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Proveedor"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - proveedores
      operationId: deleteProveedor
      summary: Eliminar Proveedores
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Consumos:
    get:
      tags:
        - consumos
      operationId: listConsumo
      summary: Listar Consumos
      description: "Lecturas de luz, agua y gas por periodo."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Consumo"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - consumos
      operationId: createConsumo
      summary: Crear Consumos
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Consumo"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Consumo"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Consumos/{id}:
    get:
      tags:
        - consumos
      operationId: getConsumo
      summary: Obtener Consumos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Consumo"
        404:
          description: No encontrado
    patch:
      tags:
        - consumos
      operationId: updateConsumo
      summary: Actualizar Consumos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Consumo"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - consumos
      operationId: deleteConsumo
      summary: Eliminar Consumos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Mantenciones:
    get:
      tags:
        - mantenciones
      operationId: listMantencion
      summary: Listar Mantenciones
      description: Solicitudes y tickets de mantención.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Mantencion"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - mantenciones
      operationId: createMantencion
      summary: Crear Mantenciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Mantencion"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Mantencion"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Mantenciones/{id}:
    get:
      tags:
        - mantenciones
      operationId: getMantencion
      summary: Obtener Mantenciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Mantencion"
        404:
          description: No encontrado
    patch:
      tags:
        - mantenciones
      operationId: updateMantencion
      summary: Actualizar Mantenciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Mantencion"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - mantenciones
      operationId: deleteMantencion
      summary: Eliminar Mantenciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Multas:
    get:
      tags:
        - multas
      operationId: listMultaDepartamento
      summary: Listar Multas
      description: Multas aplicadas por departamento.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/MultaDepartamento"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - multas
      operationId: createMultaDepartamento
      summary: Crear Multas
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MultaDepartamento"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MultaDepartamento"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Multas/{id}:
    get:
      tags:
        - multas
      operationId: getMultaDepartamento
      summary: Obtener Multas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/MultaDepartamento"
        404:
          description: No encontrado
    patch:
      tags:
        - multas
      operationId: updateMultaDepartamento
      summary: Actualizar Multas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MultaDepartamento"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - multas
      operationId: deleteMultaDepartamento
      summary: Eliminar Multas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Visitas:
    get:
      tags:
        - visitas
      operationId: listVisita
      summary: Listar Visitas / Encomiendas
      description: Registro de visitas y encomiendas.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Visita"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - visitas
      operationId: createVisita
      summary: Crear Visitas / Encomiendas
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Visita"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Visita"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Visitas/{id}:
    get:
      tags:
        - visitas
      operationId: getVisita
      summary: Obtener Visitas / Encomiendas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Visita"
        404:
          description: No encontrado
    patch:
      tags:
        - visitas
      operationId: updateVisita
      summary: Actualizar Visitas / Encomiendas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Visita"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - visitas
      operationId: deleteVisita
      summary: Eliminar Visitas / Encomiendas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/AreasComunes:
    get:
      tags:
        - areas-comunes
      operationId: listAreaComun
      summary: Listar Áreas comunes
      description: Áreas comunes reservables del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/AreaComun"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - areas-comunes
      operationId: createAreaComun
      summary: Crear Áreas comunes
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AreaComun"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AreaComun"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/AreasComunes/{id}:
    get:
      tags:
        - areas-comunes
      operationId: getAreaComun
      summary: Obtener Áreas comunes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/AreaComun"
        404:
          description: No encontrado
    patch:
      tags:
        - areas-comunes
      operationId: updateAreaComun
      summary: Actualizar Áreas comunes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AreaComun"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - areas-comunes
      operationId: deleteAreaComun
      summary: Eliminar Áreas comunes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Reservas:
    get:
      tags:
        - reservas
      operationId: listReserva
      summary: Listar Reservas
      description: Reservas de áreas comunes.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Reserva"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - reservas
      operationId: createReserva
      summary: Crear Reservas
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Reserva"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Reserva"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Reservas/{id}:
    get:
      tags:
        - reservas
      operationId: getReserva
      summary: Obtener Reservas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Reserva"
        404:
          description: No encontrado
    patch:
      tags:
        - reservas
      operationId: updateReserva
      summary: Actualizar Reservas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Reserva"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - reservas
      operationId: deleteReserva
      summary: Eliminar Reservas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Reglamentos:
    get:
      tags:
        - reglamentos
      operationId: listReglamento
      summary: Listar Reglamentos
      description: Reglamentos internos de la comunidad.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Reglamento"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - reglamentos
      operationId: createReglamento
      summary: Crear Reglamentos
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Reglamento"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Reglamento"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Reglamentos/{id}:
    get:
      tags:
        - reglamentos
      operationId: getReglamento
      summary: Obtener Reglamentos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Reglamento"
        404:
          description: No encontrado
    patch:
      tags:
        - reglamentos
      operationId: updateReglamento
      summary: Actualizar Reglamentos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Reglamento"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - reglamentos
      operationId: deleteReglamento
      summary: Eliminar Reglamentos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/DocumentosLegales:
    get:
      tags:
        - documentos-legales
      operationId: listDocumentoLegal
      summary: Listar Documentos legales
      description: Documentos legales del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/DocumentoLegal"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - documentos-legales
      operationId: createDocumentoLegal
      summary: Crear Documentos legales
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DocumentoLegal"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DocumentoLegal"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/DocumentosLegales/{id}:
    get:
      tags:
        - documentos-legales
      operationId: getDocumentoLegal
      summary: Obtener Documentos legales
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/DocumentoLegal"
        404:
          description: No encontrado
    patch:
      tags:
        - documentos-legales
      operationId: updateDocumentoLegal
      summary: Actualizar Documentos legales
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DocumentoLegal"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - documentos-legales
      operationId: deleteDocumentoLegal
      summary: Eliminar Documentos legales
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/AnunciosDiarioMural:
    get:
      tags:
        - diario-mural
      operationId: listAnuncioDiarioMural
      summary: Listar Diario mural
      description: Anuncios del diario mural.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/AnuncioDiarioMural"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - diario-mural
      operationId: createAnuncioDiarioMural
      summary: Crear Diario mural
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AnuncioDiarioMural"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AnuncioDiarioMural"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/AnunciosDiarioMural/{id}:
    get:
      tags:
        - diario-mural
      operationId: getAnuncioDiarioMural
      summary: Obtener Diario mural
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/AnuncioDiarioMural"
        404:
          description: No encontrado
    patch:
      tags:
        - diario-mural
      operationId: updateAnuncioDiarioMural
      summary: Actualizar Diario mural
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AnuncioDiarioMural"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - diario-mural
      operationId: deleteAnuncioDiarioMural
      summary: Eliminar Diario mural
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Comunicaciones:
    get:
      tags:
        - comunicaciones
      operationId: listComunicacion
      summary: Listar Comunicaciones
      description: Comunicaciones enviadas a residentes.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Comunicacion"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - comunicaciones
      operationId: createComunicacion
      summary: Crear Comunicaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Comunicacion"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comunicacion"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Comunicaciones/{id}:
    get:
      tags:
        - comunicaciones
      operationId: getComunicacion
      summary: Obtener Comunicaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Comunicacion"
        404:
          description: No encontrado
    patch:
      tags:
        - comunicaciones
      operationId: updateComunicacion
      summary: Actualizar Comunicaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Comunicacion"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - comunicaciones
      operationId: deleteComunicacion
      summary: Eliminar Comunicaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Tickets:
    get:
      tags:
        - tickets
      operationId: listTicket
      summary: Listar Tickets
      description: Tickets de soporte y atención.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Ticket"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - tickets
      operationId: createTicket
      summary: Crear Tickets
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Ticket"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Ticket"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Tickets/{id}:
    get:
      tags:
        - tickets
      operationId: getTicket
      summary: Obtener Tickets
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Ticket"
        404:
          description: No encontrado
    patch:
      tags:
        - tickets
      operationId: updateTicket
      summary: Actualizar Tickets
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Ticket"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - tickets
      operationId: deleteTicket
      summary: Eliminar Tickets
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Votaciones:
    get:
      tags:
        - votaciones
      operationId: listVotacion
      summary: Listar Votaciones
      description: Votaciones y asambleas de la comunidad.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Votacion"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - votaciones
      operationId: createVotacion
      summary: Crear Votaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Votacion"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Votacion"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Votaciones/{id}:
    get:
      tags:
        - votaciones
      operationId: getVotacion
      summary: Obtener Votaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Votacion"
        404:
          description: No encontrado
    patch:
      tags:
        - votaciones
      operationId: updateVotacion
      summary: Actualizar Votaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Votacion"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - votaciones
      operationId: deleteVotacion
      summary: Eliminar Votaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Convenios:
    get:
      tags:
        - convenios
      operationId: listConvenioPago
      summary: Listar Convenios de pago
      description: Convenios de pago por deuda.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ConvenioPago"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - convenios
      operationId: createConvenioPago
      summary: Crear Convenios de pago
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ConvenioPago"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConvenioPago"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Convenios/{id}:
    get:
      tags:
        - convenios
      operationId: getConvenioPago
      summary: Obtener Convenios de pago
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ConvenioPago"
        404:
          description: No encontrado
    patch:
      tags:
        - convenios
      operationId: updateConvenioPago
      summary: Actualizar Convenios de pago
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ConvenioPago"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - convenios
      operationId: deleteConvenioPago
      summary: Eliminar Convenios de pago
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Cotizaciones:
    get:
      tags:
        - cotizaciones
      operationId: listCotizacion
      summary: Listar Cotizaciones
      description: Cotizaciones de proveedores.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Cotizacion"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - cotizaciones
      operationId: createCotizacion
      summary: Crear Cotizaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Cotizacion"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Cotizacion"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Cotizaciones/{id}:
    get:
      tags:
        - cotizaciones
      operationId: getCotizacion
      summary: Obtener Cotizaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Cotizacion"
        404:
          description: No encontrado
    patch:
      tags:
        - cotizaciones
      operationId: updateCotizacion
      summary: Actualizar Cotizaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Cotizacion"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - cotizaciones
      operationId: deleteCotizacion
      summary: Eliminar Cotizaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/GruposUnidades:
    get:
      tags:
        - grupos-unidades
      operationId: listGrupoUnidades
      summary: Listar Grupos de unidades
      description: Grupos de unidades para prorrateo o cobro.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/GrupoUnidades"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - grupos-unidades
      operationId: createGrupoUnidades
      summary: Crear Grupos de unidades
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GrupoUnidades"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GrupoUnidades"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/GruposUnidades/{id}:
    get:
      tags:
        - grupos-unidades
      operationId: getGrupoUnidades
      summary: Obtener Grupos de unidades
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/GrupoUnidades"
        404:
          description: No encontrado
    patch:
      tags:
        - grupos-unidades
      operationId: updateGrupoUnidades
      summary: Actualizar Grupos de unidades
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GrupoUnidades"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - grupos-unidades
      operationId: deleteGrupoUnidades
      summary: Eliminar Grupos de unidades
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Inventario:
    get:
      tags:
        - inventario
      operationId: listItemInventario
      summary: Listar Inventario
      description: Inventario de bienes del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ItemInventario"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - inventario
      operationId: createItemInventario
      summary: Crear Inventario
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ItemInventario"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ItemInventario"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Inventario/{id}:
    get:
      tags:
        - inventario
      operationId: getItemInventario
      summary: Obtener Inventario
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ItemInventario"
        404:
          description: No encontrado
    patch:
      tags:
        - inventario
      operationId: updateItemInventario
      summary: Actualizar Inventario
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ItemInventario"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - inventario
      operationId: deleteItemInventario
      summary: Eliminar Inventario
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Aprobaciones:
    get:
      tags:
        - aprobaciones
      operationId: listSolicitudAprobacion
      summary: Listar Aprobaciones
      description: Solicitudes de aprobación internas.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/SolicitudAprobacion"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - aprobaciones
      operationId: createSolicitudAprobacion
      summary: Crear Aprobaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SolicitudAprobacion"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SolicitudAprobacion"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Aprobaciones/{id}:
    get:
      tags:
        - aprobaciones
      operationId: getSolicitudAprobacion
      summary: Obtener Aprobaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/SolicitudAprobacion"
        404:
          description: No encontrado
    patch:
      tags:
        - aprobaciones
      operationId: updateSolicitudAprobacion
      summary: Actualizar Aprobaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SolicitudAprobacion"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - aprobaciones
      operationId: deleteSolicitudAprobacion
      summary: Eliminar Aprobaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Seguros:
    get:
      tags:
        - seguros
      operationId: listSeguroDepartamento
      summary: Listar Seguros
      description: Seguros por departamento.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/SeguroDepartamento"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - seguros
      operationId: createSeguroDepartamento
      summary: Crear Seguros
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SeguroDepartamento"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SeguroDepartamento"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Seguros/{id}:
    get:
      tags:
        - seguros
      operationId: getSeguroDepartamento
      summary: Obtener Seguros
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/SeguroDepartamento"
        404:
          description: No encontrado
    patch:
      tags:
        - seguros
      operationId: updateSeguroDepartamento
      summary: Actualizar Seguros
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SeguroDepartamento"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - seguros
      operationId: deleteSeguroDepartamento
      summary: Eliminar Seguros
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Siniestros:
    get:
      tags:
        - siniestros
      operationId: listSiniestro
      summary: Listar Siniestros
      description: Siniestros y reclamos de seguros.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Siniestro"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - siniestros
      operationId: createSiniestro
      summary: Crear Siniestros
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Siniestro"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Siniestro"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Siniestros/{id}:
    get:
      tags:
        - siniestros
      operationId: getSiniestro
      summary: Obtener Siniestros
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Siniestro"
        404:
          description: No encontrado
    patch:
      tags:
        - siniestros
      operationId: updateSiniestro
      summary: Actualizar Siniestros
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Siniestro"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - siniestros
      operationId: deleteSiniestro
      summary: Eliminar Siniestros
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/PlanEmergencia:
    get:
      tags:
        - plan-emergencia
      operationId: listPlanEmergencia
      summary: Listar Plan de emergencia
      description: Planes de emergencia del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/PlanEmergencia"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - plan-emergencia
      operationId: createPlanEmergencia
      summary: Crear Plan de emergencia
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PlanEmergencia"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PlanEmergencia"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/PlanEmergencia/{id}:
    get:
      tags:
        - plan-emergencia
      operationId: getPlanEmergencia
      summary: Obtener Plan de emergencia
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/PlanEmergencia"
        404:
          description: No encontrado
    patch:
      tags:
        - plan-emergencia
      operationId: updatePlanEmergencia
      summary: Actualizar Plan de emergencia
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PlanEmergencia"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - plan-emergencia
      operationId: deletePlanEmergencia
      summary: Eliminar Plan de emergencia
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Procedimientos:
    get:
      tags:
        - procedimientos
      operationId: listProcedimientoInterno
      summary: Listar Procedimientos
      description: Procedimientos internos operativos.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ProcedimientoInterno"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - procedimientos
      operationId: createProcedimientoInterno
      summary: Crear Procedimientos
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ProcedimientoInterno"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProcedimientoInterno"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Procedimientos/{id}:
    get:
      tags:
        - procedimientos
      operationId: getProcedimientoInterno
      summary: Obtener Procedimientos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ProcedimientoInterno"
        404:
          description: No encontrado
    patch:
      tags:
        - procedimientos
      operationId: updateProcedimientoInterno
      summary: Actualizar Procedimientos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ProcedimientoInterno"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - procedimientos
      operationId: deleteProcedimientoInterno
      summary: Eliminar Procedimientos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/PagosTesoreria:
    get:
      tags:
        - pagos-tesoreria
      operationId: listPagoEdificio
      summary: Listar Pagos (finanzas)
      description: Pagos del módulo Finanzas del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/PagoEdificio"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - pagos-tesoreria
      operationId: createPagoEdificio
      summary: Crear Pagos (finanzas)
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PagoEdificio"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PagoEdificio"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/PagosTesoreria/{id}:
    get:
      tags:
        - pagos-tesoreria
      operationId: getPagoEdificio
      summary: Obtener Pagos (finanzas)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/PagoEdificio"
        404:
          description: No encontrado
    patch:
      tags:
        - pagos-tesoreria
      operationId: updatePagoEdificio
      summary: Actualizar Pagos (finanzas)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PagoEdificio"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - pagos-tesoreria
      operationId: deletePagoEdificio
      summary: Eliminar Pagos (finanzas)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/FondosReserva:
    get:
      tags:
        - fondos-reserva
      operationId: listFondoReserva
      summary: Listar Fondos de reserva
      description: Fondos de reserva de la comunidad.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/FondoReserva"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - fondos-reserva
      operationId: createFondoReserva
      summary: Crear Fondos de reserva
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FondoReserva"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/FondoReserva"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/FondosReserva/{id}:
    get:
      tags:
        - fondos-reserva
      operationId: getFondoReserva
      summary: Obtener Fondos de reserva
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/FondoReserva"
        404:
          description: No encontrado
    patch:
      tags:
        - fondos-reserva
      operationId: updateFondoReserva
      summary: Actualizar Fondos de reserva
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FondoReserva"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - fondos-reserva
      operationId: deleteFondoReserva
      summary: Eliminar Fondos de reserva
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/ConfiguracionEdificio:
    get:
      tags:
        - configuracion-edificio
      operationId: listConfiguracionEdificio
      summary: Listar Configuración del edificio
      description: "Parámetros de cobro, mora, notificaciones, firma y reglas del edificio."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ConfiguracionEdificio"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - configuracion-edificio
      operationId: createConfiguracionEdificio
      summary: Crear Configuración del edificio
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ConfiguracionEdificio"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConfiguracionEdificio"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/ConfiguracionEdificio/{id}:
    get:
      tags:
        - configuracion-edificio
      operationId: getConfiguracionEdificio
      summary: Obtener Configuración del edificio
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ConfiguracionEdificio"
        404:
          description: No encontrado
    patch:
      tags:
        - configuracion-edificio
      operationId: updateConfiguracionEdificio
      summary: Actualizar Configuración del edificio
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ConfiguracionEdificio"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - configuracion-edificio
      operationId: deleteConfiguracionEdificio
      summary: Eliminar Configuración del edificio
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/TiposMulta:
    get:
      tags:
        - tipos-multa
      operationId: listTipoMulta
      summary: Listar Tipos de multa
      description: Catálogo de tipos de multa configurables por edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/TipoMulta"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - tipos-multa
      operationId: createTipoMulta
      summary: Crear Tipos de multa
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TipoMulta"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TipoMulta"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/TiposMulta/{id}:
    get:
      tags:
        - tipos-multa
      operationId: getTipoMulta
      summary: Obtener Tipos de multa
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/TipoMulta"
        404:
          description: No encontrado
    patch:
      tags:
        - tipos-multa
      operationId: updateTipoMulta
      summary: Actualizar Tipos de multa
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TipoMulta"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - tipos-multa
      operationId: deleteTipoMulta
      summary: Eliminar Tipos de multa
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/FinanzasConfig:
    get:
      tags:
        - finanzas-config
      operationId: listFinanzasConfig
      summary: Listar Configuración finanzas
      description: Categorías y subcategorías de egresos e ingresos del módulo Finanzas.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/FinanzasConfig"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - finanzas-config
      operationId: createFinanzasConfig
      summary: Crear Configuración finanzas
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FinanzasConfig"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/FinanzasConfig"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/FinanzasConfig/{id}:
    get:
      tags:
        - finanzas-config
      operationId: getFinanzasConfig
      summary: Obtener Configuración finanzas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/FinanzasConfig"
        404:
          description: No encontrado
    patch:
      tags:
        - finanzas-config
      operationId: updateFinanzasConfig
      summary: Actualizar Configuración finanzas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FinanzasConfig"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - finanzas-config
      operationId: deleteFinanzasConfig
      summary: Eliminar Configuración finanzas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/GastosDepartamento:
    get:
      tags:
        - gastos-departamento
      operationId: listGastoDepartamento
      summary: Listar Gastos por unidad
      description: Prorrateo de gasto común por departamento/unidad.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/GastoDepartamento"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - gastos-departamento
      operationId: createGastoDepartamento
      summary: Crear Gastos por unidad
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GastoDepartamento"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GastoDepartamento"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/GastosDepartamento/{id}:
    get:
      tags:
        - gastos-departamento
      operationId: getGastoDepartamento
      summary: Obtener Gastos por unidad
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/GastoDepartamento"
        404:
          description: No encontrado
    patch:
      tags:
        - gastos-departamento
      operationId: updateGastoDepartamento
      summary: Actualizar Gastos por unidad
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GastoDepartamento"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - gastos-departamento
      operationId: deleteGastoDepartamento
      summary: Eliminar Gastos por unidad
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/UserAssignments:
    get:
      tags:
        - asignaciones-usuario
      operationId: listUserAssignment
      summary: Listar Asignaciones de usuario
      description: Vincula un usuario a un edificio/unidad con un rol.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/UserAssignment"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - asignaciones-usuario
      operationId: createUserAssignment
      summary: Crear Asignaciones de usuario
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UserAssignment"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UserAssignment"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/UserAssignments/{id}:
    get:
      tags:
        - asignaciones-usuario
      operationId: getUserAssignment
      summary: Obtener Asignaciones de usuario
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/UserAssignment"
        404:
          description: No encontrado
    patch:
      tags:
        - asignaciones-usuario
      operationId: updateUserAssignment
      summary: Actualizar Asignaciones de usuario
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UserAssignment"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - asignaciones-usuario
      operationId: deleteUserAssignment
      summary: Eliminar Asignaciones de usuario
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/RoleAssignments:
    get:
      tags:
        - asignaciones-rol
      operationId: listRoleAssignment
      summary: Listar Asignaciones de rol
      description: "RBAC por edificio: rol, permisos extra y exclusiones."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/RoleAssignment"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - asignaciones-rol
      operationId: createRoleAssignment
      summary: Crear Asignaciones de rol
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RoleAssignment"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RoleAssignment"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/RoleAssignments/{id}:
    get:
      tags:
        - asignaciones-rol
      operationId: getRoleAssignment
      summary: Obtener Asignaciones de rol
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/RoleAssignment"
        404:
          description: No encontrado
    patch:
      tags:
        - asignaciones-rol
      operationId: updateRoleAssignment
      summary: Actualizar Asignaciones de rol
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RoleAssignment"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - asignaciones-rol
      operationId: deleteRoleAssignment
      summary: Eliminar Asignaciones de rol
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/PermissionGroups:
    get:
      tags:
        - grupos-permisos
      operationId: listPermissionGroup
      summary: Listar Grupos de permisos
      description: Grupos custom de permisos reutilizables por edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/PermissionGroup"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - grupos-permisos
      operationId: createPermissionGroup
      summary: Crear Grupos de permisos
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PermissionGroup"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PermissionGroup"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/PermissionGroups/{id}:
    get:
      tags:
        - grupos-permisos
      operationId: getPermissionGroup
      summary: Obtener Grupos de permisos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/PermissionGroup"
        404:
          description: No encontrado
    patch:
      tags:
        - grupos-permisos
      operationId: updatePermissionGroup
      summary: Actualizar Grupos de permisos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PermissionGroup"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - grupos-permisos
      operationId: deletePermissionGroup
      summary: Eliminar Grupos de permisos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/UserPermissions:
    get:
      tags:
        - permisos-usuario
      operationId: listUserPermissions
      summary: Listar Permisos adicionales
      description: Permisos extra otorgados a un usuario en un edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/UserPermissions"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - permisos-usuario
      operationId: createUserPermissions
      summary: Crear Permisos adicionales
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UserPermissions"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UserPermissions"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/UserPermissions/{id}:
    get:
      tags:
        - permisos-usuario
      operationId: getUserPermissions
      summary: Obtener Permisos adicionales
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/UserPermissions"
        404:
          description: No encontrado
    patch:
      tags:
        - permisos-usuario
      operationId: updateUserPermissions
      summary: Actualizar Permisos adicionales
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UserPermissions"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - permisos-usuario
      operationId: deleteUserPermissions
      summary: Eliminar Permisos adicionales
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/TurnosPlanificacion:
    get:
      tags:
        - turnos-planificacion
      operationId: listTurno
      summary: Listar Turnos y planificación
      description: "Turnos de personal: fecha, horario y empleados asignados."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Turno"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - turnos-planificacion
      operationId: createTurno
      summary: Crear Turnos y planificación
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Turno"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Turno"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/TurnosPlanificacion/{id}:
    get:
      tags:
        - turnos-planificacion
      operationId: getTurno
      summary: Obtener Turnos y planificación
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Turno"
        404:
          description: No encontrado
    patch:
      tags:
        - turnos-planificacion
      operationId: updateTurno
      summary: Actualizar Turnos y planificación
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Turno"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - turnos-planificacion
      operationId: deleteTurno
      summary: Eliminar Turnos y planificación
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Tareas:
    get:
      tags:
        - tareas
      operationId: listTarea
      summary: Listar Tareas
      description: "Tareas de planificación operativas, opcionales a un turno."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Tarea"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - tareas
      operationId: createTarea
      summary: Crear Tareas
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Tarea"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Tarea"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Tareas/{id}:
    get:
      tags:
        - tareas
      operationId: getTarea
      summary: Obtener Tareas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Tarea"
        404:
          description: No encontrado
    patch:
      tags:
        - tareas
      operationId: updateTarea
      summary: Actualizar Tareas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Tarea"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - tareas
      operationId: deleteTarea
      summary: Eliminar Tareas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/MiembrosComite:
    get:
      tags:
        - comite-miembros
      operationId: listMiembroComite
      summary: Listar Miembros del comité
      description: Integrantes del comité de administración del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/MiembroComite"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - comite-miembros
      operationId: createMiembroComite
      summary: Crear Miembros del comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MiembroComite"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MiembroComite"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/MiembrosComite/{id}:
    get:
      tags:
        - comite-miembros
      operationId: getMiembroComite
      summary: Obtener Miembros del comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/MiembroComite"
        404:
          description: No encontrado
    patch:
      tags:
        - comite-miembros
      operationId: updateMiembroComite
      summary: Actualizar Miembros del comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MiembroComite"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - comite-miembros
      operationId: deleteMiembroComite
      summary: Eliminar Miembros del comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/ReunionesComite:
    get:
      tags:
        - comite-reuniones
      operationId: listReunionComite
      summary: Listar Reuniones de comité
      description: Reuniones programadas del comité con orden del día.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ReunionComite"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - comite-reuniones
      operationId: createReunionComite
      summary: Crear Reuniones de comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReunionComite"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReunionComite"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/ReunionesComite/{id}:
    get:
      tags:
        - comite-reuniones
      operationId: getReunionComite
      summary: Obtener Reuniones de comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ReunionComite"
        404:
          description: No encontrado
    patch:
      tags:
        - comite-reuniones
      operationId: updateReunionComite
      summary: Actualizar Reuniones de comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReunionComite"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - comite-reuniones
      operationId: deleteReunionComite
      summary: Eliminar Reuniones de comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/ActasComite:
    get:
      tags:
        - comite-actas
      operationId: listActaComite
      summary: Listar Actas de comité
      description: Actas formales asociadas a reuniones de comité.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ActaComite"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - comite-actas
      operationId: createActaComite
      summary: Crear Actas de comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ActaComite"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ActaComite"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/ActasComite/{id}:
    get:
      tags:
        - comite-actas
      operationId: getActaComite
      summary: Obtener Actas de comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ActaComite"
        404:
          description: No encontrado
    patch:
      tags:
        - comite-actas
      operationId: updateActaComite
      summary: Actualizar Actas de comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ActaComite"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - comite-actas
      operationId: deleteActaComite
      summary: Eliminar Actas de comité
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/PlusvaliaConfig:
    get:
      tags:
        - plusvalia-config
      operationId: listPlusvaliaConfig
      summary: Listar Plusvalía (config)
      description: Factores y orientación para el índice de plusvalía del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/PlusvaliaConfig"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - plusvalia-config
      operationId: createPlusvaliaConfig
      summary: Crear Plusvalía (config)
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PlusvaliaConfig"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PlusvaliaConfig"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/PlusvaliaConfig/{id}:
    get:
      tags:
        - plusvalia-config
      operationId: getPlusvaliaConfig
      summary: Obtener Plusvalía (config)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/PlusvaliaConfig"
        404:
          description: No encontrado
    patch:
      tags:
        - plusvalia-config
      operationId: updatePlusvaliaConfig
      summary: Actualizar Plusvalía (config)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PlusvaliaConfig"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - plusvalia-config
      operationId: deletePlusvaliaConfig
      summary: Eliminar Plusvalía (config)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/PlusvaliaSnapshots:
    get:
      tags:
        - plusvalia-snapshots
      operationId: listPlusvaliaSnapshot
      summary: Listar Plusvalía (histórico)
      description: Snapshots periódicos del índice de plusvalía.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/PlusvaliaSnapshot"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - plusvalia-snapshots
      operationId: createPlusvaliaSnapshot
      summary: Crear Plusvalía (histórico)
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PlusvaliaSnapshot"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PlusvaliaSnapshot"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/PlusvaliaSnapshots/{id}:
    get:
      tags:
        - plusvalia-snapshots
      operationId: getPlusvaliaSnapshot
      summary: Obtener Plusvalía (histórico)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/PlusvaliaSnapshot"
        404:
          description: No encontrado
    patch:
      tags:
        - plusvalia-snapshots
      operationId: updatePlusvaliaSnapshot
      summary: Actualizar Plusvalía (histórico)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PlusvaliaSnapshot"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - plusvalia-snapshots
      operationId: deletePlusvaliaSnapshot
      summary: Eliminar Plusvalía (histórico)
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Transparencia:
    get:
      tags:
        - transparencia
      operationId: listTransparencia
      summary: Listar Transparencia
      description: "Portal de transparencia comunitaria (lectura agregada de finanzas, comité y seguros)."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Transparencia"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - transparencia
      operationId: createTransparencia
      summary: Crear Transparencia
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Transparencia"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Transparencia"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Transparencia/{id}:
    get:
      tags:
        - transparencia
      operationId: getTransparencia
      summary: Obtener Transparencia
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Transparencia"
        404:
          description: No encontrado
    patch:
      tags:
        - transparencia
      operationId: updateTransparencia
      summary: Actualizar Transparencia
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Transparencia"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - transparencia
      operationId: deleteTransparencia
      summary: Eliminar Transparencia
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Reportes:
    get:
      tags:
        - reportes
      operationId: listReporte
      summary: Listar Reportes
      description: "Reportes financieros, de morosidad, mantenciones y ocupación."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Reporte"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - reportes
      operationId: createReporte
      summary: Crear Reportes
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Reporte"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Reporte"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Reportes/{id}:
    get:
      tags:
        - reportes
      operationId: getReporte
      summary: Obtener Reportes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Reporte"
        404:
          description: No encontrado
    patch:
      tags:
        - reportes
      operationId: updateReporte
      summary: Actualizar Reportes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Reporte"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - reportes
      operationId: deleteReporte
      summary: Eliminar Reportes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/ReservasEstacionamientoVisita:
    get:
      tags:
        - reservas-estacionamiento-visita
      operationId: listReservaEstacionamientoVisita
      summary: Listar Estacionamientos de visitas
      description: Reservas de estacionamiento para visitas.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ReservaEstacionamientoVisita"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - reservas-estacionamiento-visita
      operationId: createReservaEstacionamientoVisita
      summary: Crear Estacionamientos de visitas
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReservaEstacionamientoVisita"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReservaEstacionamientoVisita"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/ReservasEstacionamientoVisita/{id}:
    get:
      tags:
        - reservas-estacionamiento-visita
      operationId: getReservaEstacionamientoVisita
      summary: Obtener Estacionamientos de visitas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ReservaEstacionamientoVisita"
        404:
          description: No encontrado
    patch:
      tags:
        - reservas-estacionamiento-visita
      operationId: updateReservaEstacionamientoVisita
      summary: Actualizar Estacionamientos de visitas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReservaEstacionamientoVisita"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - reservas-estacionamiento-visita
      operationId: deleteReservaEstacionamientoVisita
      summary: Eliminar Estacionamientos de visitas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/ActivityLogs:
    get:
      tags:
        - actividad
      operationId: listActivityLog
      summary: Listar Registro de actividad
      description: Auditoría de acciones de usuarios en el edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ActivityLog"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - actividad
      operationId: createActivityLog
      summary: Crear Registro de actividad
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ActivityLog"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ActivityLog"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/ActivityLogs/{id}:
    get:
      tags:
        - actividad
      operationId: getActivityLog
      summary: Obtener Registro de actividad
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ActivityLog"
        404:
          description: No encontrado
    patch:
      tags:
        - actividad
      operationId: updateActivityLog
      summary: Actualizar Registro de actividad
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ActivityLog"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - actividad
      operationId: deleteActivityLog
      summary: Eliminar Registro de actividad
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/MonitoreoEquipos:
    get:
      tags:
        - monitoreo-equipos
      operationId: listMonitoreoEquipo
      summary: Listar Monitoreo de equipos
      description: Configuración del agente de monitoreo en equipos del personal.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/MonitoreoEquipo"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - monitoreo-equipos
      operationId: createMonitoreoEquipo
      summary: Crear Monitoreo de equipos
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MonitoreoEquipo"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MonitoreoEquipo"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/MonitoreoEquipos/{id}:
    get:
      tags:
        - monitoreo-equipos
      operationId: getMonitoreoEquipo
      summary: Obtener Monitoreo de equipos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/MonitoreoEquipo"
        404:
          description: No encontrado
    patch:
      tags:
        - monitoreo-equipos
      operationId: updateMonitoreoEquipo
      summary: Actualizar Monitoreo de equipos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MonitoreoEquipo"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - monitoreo-equipos
      operationId: deleteMonitoreoEquipo
      summary: Eliminar Monitoreo de equipos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/CotizacionesSeguro:
    get:
      tags:
        - cotizaciones-seguro
      operationId: listCotizacionSeguro
      summary: Listar Cotización de seguros
      description: Cotizaciones rápidas de seguros del edificio (distinto de cotizaciones a proveedores).
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/CotizacionSeguro"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - cotizaciones-seguro
      operationId: createCotizacionSeguro
      summary: Crear Cotización de seguros
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CotizacionSeguro"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CotizacionSeguro"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/CotizacionesSeguro/{id}:
    get:
      tags:
        - cotizaciones-seguro
      operationId: getCotizacionSeguro
      summary: Obtener Cotización de seguros
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/CotizacionSeguro"
        404:
          description: No encontrado
    patch:
      tags:
        - cotizaciones-seguro
      operationId: updateCotizacionSeguro
      summary: Actualizar Cotización de seguros
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CotizacionSeguro"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - cotizaciones-seguro
      operationId: deleteCotizacionSeguro
      summary: Eliminar Cotización de seguros
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/RegistrosHoras:
    get:
      tags:
        - registros-horas
      operationId: listRegistroHoras
      summary: Listar Registro de horas
      description: Horas trabajadas por empleado y periodo.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/RegistroHoras"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - registros-horas
      operationId: createRegistroHoras
      summary: Crear Registro de horas
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RegistroHoras"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RegistroHoras"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/RegistrosHoras/{id}:
    get:
      tags:
        - registros-horas
      operationId: getRegistroHoras
      summary: Obtener Registro de horas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/RegistroHoras"
        404:
          description: No encontrado
    patch:
      tags:
        - registros-horas
      operationId: updateRegistroHoras
      summary: Actualizar Registro de horas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RegistroHoras"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - registros-horas
      operationId: deleteRegistroHoras
      summary: Eliminar Registro de horas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/PagosEmpleados:
    get:
      tags:
        - pagos-empleados
      operationId: listPagoEmpleado
      summary: Listar Pagos a empleados
      description: Liquidaciones y pagos de personal.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/PagoEmpleado"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - pagos-empleados
      operationId: createPagoEmpleado
      summary: Crear Pagos a empleados
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PagoEmpleado"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PagoEmpleado"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/PagosEmpleados/{id}:
    get:
      tags:
        - pagos-empleados
      operationId: getPagoEmpleado
      summary: Obtener Pagos a empleados
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/PagoEmpleado"
        404:
          description: No encontrado
    patch:
      tags:
        - pagos-empleados
      operationId: updatePagoEmpleado
      summary: Actualizar Pagos a empleados
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PagoEmpleado"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - pagos-empleados
      operationId: deletePagoEmpleado
      summary: Eliminar Pagos a empleados
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/MantencionesPeriodicas:
    get:
      tags:
        - mantenciones-periodicas
      operationId: listMantencionPeriodica
      summary: Listar Mantenciones periódicas
      description: Planes de mantención recurrentes del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/MantencionPeriodica"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - mantenciones-periodicas
      operationId: createMantencionPeriodica
      summary: Crear Mantenciones periódicas
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MantencionPeriodica"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MantencionPeriodica"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/MantencionesPeriodicas/{id}:
    get:
      tags:
        - mantenciones-periodicas
      operationId: getMantencionPeriodica
      summary: Obtener Mantenciones periódicas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/MantencionPeriodica"
        404:
          description: No encontrado
    patch:
      tags:
        - mantenciones-periodicas
      operationId: updateMantencionPeriodica
      summary: Actualizar Mantenciones periódicas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MantencionPeriodica"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - mantenciones-periodicas
      operationId: deleteMantencionPeriodica
      summary: Eliminar Mantenciones periódicas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/ProcedimientosEjecucion:
    get:
      tags:
        - procedimientos-ejecucion
      operationId: listProcedimientoEjecucion
      summary: Listar Ejecuciones de procedimiento
      description: Instancias de ejecución de procedimientos internos.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ProcedimientoEjecucion"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - procedimientos-ejecucion
      operationId: createProcedimientoEjecucion
      summary: Crear Ejecuciones de procedimiento
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ProcedimientoEjecucion"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProcedimientoEjecucion"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/ProcedimientosEjecucion/{id}:
    get:
      tags:
        - procedimientos-ejecucion
      operationId: getProcedimientoEjecucion
      summary: Obtener Ejecuciones de procedimiento
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ProcedimientoEjecucion"
        404:
          description: No encontrado
    patch:
      tags:
        - procedimientos-ejecucion
      operationId: updateProcedimientoEjecucion
      summary: Actualizar Ejecuciones de procedimiento
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ProcedimientoEjecucion"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - procedimientos-ejecucion
      operationId: deleteProcedimientoEjecucion
      summary: Eliminar Ejecuciones de procedimiento
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Invitaciones:
    get:
      tags:
        - invitaciones
      operationId: listInvitacion
      summary: Listar Invitaciones
      description: Invitaciones pendientes a usuarios del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Invitacion"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - invitaciones
      operationId: createInvitacion
      summary: Crear Invitaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Invitacion"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Invitacion"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Invitaciones/{id}:
    get:
      tags:
        - invitaciones
      operationId: getInvitacion
      summary: Obtener Invitaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Invitacion"
        404:
          description: No encontrado
    patch:
      tags:
        - invitaciones
      operationId: updateInvitacion
      summary: Actualizar Invitaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Invitacion"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - invitaciones
      operationId: deleteInvitacion
      summary: Eliminar Invitaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/CentroDatos:
    get:
      tags:
        - centro-datos
      operationId: listCentroDatos
      summary: Listar Centro de datos
      description: Cargas e importaciones masivas de datos históricos del edificio.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/CentroDatos"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - centro-datos
      operationId: createCentroDatos
      summary: Crear Centro de datos
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CentroDatos"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CentroDatos"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/CentroDatos/{id}:
    get:
      tags:
        - centro-datos
      operationId: getCentroDatos
      summary: Obtener Centro de datos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/CentroDatos"
        404:
          description: No encontrado
    patch:
      tags:
        - centro-datos
      operationId: updateCentroDatos
      summary: Actualizar Centro de datos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CentroDatos"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - centro-datos
      operationId: deleteCentroDatos
      summary: Eliminar Centro de datos
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/Finanzas:
    get:
      tags:
        - finanzas
      operationId: listFinanzas
      summary: Listar Finanzas
      description: "Vista agregada del módulo Finanzas (egresos, ingresos y tesorería)."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/Finanzas"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - finanzas
      operationId: createFinanzas
      summary: Crear Finanzas
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Finanzas"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Finanzas"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/Finanzas/{id}:
    get:
      tags:
        - finanzas
      operationId: getFinanzas
      summary: Obtener Finanzas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/Finanzas"
        404:
          description: No encontrado
    patch:
      tags:
        - finanzas
      operationId: updateFinanzas
      summary: Actualizar Finanzas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Finanzas"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - finanzas
      operationId: deleteFinanzas
      summary: Eliminar Finanzas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/ChatThreads:
    get:
      tags:
        - mensajes
      operationId: listChatThread
      summary: Listar Mensajes
      description: Chat entre residentes y administración (hilos y mensajes del edificio).
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ChatThread"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - mensajes
      operationId: createChatThread
      summary: Crear Mensajes
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChatThread"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ChatThread"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/ChatThreads/{id}:
    get:
      tags:
        - mensajes
      operationId: getChatThread
      summary: Obtener Mensajes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ChatThread"
        404:
          description: No encontrado
    patch:
      tags:
        - mensajes
      operationId: updateChatThread
      summary: Actualizar Mensajes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChatThread"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - mensajes
      operationId: deleteChatThread
      summary: Eliminar Mensajes
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/ReportesAnualesGestion:
    get:
      tags:
        - reporte-anual
      operationId: listReporteAnualGestion
      summary: Listar Reporte anual de gestión
      description: "Reporte anual con checklist, slides, comentarios y exportación PPTX."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ReporteAnualGestion"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - reporte-anual
      operationId: createReporteAnualGestion
      summary: Crear Reporte anual de gestión
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReporteAnualGestion"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReporteAnualGestion"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/ReportesAnualesGestion/{id}:
    get:
      tags:
        - reporte-anual
      operationId: getReporteAnualGestion
      summary: Obtener Reporte anual de gestión
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ReporteAnualGestion"
        404:
          description: No encontrado
    patch:
      tags:
        - reporte-anual
      operationId: updateReporteAnualGestion
      summary: Actualizar Reporte anual de gestión
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReporteAnualGestion"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - reporte-anual
      operationId: deleteReporteAnualGestion
      summary: Eliminar Reporte anual de gestión
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/GestionTransversalPersonal:
    get:
      tags:
        - gestion-transversal-personal
      operationId: listPersonalReserva
      summary: Listar Gestión transversal — Banco de reservas
      description: Personal de reserva compartido entre edificios (comunidesk_transversal).
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/PersonalReserva"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - gestion-transversal-personal
      operationId: createPersonalReserva
      summary: Crear Gestión transversal — Banco de reservas
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PersonalReserva"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PersonalReserva"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/GestionTransversalPersonal/{id}:
    get:
      tags:
        - gestion-transversal-personal
      operationId: getPersonalReserva
      summary: Obtener Gestión transversal — Banco de reservas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/PersonalReserva"
        404:
          description: No encontrado
    patch:
      tags:
        - gestion-transversal-personal
      operationId: updatePersonalReserva
      summary: Actualizar Gestión transversal — Banco de reservas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PersonalReserva"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - gestion-transversal-personal
      operationId: deletePersonalReserva
      summary: Eliminar Gestión transversal — Banco de reservas
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/GestionTransversalEquipo:
    get:
      tags:
        - gestion-transversal-equipo
      operationId: listMiembroEquipo
      summary: Listar Gestión transversal — Equipo de soporte
      description: Miembros del equipo de soporte transversal con permisos por rol.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/MiembroEquipo"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - gestion-transversal-equipo
      operationId: createMiembroEquipo
      summary: Crear Gestión transversal — Equipo de soporte
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MiembroEquipo"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MiembroEquipo"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/GestionTransversalEquipo/{id}:
    get:
      tags:
        - gestion-transversal-equipo
      operationId: getMiembroEquipo
      summary: Obtener Gestión transversal — Equipo de soporte
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/MiembroEquipo"
        404:
          description: No encontrado
    patch:
      tags:
        - gestion-transversal-equipo
      operationId: updateMiembroEquipo
      summary: Actualizar Gestión transversal — Equipo de soporte
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MiembroEquipo"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - gestion-transversal-equipo
      operationId: deleteMiembroEquipo
      summary: Eliminar Gestión transversal — Equipo de soporte
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/GestionTransversalAsignaciones:
    get:
      tags:
        - gestion-transversal-asignaciones
      operationId: listAsignacionTransversal
      summary: Listar Gestión transversal — Asignaciones
      description: Asignaciones de personal titular y reemplazo entre edificios.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/AsignacionTransversal"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - gestion-transversal-asignaciones
      operationId: createAsignacionTransversal
      summary: Crear Gestión transversal — Asignaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AsignacionTransversal"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AsignacionTransversal"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/GestionTransversalAsignaciones/{id}:
    get:
      tags:
        - gestion-transversal-asignaciones
      operationId: getAsignacionTransversal
      summary: Obtener Gestión transversal — Asignaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/AsignacionTransversal"
        404:
          description: No encontrado
    patch:
      tags:
        - gestion-transversal-asignaciones
      operationId: updateAsignacionTransversal
      summary: Actualizar Gestión transversal — Asignaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AsignacionTransversal"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - gestion-transversal-asignaciones
      operationId: deleteAsignacionTransversal
      summary: Eliminar Gestión transversal — Asignaciones
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/EgresosExclusionGastoComun:
    get:
      tags:
        - egresos-exclusiones-gc
      operationId: listEgresoExclusionGastoComun
      summary: Listar Exclusiones de egreso en gasto común
      description: Postergación de cobro de egresos/cuotas en el gasto común mensual.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/EgresoExclusionGastoComun"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - egresos-exclusiones-gc
      operationId: createEgresoExclusionGastoComun
      summary: Crear Exclusiones de egreso en gasto común
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EgresoExclusionGastoComun"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EgresoExclusionGastoComun"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/EgresosExclusionGastoComun/{id}:
    get:
      tags:
        - egresos-exclusiones-gc
      operationId: getEgresoExclusionGastoComun
      summary: Obtener Exclusiones de egreso en gasto común
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/EgresoExclusionGastoComun"
        404:
          description: No encontrado
    patch:
      tags:
        - egresos-exclusiones-gc
      operationId: updateEgresoExclusionGastoComun
      summary: Actualizar Exclusiones de egreso en gasto común
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EgresoExclusionGastoComun"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - egresos-exclusiones-gc
      operationId: deleteEgresoExclusionGastoComun
      summary: Eliminar Exclusiones de egreso en gasto común
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/ConciliacionesBancarias:
    get:
      tags:
        - conciliaciones-bancarias
      operationId: listConciliacionBancaria
      summary: Listar Conciliaciones bancarias
      description: "Conciliación de movimientos bancarios con gastos comunes, egresos e ingresos."
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ConciliacionBancaria"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - conciliaciones-bancarias
      operationId: createConciliacionBancaria
      summary: Crear Conciliaciones bancarias
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ConciliacionBancaria"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConciliacionBancaria"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/ConciliacionesBancarias/{id}:
    get:
      tags:
        - conciliaciones-bancarias
      operationId: getConciliacionBancaria
      summary: Obtener Conciliaciones bancarias
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ConciliacionBancaria"
        404:
          description: No encontrado
    patch:
      tags:
        - conciliaciones-bancarias
      operationId: updateConciliacionBancaria
      summary: Actualizar Conciliaciones bancarias
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ConciliacionBancaria"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - conciliaciones-bancarias
      operationId: deleteConciliacionBancaria
      summary: Eliminar Conciliaciones bancarias
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/MovimientosBancarios:
    get:
      tags:
        - movimientos-bancarios
      operationId: listMovimientoBancario
      summary: Listar Movimientos bancarios
      description: Movimientos importados de cartola bancaria y su estado de conciliación.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/MovimientoBancario"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - movimientos-bancarios
      operationId: createMovimientoBancario
      summary: Crear Movimientos bancarios
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MovimientoBancario"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MovimientoBancario"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/MovimientosBancarios/{id}:
    get:
      tags:
        - movimientos-bancarios
      operationId: getMovimientoBancario
      summary: Obtener Movimientos bancarios
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/MovimientoBancario"
        404:
          description: No encontrado
    patch:
      tags:
        - movimientos-bancarios
      operationId: updateMovimientoBancario
      summary: Actualizar Movimientos bancarios
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MovimientoBancario"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - movimientos-bancarios
      operationId: deleteMovimientoBancario
      summary: Eliminar Movimientos bancarios
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
  /v1/rest/CargasCartola:
    get:
      tags:
        - cargas-cartola
      operationId: listCargaCartola
      summary: Listar Cargas de cartola
      description: Historial de importaciones de cartola bancaria.
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/CargaCartola"
                  count:
                    type: integer
        401:
          description: Token inválido
        403:
          description: Sin permiso
    post:
      tags:
        - cargas-cartola
      operationId: createCargaCartola
      summary: Crear Cargas de cartola
      security:
        - OAuth2App: []
          ComunideskUser: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CargaCartola"
      responses:
        200:
          description: Creado
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CargaCartola"
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
  /v1/rest/CargasCartola/{id}:
    get:
      tags:
        - cargas-cartola
      operationId: getCargaCartola
      summary: Obtener Cargas de cartola
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
          description: Contexto de edificio (requerido en la mayoría de módulos).
        - name: $filter
          in: query
          required: false
          schema:
            type: string
          description: "Filtro OData, p.ej. edificioId eq 'abc'"
        - name: $top
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: $skip
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/CargaCartola"
        404:
          description: No encontrado
    patch:
      tags:
        - cargas-cartola
      operationId: updateCargaCartola
      summary: Actualizar Cargas de cartola
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CargaCartola"
      responses:
        200:
          description: Actualizado
        403:
          description: Sin permiso
        422:
          description: Contrato inválido
    delete:
      tags:
        - cargas-cartola
      operationId: deleteCargaCartola
      summary: Eliminar Cargas de cartola
      security:
        - OAuth2App: []
          ComunideskUser: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: edificioId
          in: query
          required: false
          schema:
            type: string
      responses:
        200:
          description: Eliminado
        403:
          description: Sin permiso
        404:
          description: No encontrado
components:
  securitySchemes:
    OAuth2App:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Access token OAuth2 de tu aplicación.
    ComunideskUser:
      type: apiKey
      in: header
      name: x-comunidesk-user-authorization
      description: "Bearer <JWT de la cuenta Comunidesk del usuario>."
  schemas:
    Edificio:
      type: object
      description: Catálogo de edificios y configuración de cobro.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: edificio
        nombre:
          type: string
        direccion:
          type: string
        comuna:
          type: string
        ciudad:
          type: string
        pisos:
          type: number
        departamentosPorPiso:
          type: number
        pais:
          type: string
        jurisdiccion:
          type: string
        geo:
          type: object
          additionalProperties: true
        diaCobroGastosComunes:
          type: number
        montoGastosComunesBase:
          type: number
        porcentajeMora:
          type: number
        diasGraciaMora:
          type: number
        superAdminEmail:
          type: string
        plan:
          type: string
        dbPrefix:
          type: string
          readOnly: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        totalDepartamentos:
          type: string
          readOnly: true
      required:
        - nombre
        - direccion
        - comuna
        - ciudad
        - pisos
        - departamentosPorPiso
        - diaCobroGastosComunes
        - montoGastosComunesBase
        - porcentajeMora
        - diasGraciaMora
    Departamento:
      type: object
      description: "Unidades del edificio: departamento, bodega o estacionamiento."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: departamento
        edificioId:
          type: string
        numero:
          type: string
        piso:
          type: number
        superficie:
          type: number
        habitaciones:
          type: number
        banos:
          type: number
        factorGastosComunes:
          type: number
        tipoUnidad:
          type: string
          enum:
            - departamento
            - bodega
            - estacionamiento
        estado:
          type: string
          enum:
            - disponible
            - ocupado
            - mantenimiento
        bodega:
          type: string
        estacionamiento:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - numero
        - piso
        - superficie
        - habitaciones
        - banos
        - factorGastosComunes
    Egreso:
      type: object
      description: Egresos y cuentas por pagar de la comunidad.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: egreso
        edificioId:
          type: string
        concepto:
          type: string
        descripcion:
          type: string
        tipoEgreso:
          type: string
          enum:
            - mantencion
            - servicio
            - suministro
            - administracion
            - seguro
            - impuesto
            - salario
            - servicio_basico
            - mejora
            - fondo_reserva
            - otro
        subcategoriaEgreso:
          type: string
        proveedorId:
          type: string
        montoTotal:
          type: number
        numeroCuotas:
          type: number
        fechaEmision:
          type: string
        fechaVencimientoOriginal:
          type: string
        beneficiario:
          type: string
        rutBeneficiario:
          type: string
        datosBancarios:
          type: object
          additionalProperties: true
        numeroFactura:
          type: string
        numeroOrdenCompra:
          type: string
        observaciones:
          type: string
        notasInternas:
          type: string
        origenFinanciamiento:
          type: string
          enum:
            - gasto_comun
            - fondo_reserva
            - mixto
        fondoReservaId:
          type: string
        fondoReservaNombre:
          type: string
        porcentajeFondoReserva:
          type: number
        montoFondoReserva:
          type: number
        grupoId:
          type: string
        grupoNombre:
          type: string
        departamentoId:
          type: string
        departamentoNombre:
          type: string
        esMultaAsociada:
          type: boolean
        multasAsociadasIds:
          type: array
          items: {}
        departamentosCargo:
          type: array
          items: {}
        cuotas:
          type: array
          items: {}
        estado:
          type: string
        tieneCuotas:
          type: boolean
        montoPagado:
          type: string
          readOnly: true
        montoRestante:
          type: string
          readOnly: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        createdBy:
          type: string
          readOnly: true
      required:
        - edificioId
        - concepto
        - tipoEgreso
        - montoTotal
        - numeroCuotas
        - fechaEmision
        - fechaVencimientoOriginal
        - beneficiario
    GastoComun:
      type: object
      description: Periodos de gasto común y prorrateo por unidad.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: gasto_comun
        edificioId:
          type: string
        periodo:
          type: string
        fechaEmision:
          type: string
        fechaVencimiento:
          type: string
        montoBase:
          type: number
        items:
          type: array
          items: {}
        totalGeneral:
          type: number
        estado:
          type: string
          enum:
            - borrador
            - emitido
            - cerrado
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - periodo
        - fechaEmision
        - fechaVencimiento
        - montoBase
        - items
        - totalGeneral
    Pago:
      type: object
      description: Pagos de gasto común por departamento.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: pago
        gastoId:
          type: string
        departamentoId:
          type: string
        edificioId:
          type: string
        periodo:
          type: string
        monto:
          type: number
        metodoPago:
          type: string
          enum:
            - transferencia
            - efectivo
            - cheque
            - tarjeta
            - webpay
            - otro
        fechaPago:
          type: string
        comprobante:
          type: string
        observaciones:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - gastoId
        - departamentoId
        - edificioId
        - periodo
        - monto
        - metodoPago
        - fechaPago
    IngresoEdificio:
      type: object
      description: Ingresos del módulo Finanzas del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: ingreso_edificio
        edificioId:
          type: string
        concepto:
          type: string
        categoria:
          type: string
        monto:
          type: number
        metodoIngreso:
          type: string
        fechaIngreso:
          type: string
        periodo:
          type: string
        observaciones:
          type: string
        registradoPor:
          type: string
          readOnly: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - concepto
        - categoria
        - monto
        - metodoIngreso
        - fechaIngreso
        - periodo
    Empleado:
      type: object
      description: Personal del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: empleado
        edificioId:
          type: string
        nombre:
          type: string
        apellido:
          type: string
        rut:
          type: string
        email:
          type: string
        telefono:
          type: string
        cargo:
          type: string
        tipoEmpleado:
          type: string
        tipoContrato:
          type: string
        fechaIngreso:
          type: string
        fechaVencimientoContrato:
          type: string
        sueldoBase:
          type: number
        valorHora:
          type: number
        horasMensuales:
          type: number
        estado:
          type: string
          readOnly: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        createdBy:
          type: string
          readOnly: true
      required:
        - edificioId
        - nombre
        - apellido
        - rut
        - telefono
        - cargo
        - tipoEmpleado
        - tipoContrato
        - fechaIngreso
    Proveedor:
      type: object
      description: Proveedores y contactos del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: proveedor
        edificioId:
          type: string
        nombreEmpresa:
          type: string
        razonSocial:
          type: string
        rut:
          type: string
        giro:
          type: string
        tiposServicio:
          type: array
          items: {}
        especialidad:
          type: string
        contactos:
          type: array
          items: {}
        direccion:
          type: string
        comuna:
          type: string
        ciudad:
          type: string
        sitioWeb:
          type: string
        tarifaHora:
          type: number
        tarifaMinima:
          type: number
        formaPago:
          type: string
        observaciones:
          type: string
        notasInternas:
          type: string
        estado:
          type: string
          readOnly: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        createdBy:
          type: string
          readOnly: true
      required:
        - edificioId
        - nombreEmpresa
        - rut
        - tiposServicio
        - contactos
    Consumo:
      type: object
      description: "Lecturas de luz, agua y gas por periodo."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: consumo
        edificioId:
          type: string
        periodo:
          type: string
        tipoConsumo:
          type: string
          enum:
            - luz
            - agua
            - gas
        detallesDepartamentos:
          type: array
          items: {}
        fechaLectura:
          type: string
        observaciones:
          type: string
        estado:
          type: string
          readOnly: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        createdBy:
          type: string
          readOnly: true
      required:
        - edificioId
        - periodo
        - tipoConsumo
        - detallesDepartamentos
    Mantencion:
      type: object
      description: Solicitudes y tickets de mantención.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: mantencion
        edificioId:
          type: string
        tipo:
          type: string
        titulo:
          type: string
        descripcion:
          type: string
        prioridad:
          type: string
          enum:
            - baja
            - media
            - alta
            - urgente
        departamentoId:
          type: string
        estado:
          type: string
          enum:
            - pendiente
            - en_progreso
            - completada
            - cancelada
        solicitanteId:
          type: string
          readOnly: true
        fechaSolicitud:
          type: string
          readOnly: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - tipo
        - titulo
        - descripcion
        - prioridad
    MultaDepartamento:
      type: object
      description: Multas aplicadas por departamento.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: multa_departamento
        edificioId:
          type: string
        departamentoId:
          type: string
        departamentoNumero:
          type: string
        tipoMultaId:
          type: string
        tipoMultaNombre:
          type: string
        concepto:
          type: string
        monto:
          type: number
        fechaMulta:
          type: string
        periodo:
          type: string
        observaciones:
          type: string
        estado:
          type: string
          readOnly: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - departamentoId
        - departamentoNumero
        - tipoMultaId
        - tipoMultaNombre
        - concepto
        - monto
        - fechaMulta
        - periodo
    Visita:
      type: object
      description: Registro de visitas y encomiendas.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: visita
        edificioId:
          type: string
        departamentoId:
          type: string
        departamentoNumero:
          type: string
        nombreVisitante:
          type: string
        rutVisitante:
          type: string
        residenteVisitado:
          type: string
        fechaHoraIngreso:
          type: string
        accesoAutorizado:
          type: boolean
        esEncomienda:
          type: boolean
        observaciones:
          type: string
        estado:
          type: string
          readOnly: true
        registradoPor:
          type: string
          readOnly: true
        registradoPorNombre:
          type: string
          readOnly: true
        createdAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - departamentoId
        - departamentoNumero
        - nombreVisitante
        - rutVisitante
        - residenteVisitado
        - fechaHoraIngreso
        - accesoAutorizado
    AreaComun:
      type: object
      description: Áreas comunes reservables del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: area_comun
        edificioId:
          type: string
        nombre:
          type: string
        tipo:
          type: string
        configuracion:
          type: object
          additionalProperties: true
        requiereReserva:
          type: boolean
        activo:
          type: boolean
        descripcion:
          type: string
        createdBy:
          type: string
          readOnly: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - nombre
        - tipo
        - configuracion
        - requiereReserva
        - activo
    Reserva:
      type: object
      description: Reservas de áreas comunes.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: reserva_area
        edificioId:
          type: string
        areaComunId:
          type: string
        departamentoId:
          type: string
        fechaInicio:
          type: string
        fechaFin:
          type: string
        estado:
          type: string
          enum:
            - pendiente
            - confirmada
            - cancelada
        observaciones:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - areaComunId
        - departamentoId
        - fechaInicio
        - fechaFin
    Reglamento:
      type: object
      description: Reglamentos internos de la comunidad.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: reglamento
        edificioId:
          type: string
        titulo:
          type: string
        contenido:
          type: string
        version:
          type: string
        vigenteDesde:
          type: string
        activo:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - contenido
    DocumentoLegal:
      type: object
      description: Documentos legales del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: documento_legal
        edificioId:
          type: string
        titulo:
          type: string
        tipoDocumento:
          type: string
        fechaDocumento:
          type: string
        archivoUrl:
          type: string
        descripcion:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - tipoDocumento
        - fechaDocumento
    AnuncioDiarioMural:
      type: object
      description: Anuncios del diario mural.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: anuncio_diario_mural
        edificioId:
          type: string
        titulo:
          type: string
        contenido:
          type: string
        fechaPublicacion:
          type: string
        fechaExpiracion:
          type: string
        prioridad:
          type: string
          enum:
            - baja
            - normal
            - alta
        activo:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - contenido
        - fechaPublicacion
    Comunicacion:
      type: object
      description: Comunicaciones enviadas a residentes.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: comunicacion
        edificioId:
          type: string
        asunto:
          type: string
        cuerpo:
          type: string
        canal:
          type: string
          enum:
            - email
            - push
            - sms
            - interno
        destinatarios:
          type: array
          items: {}
        fechaEnvio:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - asunto
        - cuerpo
    Ticket:
      type: object
      description: Tickets de soporte y atención.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: ticket
        edificioId:
          type: string
        titulo:
          type: string
        descripcion:
          type: string
        categoria:
          type: string
        prioridad:
          type: string
          enum:
            - baja
            - media
            - alta
            - urgente
        departamentoId:
          type: string
        estado:
          type: string
          enum:
            - abierto
            - en_progreso
            - resuelto
            - cerrado
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - descripcion
    Votacion:
      type: object
      description: Votaciones y asambleas de la comunidad.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: votacion
        edificioId:
          type: string
        titulo:
          type: string
        descripcion:
          type: string
        opciones:
          type: array
          items: {}
        fechaInicio:
          type: string
        fechaFin:
          type: string
        estado:
          type: string
          enum:
            - borrador
            - abierta
            - cerrada
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - opciones
        - fechaInicio
        - fechaFin
    ConvenioPago:
      type: object
      description: Convenios de pago por deuda.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: convenio_pago
        edificioId:
          type: string
        departamentoId:
          type: string
        montoTotal:
          type: number
        numeroCuotas:
          type: number
        fechaInicio:
          type: string
        estado:
          type: string
          enum:
            - activo
            - cumplido
            - incumplido
            - cancelado
        observaciones:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - departamentoId
        - montoTotal
        - numeroCuotas
        - fechaInicio
    Cotizacion:
      type: object
      description: Cotizaciones de proveedores.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: cotizacion
        edificioId:
          type: string
        proveedorId:
          type: string
        concepto:
          type: string
        monto:
          type: number
        fechaCotizacion:
          type: string
        validaHasta:
          type: string
        estado:
          type: string
          enum:
            - pendiente
            - aceptada
            - rechazada
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - proveedorId
        - concepto
        - monto
        - fechaCotizacion
    GrupoUnidades:
      type: object
      description: Grupos de unidades para prorrateo o cobro.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: grupo_unidades
        edificioId:
          type: string
        nombre:
          type: string
        descripcion:
          type: string
        departamentoIds:
          type: array
          items: {}
        activo:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - nombre
        - departamentoIds
    ItemInventario:
      type: object
      description: Inventario de bienes del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: item_inventario
        edificioId:
          type: string
        nombre:
          type: string
        categoria:
          type: string
        cantidad:
          type: number
        ubicacion:
          type: string
        estado:
          type: string
          enum:
            - disponible
            - en_uso
            - baja
        observaciones:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - nombre
        - cantidad
    SolicitudAprobacion:
      type: object
      description: Solicitudes de aprobación internas.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: solicitud_aprobacion
        edificioId:
          type: string
        titulo:
          type: string
        descripcion:
          type: string
        tipoSolicitud:
          type: string
        monto:
          type: number
        estado:
          type: string
          enum:
            - pendiente
            - aprobada
            - rechazada
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - descripcion
        - tipoSolicitud
    SeguroDepartamento:
      type: object
      description: Seguros por departamento.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: seguro_departamento
        edificioId:
          type: string
        departamentoId:
          type: string
        compania:
          type: string
        poliza:
          type: string
        vigenciaDesde:
          type: string
        vigenciaHasta:
          type: string
        montoCobertura:
          type: number
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - departamentoId
        - compania
        - poliza
        - vigenciaDesde
        - vigenciaHasta
    Siniestro:
      type: object
      description: Siniestros y reclamos de seguros.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: siniestro
        edificioId:
          type: string
        seguroId:
          type: string
        departamentoId:
          type: string
        descripcion:
          type: string
        fechaSiniestro:
          type: string
        montoEstimado:
          type: number
        estado:
          type: string
          enum:
            - abierto
            - en_proceso
            - cerrado
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - descripcion
        - fechaSiniestro
    PlanEmergencia:
      type: object
      description: Planes de emergencia del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: plan_emergencia
        edificioId:
          type: string
        titulo:
          type: string
        descripcion:
          type: string
        estado:
          type: string
        tiposEmergenciaCubiertos:
          type: array
          items: {}
        planos:
          type: array
          items: {}
        procedimientos:
          type: array
          items: {}
        contactos:
          type: array
          items: {}
        brigadas:
          type: array
          items: {}
        puntosEncuentro:
          type: array
          items: {}
        simulacros:
          type: array
          items: {}
        versionActual:
          type: string
        historialVersiones:
          type: array
          items: {}
        fechaVigenciaDesde:
          type: string
        fechaVigenciaHasta:
          type: string
        proximaRevision:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        creadoPor:
          type: string
          readOnly: true
        creadoPorNombre:
          type: string
          readOnly: true
        aprobadoPor:
          type: string
          readOnly: true
        aprobadoPorNombre:
          type: string
          readOnly: true
        fechaAprobacion:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - descripcion
    ProcedimientoInterno:
      type: object
      description: Procedimientos internos operativos.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: procedimiento_interno
        edificioId:
          type: string
        titulo:
          type: string
        categoria:
          type: string
        pasos:
          type: array
          items: {}
        responsable:
          type: string
        activo:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - pasos
    PagoEdificio:
      type: object
      description: Pagos del módulo Finanzas del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: pago_edificio
        edificioId:
          type: string
        concepto:
          type: string
        monto:
          type: number
        fechaPago:
          type: string
        metodoPago:
          type: string
        beneficiario:
          type: string
        egresoId:
          type: string
        observaciones:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - concepto
        - monto
        - fechaPago
        - metodoPago
    FondoReserva:
      type: object
      description: Fondos de reserva de la comunidad.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: fondo_reserva
        edificioId:
          type: string
        nombre:
          type: string
        descripcion:
          type: string
        saldo:
          type: number
        meta:
          type: number
        activo:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - nombre
        - saldo
    ConfiguracionEdificio:
      type: object
      description: "Parámetros de cobro, mora, notificaciones, firma y reglas del edificio."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: configuracion_edificio
        edificioId:
          type: string
        pais:
          type: string
        jurisdiccion:
          type: string
        estado:
          type: string
        provincia:
          type: string
        geo:
          type: object
          additionalProperties: true
        diaGeneracionGastos:
          type: number
        diaEmisionGastos:
          type: number
        diaCobroGastosComunes:
          type: number
        diaVencimiento:
          type: number
        moneda:
          type: string
        monedaProveedores:
          type: string
        valorUFActual:
          type: number
        valoresUF:
          type: array
          items: {}
        porcentajeMora:
          type: number
        porcentajeMulta:
          type: number
        diasGraciaMora:
          type: number
        diasGracia:
          type: number
        permitirPagoOnline:
          type: boolean
        notificacionesEmail:
          type: boolean
        notificacionesSMS:
          type: boolean
        informacionBancaria:
          type: string
        intereses:
          type: object
          additionalProperties: true
        fondoReserva:
          type: object
          additionalProperties: true
        fondosEspeciales:
          type: array
          items: {}
        torreSeguros:
          type: object
          additionalProperties: true
        seguroColectivo:
          type: object
          additionalProperties: true
        datosBancarios:
          type: object
          additionalProperties: true
        administrador:
          type: object
          additionalProperties: true
        firmaOficial:
          type: object
          additionalProperties: true
        firmaDigital:
          type: object
          additionalProperties: true
        pagoOnline:
          type: object
          additionalProperties: true
        recordatoriosConsumos:
          type: object
          additionalProperties: true
        tarifasServicios:
          type: object
          additionalProperties: true
        configuracionTickets:
          type: object
          additionalProperties: true
        configuracionMedidores:
          type: object
          additionalProperties: true
        configuracionSMS:
          type: object
          additionalProperties: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
    TipoMulta:
      type: object
      description: Catálogo de tipos de multa configurables por edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: tipo_multa
        edificioId:
          type: string
        nombre:
          type: string
        descripcion:
          type: string
        monto:
          type: number
        activo:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - nombre
    FinanzasConfig:
      type: object
      description: Categorías y subcategorías de egresos e ingresos del módulo Finanzas.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: finanzas_config
        edificioId:
          type: string
        egresos:
          type: array
          items: {}
        ingresos:
          type: array
          items: {}
        subcategoriasEgresos:
          type: array
          items: {}
        ocultasEgresos:
          type: array
          items: {}
        ocultasIngresos:
          type: array
          items: {}
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
    GastoDepartamento:
      type: object
      description: Prorrateo de gasto común por departamento/unidad.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: gasto_departamento
        edificioId:
          type: string
        gastoId:
          type: string
        departamentoId:
          type: string
        periodo:
          type: string
        montoTotal:
          type: number
        items:
          type: array
          items: {}
        estado:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - gastoId
        - departamentoId
        - periodo
        - montoTotal
    UserAssignment:
      type: object
      description: Vincula un usuario a un edificio/unidad con un rol.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: user_assignment
        userEmail:
          type: string
        edificioId:
          type: string
        departamentoId:
          type: string
        rol:
          type: string
        activo:
          type: boolean
        fechaAsignacion:
          type: string
        asignadoPor:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - userEmail
        - edificioId
        - rol
    RoleAssignment:
      type: object
      description: "RBAC por edificio: rol, permisos extra y exclusiones."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: role_assignment
        edificioId:
          type: string
        userEmail:
          type: string
        userName:
          type: string
        rol:
          type: string
        permissions:
          type: array
          items: {}
        excludedPermissions:
          type: array
          items: {}
        permissionGroups:
          type: array
          items: {}
        temporary:
          type: boolean
        expiresAt:
          type: string
        reason:
          type: string
        activo:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        assignedBy:
          type: string
          readOnly: true
        assignedByName:
          type: string
          readOnly: true
        assignedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - userEmail
        - rol
    PermissionGroup:
      type: object
      description: Grupos custom de permisos reutilizables por edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: permission_group
        edificioId:
          type: string
        nombre:
          type: string
        descripcion:
          type: string
        permisos:
          type: array
          items: {}
        activo:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - nombre
        - permisos
    UserPermissions:
      type: object
      description: Permisos extra otorgados a un usuario en un edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: user_permissions
        userEmail:
          type: string
        edificioId:
          type: string
        permisosAdicionales:
          type: array
          items: {}
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - userEmail
        - edificioId
        - permisosAdicionales
    Turno:
      type: object
      description: "Turnos de personal: fecha, horario y empleados asignados."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: turno
        edificioId:
          type: string
        fecha:
          type: string
        horaInicio:
          type: string
        horaFin:
          type: string
        tipoTurno:
          type: string
        empleados:
          type: array
          items: {}
        estado:
          type: string
        observaciones:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        creadoPor:
          type: string
          readOnly: true
        creadoPorNombre:
          type: string
          readOnly: true
      required:
        - edificioId
        - fecha
        - horaInicio
        - horaFin
        - tipoTurno
        - empleados
    Tarea:
      type: object
      description: "Tareas de planificación operativas, opcionales a un turno."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: tarea
        edificioId:
          type: string
        titulo:
          type: string
        descripcion:
          type: string
        tipoTarea:
          type: string
        frecuencia:
          type: string
        turnoId:
          type: string
        estado:
          type: string
        asignadaATurno:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
    MiembroComite:
      type: object
      description: Integrantes del comité de administración del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: miembro_comite
        edificioId:
          type: string
        usuarioId:
          type: string
        usuarioEmail:
          type: string
        usuarioNombre:
          type: string
        nombre:
          type: string
        apellido:
          type: string
        cargo:
          type: string
        rut:
          type: string
        unidad:
          type: string
        email:
          type: string
        telefono:
          type: string
        fechaInicio:
          type: string
        fechaFin:
          type: string
        activo:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - cargo
    ReunionComite:
      type: object
      description: Reuniones programadas del comité con orden del día.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: reunion_comite
        edificioId:
          type: string
        titulo:
          type: string
        fechaProgramada:
          type: string
        horaInicio:
          type: string
        estado:
          type: string
        ordenDelDia:
          type: array
          items: {}
        asistentesReales:
          type: array
          items: {}
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - fechaProgramada
    ActaComite:
      type: object
      description: Actas formales asociadas a reuniones de comité.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: acta_comite
        edificioId:
          type: string
        reunionId:
          type: string
        titulo:
          type: string
        numeroActa:
          type: string
        contenidoHtml:
          type: string
        datos:
          type: object
          additionalProperties: true
        estado:
          type: string
        firmasRequeridas:
          type: array
          items: {}
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - reunionId
        - titulo
    PlusvaliaConfig:
      type: object
      description: Factores y orientación para el índice de plusvalía del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: plusvalia_config
        edificioId:
          type: string
        orientacionEdificio:
          type: string
        factores:
          type: array
          items: {}
        orientacionUnidades:
          type: object
          additionalProperties: true
        geo:
          type: object
          additionalProperties: true
        fuentesExternas:
          type: array
          items: {}
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
    PlusvaliaSnapshot:
      type: object
      description: Snapshots periódicos del índice de plusvalía.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: plusvalia_snapshot
        edificioId:
          type: string
        periodo:
          type: string
        fecha:
          type: string
        indicePromedio:
          type: number
        config:
          type: object
          additionalProperties: true
        detalle:
          type: object
          additionalProperties: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - periodo
        - fecha
    Transparencia:
      type: object
      description: "Portal de transparencia comunitaria (lectura agregada de finanzas, comité y seguros)."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: transparencia_vista
        edificioId:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        gastos:
          type: string
          readOnly: true
        egresos:
          type: string
          readOnly: true
        aprobaciones:
          type: string
          readOnly: true
        reuniones:
          type: string
          readOnly: true
        actas:
          type: string
          readOnly: true
        procedimientos:
          type: string
          readOnly: true
      required:
        - edificioId
    Reporte:
      type: object
      description: "Reportes financieros, de morosidad, mantenciones y ocupación."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: reporte_financiero
        edificioId:
          type: string
        tipo:
          type: string
        periodo:
          type: string
        parametros:
          type: object
          additionalProperties: true
        formato:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        generadoPor:
          type: string
          readOnly: true
        generadoEn:
          type: string
          readOnly: true
        resultado:
          type: string
          readOnly: true
      required:
        - edificioId
        - tipo
        - periodo
    ReservaEstacionamientoVisita:
      type: object
      description: Reservas de estacionamiento para visitas.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: reserva_estacionamiento_visita
        edificioId:
          type: string
        departamentoId:
          type: string
        nombreVisitante:
          type: string
        patenteVehiculo:
          type: string
        fechaHoraVisita:
          type: string
        estacionamientoReservado:
          type: string
        estado:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - departamentoId
        - nombreVisitante
        - fechaHoraVisita
    ActivityLog:
      type: object
      description: Auditoría de acciones de usuarios en el edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: activity_log
        edificioId:
          type: string
        activityType:
          type: string
        category:
          type: string
        description:
          type: string
        userEmail:
          type: string
        details:
          type: object
          additionalProperties: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - activityType
        - description
    MonitoreoEquipo:
      type: object
      description: Configuración del agente de monitoreo en equipos del personal.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: monitoreo_agente_config
        edificioId:
          type: string
        plantilla:
          type: string
        rolesAplicacion:
          type: array
          items: {}
        controlAplicaciones:
          type: object
          additionalProperties: true
        filtradoWeb:
          type: object
          additionalProperties: true
        dispositivosUsb:
          type: object
          additionalProperties: true
        auditoriaSesion:
          type: object
          additionalProperties: true
        activo:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
    CotizacionSeguro:
      type: object
      description: Cotizaciones rápidas de seguros del edificio (distinto de cotizaciones a proveedores).
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: cotizacion_seguro
        edificioId:
          type: string
        titulo:
          type: string
        tipoSeguro:
          type: string
        estado:
          type: string
        propuestas:
          type: array
          items: {}
        asesoria:
          type: object
          additionalProperties: true
        montoAseguradoEstimado:
          type: number
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - tipoSeguro
    RegistroHoras:
      type: object
      description: Horas trabajadas por empleado y periodo.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: registro_horas
        edificioId:
          type: string
        empleadoId:
          type: string
        periodo:
          type: string
        fecha:
          type: string
        horasTrabajadas:
          type: number
        aprobado:
          type: boolean
        observaciones:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - empleadoId
        - periodo
        - fecha
        - horasTrabajadas
    PagoEmpleado:
      type: object
      description: Liquidaciones y pagos de personal.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: pago_empleado
        edificioId:
          type: string
        empleadoId:
          type: string
        periodo:
          type: string
        montoTotal:
          type: number
        estado:
          type: string
        fechaPago:
          type: string
        metodoPago:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - empleadoId
        - periodo
        - montoTotal
    MantencionPeriodica:
      type: object
      description: Planes de mantención recurrentes del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: mantencion_periodica
        edificioId:
          type: string
        titulo:
          type: string
        frecuencia:
          type: string
        proveedorId:
          type: string
        estado:
          type: string
        proximaEjecucion:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - titulo
        - frecuencia
    ProcedimientoEjecucion:
      type: object
      description: Instancias de ejecución de procedimientos internos.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: procedimiento_ejecucion
        edificioId:
          type: string
        procedimientoId:
          type: string
        estado:
          type: string
        pasosCompletados:
          type: array
          items: {}
        responsable:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - procedimientoId
        - estado
    Invitacion:
      type: object
      description: Invitaciones pendientes a usuarios del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: invitacion_pendiente
        edificioId:
          type: string
        email:
          type: string
        rol:
          type: string
        departamentoId:
          type: string
        mensaje:
          type: string
        estado:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        token:
          type: string
          readOnly: true
        enviadoEn:
          type: string
          readOnly: true
        expiraEn:
          type: string
          readOnly: true
      required:
        - edificioId
        - email
        - rol
    CentroDatos:
      type: object
      description: Cargas e importaciones masivas de datos históricos del edificio.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: datos_historicos
        edificioId:
          type: string
        hoja:
          type: string
        datos:
          type: array
          items: {}
        fuente:
          type: string
        fechaCarga:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - hoja
        - datos
    Finanzas:
      type: object
      description: "Vista agregada del módulo Finanzas (egresos, ingresos y tesorería)."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: egreso
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
    ChatThread:
      type: object
      description: Chat entre residentes y administración (hilos y mensajes del edificio).
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: chat_thread
        edificioId:
          type: string
        participants:
          type: array
          items: {}
        kind:
          type: string
          enum:
            - direct
            - group
        title:
          type: string
        body:
          type: string
        fromEmail:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        lastMessageAt:
          type: string
          readOnly: true
        lastMessagePreview:
          type: string
          readOnly: true
        lastReadAt:
          type: string
          readOnly: true
      required:
        - edificioId
        - participants
    ReporteAnualGestion:
      type: object
      description: "Reporte anual con checklist, slides, comentarios y exportación PPTX."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: reporte_anual_gestion
        edificioId:
          type: string
        anio:
          type: number
        estado:
          type: string
          enum:
            - borrador
            - en_revision
            - presentado
        checklist:
          type: array
          items: {}
        secciones:
          type: array
          items: {}
        comentarios:
          type: array
          items: {}
        notasAdmin:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        progreso:
          type: string
          readOnly: true
        datos:
          type: string
          readOnly: true
        pptxGeneradoEn:
          type: string
          readOnly: true
        actualizadoEn:
          type: string
          readOnly: true
        creadoEn:
          type: string
          readOnly: true
      required:
        - edificioId
        - anio
    PersonalReserva:
      type: object
      description: Personal de reserva compartido entre edificios (comunidesk_transversal).
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: personal_reserva
        nombre:
          type: string
        apellido:
          type: string
        rut:
          type: string
        tipo:
          type: string
        telefono:
          type: string
        email:
          type: string
        disponible:
          type: boolean
        estado:
          type: string
          enum:
            - activo
            - inactivo
            - suspendido
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        tipo_doc:
          type: string
          readOnly: true
        creadoPor:
          type: string
          readOnly: true
        rbacUsers:
          type: string
          readOnly: true
      required:
        - nombre
        - apellido
        - rut
        - tipo
    MiembroEquipo:
      type: object
      description: Miembros del equipo de soporte transversal con permisos por rol.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: equipo_soporte
        nombre:
          type: string
        apellido:
          type: string
        email:
          type: string
        rol:
          type: string
        activo:
          type: boolean
        edificiosAsignados:
          type: array
          items: {}
        permisos:
          type: object
          additionalProperties: true
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        tipo_doc:
          type: string
          readOnly: true
        creadoPor:
          type: string
          readOnly: true
        estadisticas:
          type: string
          readOnly: true
      required:
        - nombre
        - apellido
        - email
        - rol
    AsignacionTransversal:
      type: object
      description: Asignaciones de personal titular y reemplazo entre edificios.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: asignacion
        edificioId:
          type: string
        personalTitularId:
          type: string
        personalReemplazoId:
          type: string
        motivoReemplazo:
          type: string
        fechaInicio:
          type: string
        fechaFin:
          type: string
        estado:
          type: string
          enum:
            - activa
            - proxima
            - finalizada
            - cancelada
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        tipo_doc:
          type: string
          readOnly: true
        creadoPor:
          type: string
          readOnly: true
        egresoFinanzasId:
          type: string
          readOnly: true
      required:
        - edificioId
        - personalTitularId
        - fechaInicio
        - fechaFin
    EgresoExclusionGastoComun:
      type: object
      description: Postergación de cobro de egresos/cuotas en el gasto común mensual.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: egreso_exclusion_gasto_comun
        edificioId:
          type: string
        periodoExcluido:
          type: string
        periodoDestino:
          type: string
        egresoId:
          type: string
        cuotaId:
          type: string
        concepto:
          type: string
        monto:
          type: number
        esCuota:
          type: boolean
        motivo:
          type: string
        estado:
          type: string
          enum:
            - pendiente
            - integrado
            - cancelado
        integradoEnPeriodo:
          type: string
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        excluidoPor:
          type: string
          readOnly: true
        excluidoPorNombre:
          type: string
          readOnly: true
        excluidoAt:
          type: string
          readOnly: true
        integradoAt:
          type: string
          readOnly: true
        integradoPor:
          type: string
          readOnly: true
      required:
        - edificioId
        - periodoExcluido
        - egresoId
        - concepto
        - monto
        - esCuota
    ConciliacionBancaria:
      type: object
      description: "Conciliación de movimientos bancarios con gastos comunes, egresos e ingresos."
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: conciliacion_bancaria
        edificioId:
          type: string
        transaccionId:
          type: string
        fecha:
          type: string
        descripcion:
          type: string
        monto:
          type: number
        periodo:
          type: string
        tipoConciliacion:
          type: string
        comentarios:
          type: string
        unidadId:
          type: string
        unidadNumero:
          type: string
        tipoUnidad:
          type: string
        gastoComunId:
          type: string
        departamentoId:
          type: string
        departamentoNumero:
          type: string
        egresoId:
          type: string
        ingresoId:
          type: string
        concepto:
          type: string
        egresoCreado:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        conciliadoPor:
          type: string
          readOnly: true
        conciliadoEn:
          type: string
          readOnly: true
      required:
        - edificioId
        - transaccionId
        - fecha
        - descripcion
        - monto
        - tipoConciliacion
    MovimientoBancario:
      type: object
      description: Movimientos importados de cartola bancaria y su estado de conciliación.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: movimiento_bancario
        edificioId:
          type: string
        transaccionId:
          type: string
        fecha:
          type: string
        descripcion:
          type: string
        monto:
          type: number
        periodo:
          type: string
        mapeoAutomatico:
          type: string
        confianzaMapeo:
          type: number
        conciliado:
          type: boolean
        conciliacionId:
          type: string
        conciliacionDetalle:
          type: object
          additionalProperties: true
        conciliadoEn:
          type: string
        duplicado:
          type: boolean
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        cargadoPor:
          type: string
          readOnly: true
        cargadoEn:
          type: string
          readOnly: true
      required:
        - edificioId
        - transaccionId
        - fecha
        - descripcion
        - monto
    CargaCartola:
      type: object
      description: Historial de importaciones de cartola bancaria.
      properties:
        _id:
          type: string
        _rev:
          type: string
        type:
          type: string
          const: carga_cartola
        edificioId:
          type: string
        nombreArchivo:
          type: string
        periodo:
          type: string
        resumen:
          type: object
          additionalProperties: true
        rangoFechas:
          type: object
          additionalProperties: true
        movimientosIds:
          type: array
          items: {}
        movimientosData:
          type: array
          items: {}
        createdAt:
          type: string
          readOnly: true
        updatedAt:
          type: string
          readOnly: true
        cargadoPor:
          type: string
          readOnly: true
        cargadoPorNombre:
          type: string
          readOnly: true
        fechaCarga:
          type: string
          readOnly: true
      required:
        - edificioId
        - nombreArchivo
        - periodo
        - resumen
        - rangoFechas
    OAuthScopes:
      type: string
      enum:
        - "comunidesk:read"
        - "comunidesk:write"
        - "files:pdf"
        - "files:excel"
        - "ai:models"
        - "ai:chat"
        - "ai:extract"
        - "ai:web"
        - "flex-pro:manage"
        - "flex-pro:runtime"
        - "flex-pro:marketplace"
      description: Scopes OAuth soportados por el gateway.
security:
  - OAuth2App: []
    ComunideskUser: []