Idea:
  type: object
  properties:
    id:
      type: string
    title:
      type: string
    titleAr:
      type: string
    description:
      type: string
    category:
      type: string
    source:
      type: string
    status:
      type: string
    module:
      type: string
    moderationStatus:
      type: string
      enum:
        - pending
        - approved
        - rejected
    visibility:
      type: string
      enum:
        - private
        - published
    votes:
      type: integer
    officialUpdate:
      type: string
    effortScore:
      type: number
    benefitScore:
      type: number
    priorityScore:
      type: number
    priorityBand:
      type: string
    internalTags:
      type: array
      items:
        type: string
    rejectionReason:
      type: string
    publishedAt:
      type:
        - string
        - 'null'
      format: date-time
    updatedAt:
      type: string
      format: date-time
Journey:
  type: object
  properties:
    id:
      type: string
      format: uuid
    titleEn:
      type: string
    titleAr:
      type: string
    publishedVersionId:
      type:
        - string
        - 'null'
      format: uuid
    pairId:
      type:
        - string
        - 'null'
      format: uuid
    pairVariant:
      type:
        - string
        - 'null'
    createdAt:
      type: string
      format: date-time
    updatedAt:
      type: string
      format: date-time
Survey:
  type: object
  properties:
    id:
      type: string
      format: uuid
    name:
      type: string
    nameAr:
      type: string
    team:
      type: string
    createdBy:
      type: string
    status:
      type: string
      enum:
        - draft
        - published
        - archived
    themeLogoUrl:
      type: string
    themePrimaryColor:
      type: string
    targetingRules:
      type: object
      properties: {}
    designId:
      type:
        - string
        - 'null'
      format: uuid
    currentVersionId:
      type:
        - string
        - 'null'
      format: uuid
    createdAt:
      type: string
      format: date-time
    updatedAt:
      type: string
      format: date-time
Error:
  type: object
  properties:
    ok:
      type: boolean
      example: false
    error:
      type: string
      example: invalid_body
    message:
      type: string
IdeaMutation:
  type: object
  properties:
    id:
      type: string
    title_en:
      type: string
    description:
      type: string
    status:
      type: string
    module:
      type: string
    votes:
      type: integer
    updated_at:
      type: string
      format: date-time
JourneyMutation:
  type: object
  properties:
    id:
      type: string
      format: uuid
    title_en:
      type: string
    title_ar:
      type: string
    created_at:
      type: string
      format: date-time
    updated_at:
      type: string
      format: date-time
SopWriteBody:
  type: object
  required:
    - ticketDescription
    - infoToCollect
    - actionsToTakeFrontline
    - ticketOwner
    - actionsToTakeOwner
    - caseType
    - accountableTeam
    - closureApproval
  description: >-
    At least one of titleEn/titleAr is required. escalationLevel1 is required except for inquiry. Directory
    references come from GET /sops/directory. PUT replaces editable content, not a partial patch. Legacy
    user/role references remain accepted by the service.
  properties:
    titleEn:
      type: string
      example: Customer refund review
    titleAr:
      type: string
      example: ''
    ticketDescription:
      type: string
      minLength: 30
      example: Review the customer's refund request and verify the original payment details.
    infoToCollect:
      type: array
      minItems: 1
      items:
        oneOf:
          - type: string
          - type: object
            properties:
              text:
                type: string
              children:
                type: array
                items:
                  type: string
      example:
        - Verify the customer details
    actionsToTakeFrontline:
      type: array
      minItems: 1
      items:
        oneOf:
          - type: string
          - type: object
            properties:
              text:
                type: string
              children:
                type: array
                items:
                  type: string
      example:
        - Verify the customer details
    ticketOwner:
      type: object
      required:
        - kind
        - id
        - label
      properties:
        kind:
          type: string
          enum:
            - person
            - team
        id:
          type: string
        label:
          type: string
      example:
        kind: person
        id: replace-with-directory-id
        label: Directory member
    actionsToTakeOwner:
      type: array
      minItems: 1
      items:
        oneOf:
          - type: string
          - type: object
            properties:
              text:
                type: string
              children:
                type: array
                items:
                  type: string
      example:
        - Verify the customer details
    caseType:
      type: string
      enum:
        - complaint
        - inquiry
        - suggestion
        - request
        - internal_ticket
      example: complaint
    priority:
      type: string
      enum:
        - low
        - medium
        - high
      default: medium
    slaValue:
      type: integer
      minimum: 1
      maximum: 2147483647
      default: 24
    slaUnit:
      type: string
      enum:
        - hours
        - days
      default: hours
    accountableTeam:
      type: object
      required:
        - kind
        - id
        - label
      properties:
        kind:
          type: string
          enum:
            - person
            - team
        id:
          type: string
        label:
          type: string
      example:
        kind: team
        id: replace-with-directory-id
        label: Support
    escalationLevel1:
      type: object
      required:
        - kind
        - id
        - label
      properties:
        kind:
          type: string
          enum:
            - person
            - team
        id:
          type: string
        label:
          type: string
      example:
        kind: person
        id: replace-with-directory-id
        label: Directory member
    escalationLevel2:
      type: object
      required:
        - kind
        - id
        - label
      properties:
        kind:
          type: string
          enum:
            - person
            - team
        id:
          type: string
        label:
          type: string
      example:
        kind: person
        id: replace-with-directory-id
        label: Directory member
    closureApproval:
      type: object
      required:
        - kind
        - id
        - label
      properties:
        kind:
          type: string
          enum:
            - person
            - team
        id:
          type: string
        label:
          type: string
      example:
        kind: person
        id: replace-with-directory-id
        label: Directory member
    department:
      type: string
      enum:
        - ''
        - cx
        - tech_support
        - csm
        - sales
        - pm
        - management
      default: tech_support
    notifyOnCreation:
      type: array
      items:
        type: object
        required:
          - kind
          - id
          - label
        properties:
          kind:
            type: string
            enum:
              - person
              - team
          id:
            type: string
          label:
            type: string
        example:
          kind: person
          id: replace-with-directory-id
          label: Directory member
      example: []
    ticketCategory:
      type: object
      properties:
        l1:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
            label:
              type: string
        l2:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
            label:
              type: string
        l3:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
            label:
              type: string
      example:
        l1: null
        l2: null
        l3: null
    smsNotifications:
      type: array
      items:
        type: string
        enum:
          - open
          - delay
          - resolution
      example: []
    followUpCall:
      type: boolean
      default: false
    csatSurvey:
      type: boolean
      default: false
    notes:
      type: string
      example: ''
Sop:
  type: object
  properties:
    id:
      type: string
      format: uuid
    serial:
      type: string
      example: TS-0001
    status:
      type: string
      enum:
        - draft
        - under_review
        - published
      example: draft
    titleEn:
      type: string
      example: Customer refund review
    titleAr:
      type: string
      example: ''
    ticketDescription:
      type: string
      minLength: 30
      example: Review the customer's refund request and verify the original payment details.
    infoToCollect:
      type: array
      minItems: 1
      items:
        oneOf:
          - type: string
          - type: object
            properties:
              text:
                type: string
              children:
                type: array
                items:
                  type: string
      example:
        - Verify the customer details
    actionsToTakeFrontline:
      type: array
      minItems: 1
      items:
        oneOf:
          - type: string
          - type: object
            properties:
              text:
                type: string
              children:
                type: array
                items:
                  type: string
      example:
        - Verify the customer details
    ticketOwner:
      type: object
      required:
        - kind
        - id
        - label
      properties:
        kind:
          type: string
          enum:
            - person
            - team
        id:
          type: string
        label:
          type: string
      example:
        kind: person
        id: replace-with-directory-id
        label: Directory member
    actionsToTakeOwner:
      type: array
      minItems: 1
      items:
        oneOf:
          - type: string
          - type: object
            properties:
              text:
                type: string
              children:
                type: array
                items:
                  type: string
      example:
        - Verify the customer details
    caseType:
      type: string
      enum:
        - complaint
        - inquiry
        - suggestion
        - request
        - internal_ticket
      example: complaint
    priority:
      type: string
      enum:
        - low
        - medium
        - high
      default: medium
    slaValue:
      type: integer
      minimum: 1
      maximum: 2147483647
      default: 24
    slaUnit:
      type: string
      enum:
        - hours
        - days
      default: hours
    accountableTeam:
      type: object
      required:
        - kind
        - id
        - label
      properties:
        kind:
          type: string
          enum:
            - person
            - team
        id:
          type: string
        label:
          type: string
      example:
        kind: team
        id: replace-with-directory-id
        label: Support
    escalationLevel1:
      type: object
      required:
        - kind
        - id
        - label
      properties:
        kind:
          type: string
          enum:
            - person
            - team
        id:
          type: string
        label:
          type: string
      example:
        kind: person
        id: replace-with-directory-id
        label: Directory member
    escalationLevel2:
      type: object
      required:
        - kind
        - id
        - label
      properties:
        kind:
          type: string
          enum:
            - person
            - team
        id:
          type: string
        label:
          type: string
      example:
        kind: person
        id: replace-with-directory-id
        label: Directory member
    closureApproval:
      type: object
      required:
        - kind
        - id
        - label
      properties:
        kind:
          type: string
          enum:
            - person
            - team
        id:
          type: string
        label:
          type: string
      example:
        kind: person
        id: replace-with-directory-id
        label: Directory member
    department:
      type: string
      enum:
        - ''
        - cx
        - tech_support
        - csm
        - sales
        - pm
        - management
      default: tech_support
    notifyOnCreation:
      type: array
      items:
        type: object
        required:
          - kind
          - id
          - label
        properties:
          kind:
            type: string
            enum:
              - person
              - team
          id:
            type: string
          label:
            type: string
        example:
          kind: person
          id: replace-with-directory-id
          label: Directory member
      example: []
    ticketCategory:
      type: object
      properties:
        l1:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
            label:
              type: string
        l2:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
            label:
              type: string
        l3:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
            label:
              type: string
      example:
        l1: null
        l2: null
        l3: null
    smsNotifications:
      type: array
      items:
        type: string
        enum:
          - open
          - delay
          - resolution
      example: []
    followUpCall:
      type: boolean
      default: false
    csatSurvey:
      type: boolean
      default: false
    notes:
      type: string
      example: ''
    createdBy:
      type: string
    createdAt:
      type: string
      format: date-time
    updatedAt:
      type: string
      format: date-time
    localization:
      type: object
      additionalProperties: true
Webhook:
  type: object
  properties:
    id:
      type: string
      format: uuid
    name:
      type: string
      example: Idea notifications
    url:
      type: string
      format: uri
      example: https://receiver.example.com/webhooks/lumi
    secretPrefix:
      type: string
      example: whsec_EXAMPLE
    authenticationConfigured:
      type: boolean
      example: true
    events:
      type: array
      items:
        type: string
        enum:
          - idea.submitted
          - idea.published
          - idea.status_changed
          - idea.official_update_added
          - idea.comment_added
          - idea.voted
          - idea.followed
    enabled:
      type: boolean
    createdAt:
      type: string
      format: date-time
    updatedAt:
      type: string
      format: date-time
WebhookWrite:
  type: object
  required:
    - url
    - events
  properties:
    id:
      type: string
      format: uuid
      description: Include to update a webhook in this workspace; omit to create.
    name:
      type: string
      maxLength: 120
      default: Webhook
    url:
      type: string
      format: uri
      description: Public HTTPS endpoint. Private addresses and redirects are rejected.
    events:
      type: array
      minItems: 1
      uniqueItems: true
      items:
        type: string
        enum:
          - idea.submitted
          - idea.published
          - idea.status_changed
          - idea.official_update_added
          - idea.comment_added
          - idea.voted
          - idea.followed
    enabled:
      type: boolean
      default: false
      description: >-
        Creation, URL changes and secret rotation disable delivery. Set true in a later update after
        configuring the receiver.
  example:
    name: Idea notifications
    url: https://receiver.example.com/webhooks/lumi
    events:
      - idea.published
    enabled: false
Pagination:
  type: object
  properties:
    limit:
      type: integer
    offset:
      type: integer
    total:
      type: integer
    hasMore:
      type: boolean
  required:
    - limit
    - offset
    - total
    - hasMore
  example:
    limit: 25
    offset: 0
    total: 1
    hasMore: false
IdeaWrite:
  type: object
  properties:
    title:
      type: string
      maxLength: 160
    titleAr:
      type: string
      maxLength: 160
    description:
      type: string
      maxLength: 4000
    status:
      type: string
      maxLength: 100
      description: Configured status value from /ideas/labels.
    module:
      type: string
      maxLength: 100
      description: Configured module value from /ideas/labels.
  required:
    - title
  example:
    title: Improve the onboarding guide
    description: Add a checklist for the first setup.
IdeaPublication:
  type: object
  properties:
    moderationStatus:
      type: string
      enum:
        - pending
        - approved
        - rejected
    visibility:
      type: string
      enum:
        - private
        - published
    officialUpdate:
      type: string
      maxLength: 2000
    category:
      type: string
    module:
      type: string
    status:
      type: string
    effortScore:
      type: number
      minimum: 1
      maximum: 5
    benefitScore:
      type: number
      minimum: 1
      maximum: 5
    internalTags:
      type: array
      items:
        type: string
    rejectionReason:
      type: string
KbLink:
  type: object
  properties:
    start:
      type: integer
    end:
      type: integer
    url:
      type: string
KbBlock:
  type: object
  properties:
    type:
      type: string
      enum:
        - heading1
        - heading2
        - heading3
        - paragraph
        - listItem
        - note
        - callout
        - image
        - video
        - file
        - table
        - divider
        - unsupported
    text:
      type: string
    html:
      type: string
    note:
      type: string
    dir:
      type: string
      enum:
        - ltr
        - rtl
    src:
      type: string
    url:
      type: string
    alt:
      type: string
    mediaType:
      type: string
      enum:
        - image
        - video
        - file
    links:
      type: array
      items:
        $ref: '#/KbLink'
    rows:
      type: array
      items:
        type: array
        items:
          type: object
          properties:
            text:
              type: string
            links:
              type: array
              items:
                $ref: '#/KbLink'
            images:
              type: array
              items:
                type: string
  required:
    - type
  example:
    type: paragraph
    text: Follow these steps to get started.
KbCategory:
  type: object
  properties:
    id:
      type: string
      format: uuid
    parentId:
      type:
        - string
        - 'null'
      format: uuid
    nameEn:
      type: string
    nameAr:
      type: string
    slug:
      type: string
    icon:
      type: string
    sortOrder:
      type: integer
    active:
      type: boolean
    articleCount:
      type: integer
    children:
      type: array
      items:
        $ref: '#/KbCategory'
      example: []
KbCategoryWrite:
  type: object
  properties:
    parentId:
      type:
        - string
        - 'null'
      format: uuid
    nameEn:
      type: string
      maxLength: 160
    nameAr:
      type: string
      maxLength: 160
    slug:
      type: string
    icon:
      type: string
    sortOrder:
      type: integer
    active:
      type: boolean
  example:
    nameEn: Getting started
    nameAr: البدء
    active: true
KbArticleWrite:
  type: object
  properties:
    categoryId:
      type:
        - string
        - 'null'
      format: uuid
    titleEn:
      type: string
      maxLength: 240
    titleAr:
      type: string
      maxLength: 240
    summaryEn:
      type: string
      maxLength: 600
    summaryAr:
      type: string
      maxLength: 600
    contentBlocksEn:
      type: array
      items:
        $ref: '#/KbBlock'
      maxItems: 500
    contentBlocksAr:
      type: array
      items:
        $ref: '#/KbBlock'
      maxItems: 500
    active:
      type: boolean
    revision:
      type: integer
      minimum: 1
      description: Required for edits; use the latest revision returned by GET.
  example:
    titleEn: Welcome guide
    contentBlocksEn:
      - type: paragraph
        text: Follow these steps to get started.
    active: true
KbArticle:
  type: object
  properties:
    categoryId:
      type:
        - string
        - 'null'
      format: uuid
    titleEn:
      type: string
      maxLength: 240
    titleAr:
      type: string
      maxLength: 240
    summaryEn:
      type: string
      maxLength: 600
    summaryAr:
      type: string
      maxLength: 600
    contentBlocksEn:
      type: array
      items:
        $ref: '#/KbBlock'
      maxItems: 500
    contentBlocksAr:
      type: array
      items:
        $ref: '#/KbBlock'
      maxItems: 500
    active:
      type: boolean
    revision:
      type: integer
    id:
      type: string
      format: uuid
    status:
      type: string
      enum:
        - draft
        - published
        - archived
    contentBlocks:
      type: array
      items:
        $ref: '#/KbBlock'
    createdBy:
      type: string
    updatedBy:
      type: string
    publishedAt:
      type:
        - string
        - 'null'
      format: date-time
    updatedAt:
      type: string
      format: date-time
    openCount30d:
      type: integer
    openCountAll:
      type: integer
JourneyContent:
  type: object
  description: >-
    Complete macro (schema: 2) or micro (schema: micro-v1) document. Read-modify-write the returned document
    to retain all fields. Micro content includes scenarios, step messages, choices, connector rules, timing
    and support documents.
  properties:
    schema:
      oneOf:
        - type: integer
          const: 2
        - type: string
          const: micro-v1
    schemaRevision:
      type: integer
    stages:
      type: array
      items:
        type: object
        properties:
          id:
            type: string
          titleEn:
            type: string
          titleAr:
            type: string
          microJourneyPairs:
            type: array
            items:
              type: object
              properties:
                pairId:
                  type: string
                  format: uuid
                titleEn:
                  type: string
                titleAr:
                  type: string
    rows:
      type: array
      items:
        type: object
        properties: {}
    cells:
      type: object
      properties: {}
    steps:
      type: array
      items:
        type: object
        properties:
          id:
            type: string
          titleEn:
            type: string
          titleAr:
            type: string
          descEn:
            type: string
          descAr:
            type: string
          channelIcon:
            type:
              - string
              - 'null'
            enum:
              - whatsapp
              - web
              - app
              - email
              - null
          channelMessageEn:
            type: string
          channelMessageAr:
            type: string
          kind:
            type: string
            enum:
              - message
              - question
              - manual
              - customer
              - action
          waitDays:
            type: number
          noteEn:
            type: string
          noteAr:
            type: string
          ownerTeams:
            type: array
            items:
              type: object
              properties:
                id:
                  type: string
                label:
                  type: string
          order:
            type: integer
    connectors:
      type: array
      items:
        type: object
        properties:
          id:
            type: string
          fromId:
            type: string
          toId:
            type: string
          labelEn:
            type: string
          labelAr:
            type: string
          arrow:
            type: string
            enum:
              - end
              - both
              - none
          customerReply:
            type: boolean
          scenarioIds:
            type: array
            items:
              type: string
    scenarios:
      type: array
      items:
        type: object
        properties:
          id:
            type: string
          labelEn:
            type: string
          labelAr:
            type: string
          color:
            type: string
    supportDocuments:
      type: array
      items:
        type: object
        properties: {}
  additionalProperties: true
  example:
    schema: 2
    stages:
      - id: onboarding
        titleEn: Onboarding
        titleAr: ''
        microJourneyPairs: []
    rows: []
    cells: {}
JourneyVersion:
  type: object
  properties:
    id:
      type: string
      format: uuid
    journeyId:
      type: string
      format: uuid
    label:
      type: string
    parentVersionId:
      type:
        - string
        - 'null'
      format: uuid
    content:
      $ref: '#/JourneyContent'
    createdBy:
      type: string
    createdAt:
      type: string
      format: date-time
    updatedAt:
      type: string
      format: date-time
    publishedAt:
      type:
        - string
        - 'null'
      format: date-time
    revision:
      type: integer
    sourceRevision:
      type:
        - integer
        - 'null'
    legacyOrigin:
      type:
        - string
        - 'null'
    diagnostics:
      type: array
      items:
        type: object
        properties:
          severity:
            type: string
          message:
            type: string
JourneyVersionWrite:
  type: object
  properties:
    content:
      $ref: '#/JourneyContent'
    versionId:
      type: string
      format: uuid
    parentVersionId:
      type: string
      format: uuid
    label:
      type: string
      maxLength: 120
    expectedRevision:
      type: integer
      minimum: 1
    contentContractVersion:
      type: integer
      const: 2
    requestId:
      type: string
      format: uuid
      description: >-
        Unique request identifier required for enhanced creation/restoration; reuse only for retrying the
        identical request.
    allowStaleSource:
      type: boolean
  required:
    - content
  example:
    label: Version 2
    content:
      schema: 2
      stages:
        - id: onboarding
          titleEn: Onboarding
          titleAr: ''
          microJourneyPairs: []
      rows: []
      cells: {}
JourneyPublish:
  type: object
  properties:
    expectedRevision:
      type: integer
    contentContractVersion:
      type: integer
      const: 2
    microSelections:
      type: object
      additionalProperties:
        type: array
        items:
          type: object
          properties:
            versionId:
              type: string
              format: uuid
            revision:
              type: integer
          required:
            - versionId
            - revision
SurveyCondition:
  type: object
  properties:
    operator:
      type: string
      description: >-
        Type-specific operator; numeric comparisons, text matching, date comparisons, multi-choice
        membership/count, or known/unknown.
    value: {}
    row:
      type: string
  required:
    - operator
SurveyVisibility:
  type: object
  properties:
    effect:
      type: string
      enum:
        - show
        - hide
    match:
      type: string
      enum:
        - all
        - any
    conditions:
      type: array
      items:
        allOf:
          - $ref: '#/SurveyCondition'
          - type: object
            properties:
              questionId:
                type: string
            required:
              - questionId
  required:
    - effect
    - match
    - conditions
SurveyQuestionOptions:
  type: object
  properties:
    choices:
      type: array
      items:
        type: string
    choicesEn:
      type: array
      items:
        type: string
    choicesAr:
      type: array
      items:
        type: string
    rows:
      type: array
      items:
        type: string
    columns:
      type: array
      items:
        type: string
    min:
      type: number
    max:
      type: number
    visibility:
      $ref: '#/SurveyVisibility'
    optionFilters:
      type: array
      items:
        allOf:
          - $ref: '#/SurveyVisibility'
          - type: object
            properties:
              choice:
                type: string
            required:
              - choice
  additionalProperties: true
SurveyQuestion:
  type: object
  properties:
    id:
      type: string
    orderIndex:
      type: integer
    type:
      type: string
      enum:
        - welcome
        - statement
        - end
        - redirect
        - text
        - email
        - number
        - date
        - yesno
        - rating
        - nps
        - justRight
        - choice
        - singleChoice
        - multiChoice
        - dropdown
        - matrix
    promptEn:
      type: string
    promptAr:
      type: string
    options:
      $ref: '#/SurveyQuestionOptions'
    required:
      type: boolean
    routes:
      type: array
      items:
        type: object
        properties:
          condition:
            $ref: '#/SurveyCondition'
          nextQuestionId:
            type: string
        required:
          - condition
          - nextQuestionId
  required:
    - type
    - options
  anyOf:
    - required:
        - promptEn
    - required:
        - promptAr
SurveyVersion:
  type: object
  properties:
    id:
      type: string
      format: uuid
    surveyId:
      type: string
      format: uuid
    versionNumber:
      type: integer
    status:
      type: string
      enum:
        - draft
        - published
        - archived
    createdAt:
      type: string
      format: date-time
    publishedAt:
      type:
        - string
        - 'null'
      format: date-time
    questions:
      type: array
      items:
        $ref: '#/SurveyQuestion'
SurveyDesign:
  type: object
  properties:
    id:
      type: string
      format: uuid
    team:
      type: string
    name:
      type: string
    config:
      type: object
      additionalProperties: true
    createdAt:
      type: string
      format: date-time
    updatedAt:
      type: string
      format: date-time
SurveyResult:
  type: object
  properties:
    questionId:
      type: string
      format: uuid
    type:
      type: string
    count:
      type: integer
    average:
      type: number
    distribution:
      type: object
      additionalProperties:
        type: integer
    textAnswers:
      type: array
      items:
        type: string
SurveyResponse:
  type: object
  properties:
    id:
      type: string
      format: uuid
    submittedAt:
      type: string
      format: date-time
    versionId:
      type: string
      format: uuid
    versionNumber:
      type: integer
    answers:
      type: array
      items:
        type: object
        properties:
          questionId:
            type: string
            format: uuid
          type:
            type: string
          value: {}
        required:
          - questionId
          - type
          - value
SopCategories:
  type: object
  properties:
    l1:
      type: array
      items:
        type: object
        properties:
          id:
            type: string
          label:
            type: string
          order:
            type: integer
    l2:
      type: array
      items:
        type: object
        properties:
          id:
            type: string
          label:
            type: string
          order:
            type: integer
    l3:
      type: array
      items:
        type: object
        properties:
          id:
            type: string
          label:
            type: string
          order:
            type: integer
    l1l2:
      type: array
      items:
        type: object
        properties:
          l1Id:
            type: string
          l2Id:
            type: string
    l2l3:
      type: array
      items:
        type: object
        properties:
          l2Id:
            type: string
          l3Id:
            type: string
SopComment:
  type: object
  properties:
    id:
      type: string
    sopId:
      type: string
    authorEmail:
      type: string
    authorName:
      type: string
    body:
      type: string
    action:
      type: string
      enum:
        - comment
        - sent_back
        - approved
    createdAt:
      type: string
      format: date-time
