openapi: 3.0.0
info:
  title: 'Public API'
  description: 'SIANA Public API - External integration endpoints'
  version: 1.0.0
servers:
  -
    url: 'http://160-f1401001.spalopia.app'
    description: 'Demo server'
paths:
  '/api/v1/brands/{brandUUID}/public/backoffice/{centerUUID}/bookings/appointments':
    get:
      tags:
        - Bookings
      summary: 'Retrieve appointment list by filters'
      description: "This endpoint returns a paginated list of appointments filtered by the provided parameters.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}"
      operationId: 'get_Retrieves a appointment list by filters'
      parameters:
        -
          name: page
          in: query
          description: 'Page number for pagination (default: 1).'
          required: false
          example: 1
        -
          name: limit
          in: query
          description: 'Number of results per page (default: 1000). Maximum: 1000'
          required: false
          example: 1000
        -
          name: channel_alias
          in: query
          description: 'Alias of the channel to filter appointments'
          required: false
          example: web
        -
          name: sale_channel
          in: query
          description: 'Sale channel. Comma-separated list of sale channel IDs as string (e.g. "1,2,3").'
          required: false
          example: '1,2,3'
        -
          name: client_type
          in: query
          description: 'Client group type. Comma-separated list of client group type IDs as string (e.g. "10,20").'
          required: false
          example: '10,20'
        -
          name: service_uuids
          in: query
          description: 'Services. Comma-separated list of service UUIDs as string (e.g. "uuid1,uuid2,uuid3").'
          required: false
          example: 'a1b2c3d4-5678-1234-9abc-def012345678,a2b2c3d4-5678-1234-9abc-def012345679'
        -
          name: execution_from
          in: query
          description: 'Start date for execution (enjoyment) date range (format: d/m/Y).'
          required: false
          example: 12/07/2025
        -
          name: execution_to
          in: query
          description: 'End date for execution (enjoyment) date range (format: d/m/Y).'
          required: false
          example: 12/08/2025
        -
          name: sales_from
          in: query
          description: 'Start date for sales (purchase) date range (format: d/m/Y).'
          required: false
          example: 12/07/2025
        -
          name: sales_to
          in: query
          description: 'End date for sales (purchase) date range (format: d/m/Y).'
          required: false
          example: 12/08/2025
        -
          name: search
          in: query
          description: 'Text to search in client fields (name, surname, email, phone) and appointment code.'
          required: false
          example: 'John Doe'
        -
          name: check_in
          in: query
          description: 'Appointment check-in status to filter. Possible values: check_in, no_check_in, no_show, invalid.'
          required: false
          example: check_in
        -
          name: merchant_uuids
          in: query
          description: 'Comma-separated list of merchant UUIDs to filter appointments.'
          required: false
          example: 'a1b2c3d4-5678-1234-9abc-def012345678,a2b2c3d4-5678-1234-9abc-def012345679'
        -
          name: status
          in: query
          description: 'Appointment status to filter. Possible values: pending, accepted, cancelled, pending_cancelled, invalid.'
          required: false
          example: pending
        -
          name: payment_status
          in: query
          description: 'Appointment payment status to filter. Possible values: paid, not_paid, free, partial, invalid, pending_cancelled.'
          required: false
          example: paid
        -
          name: sort_by
          in: query
          description: 'Field to sort appointments by. Possible values: purchase_group_id, buyer_group_id, name, surname, email, pay_method, price, accepted, datetime, payment_code.'
          required: false
          example: name
        -
          name: sort_order
          in: query
          description: 'Sort order for the results. Possible values: ASCENDANT, DESCENDANT.'
          required: false
          example: DESCENDANT
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: centerUUID
          in: path
          description: 'The uuid of the center'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
      responses:
        '200':
          description: 'Retrieves a appointment. Results are paginated by default.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Shared:Backoffice:AppointmentFind'
  '/api/v1/brands/{brandUUID}/public/backoffice/{centerUUID}/vouchers':
    get:
      tags:
        - Vouchers
      summary: 'Retrieve voucher list by filters'
      description: "This endpoint returns a paginated list of vouchers filtered by the provided parameters.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}"
      operationId: 'get_Retrieves a voucher list by filters'
      parameters:
        -
          name: page
          in: query
          description: 'Page number for pagination (default: 1).'
          required: false
          example: 1
        -
          name: limit
          in: query
          description: 'Number of results per page (default: 1000). Maximum: 1000'
          required: false
          example: 1000
        -
          name: channel_alias
          in: query
          description: 'Alias of the channel to filter vouchers'
          required: false
          example: web
        -
          name: channel_uuid
          in: query
          description: 'UUID of the channel to filter vouchers'
          required: false
          example: c1d2e3f4-5678-1234-9abc-def012345678
        -
          name: exchanged_status
          in: query
          description: 'Voucher exchanged status to filter. Possible values: not_exchanged, exchanged, partial, expired, partial_exchanged_expired, invalid.'
          required: false
          example: exchanged
        -
          name: exchanged_from
          in: query
          description: 'Start date for exchanged date range (format: d/m/Y).'
          required: false
          example: 01/01/2024
        -
          name: exchanged_to
          in: query
          description: 'End date for exchanged date range (format: d/m/Y).'
          required: false
          example: 31/01/2024
        -
          name: status
          in: query
          description: 'Voucher status to filter. Possible values: pending, accepted, cancelled, pending_cancelled, invalid.'
          required: false
          example: accepted
        -
          name: payment_status
          in: query
          description: 'Voucher payment status to filter. Possible values: paid, not_paid, free, partial, invalid, pending_cancelled.'
          required: false
          example: paid
        -
          name: comments_search
          in: query
          description: 'Text to search in voucher comments'
          required: false
          example: 'birthday gift'
        -
          name: search
          in: query
          description: 'Text to search in client fields (name, surname, email, phone) and voucher code.'
          required: false
          example: 'John Doe'
        -
          name: sale_channel
          in: query
          description: 'Comma-separated list of sale channel IDs as string (e.g. "1,2,3").'
          required: false
          example: '1,2,3'
        -
          name: client_type
          in: query
          description: 'Comma-separated list of client group type IDs as string (e.g. "10,20").'
          required: false
          example: '10,20'
        -
          name: client_uuid
          in: query
          description: 'Client UUID to filter vouchers'
          required: false
          example: a1b2c3d4-5678-1234-9abc-def012345678
        -
          name: sales_from
          in: query
          description: 'Start date for sales (purchase) date range (format: d/m/Y).'
          required: false
          example: 12/07/2025
        -
          name: sales_to
          in: query
          description: 'End date for sales (purchase) date range (format: d/m/Y).'
          required: false
          example: 12/08/2025
        -
          name: sort_by
          in: query
          description: 'Field to sort vouchers by. Possible values: payment_code, pay_method, actual_price, accepted_date, canceled_date, purchase_group_id, buyer_group_id, email, name, phone.'
          required: false
          example: accepted_date
        -
          name: sort_order
          in: query
          description: 'Sort order for the results. Possible values: ASCENDANT, DESCENDANT.'
          required: false
          example: DESCENDANT
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: centerUUID
          in: path
          description: 'The uuid of the center'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
      responses:
        '200':
          description: 'Retrieves a voucher list. Results are paginated by default.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Shared:Backoffice:VoucherFind'
  '/api/v1/brands/{brandUUID}/public/booking-engine/channel/{channelIdentifier}/group/{groupUUID}/center/{centerUUID}/booking/{bookingUUID}/appointment/{appointmentUUID}/cancel':
    put:
      tags:
        - 'Booking / Appointment'
      summary: 'Cancel a specific appointment'
      description: "This endpoint cancels a specific appointment within a booking for a specific channel and group.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}\n\nCancelling an appointment may trigger refund processing depending on the cancellation policy."
      operationId: 'put_Cancel an appointment by channel and group'
      parameters:
        -
          name: centerUUID
          in: path
          description: 'The uuid of the center'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: bookingUUID
          in: path
          description: 'The uuid of the booking containing the appointment'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: appointmentUUID
          in: path
          description: 'The uuid of the appointment to cancel'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: channelIdentifier
          in: path
          description: 'The identifier of the channel, it must be the alias or its uuid'
          required: true
          schema:
            type: string
          examples:
            channel-alias:
              summary: 'Channel alias'
              value: channel-alias
            channel-uuid:
              summary: 'Channel uuid'
              value: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: groupUUID
          in: path
          description: 'The UUID identifier of the group'
          required: true
          schema:
            type: string
      requestBody:
        description: 'Cancellation details including price and motive'
        required: true
        content:
          application/json:
            schema:
              required:
                - cancellation
              properties:
                cancellation:
                  example: { type: App\B2B\Backend\Context\PublicAPI\Shared\Booking\Appointment\Application\Canceller\DTO\AppointmentCancellation, groups: null, options: [], serializationContext: [] }
              type: object
      responses:
        '204':
          description: 'Appointment was cancelled successfully'
        '400':
          description: 'Bad request - invalid data or appointment cannot be cancelled'
          content:
            application/json:
              schema:
                properties:
                  error: { type: string, example: 'Cancellation is required' }
                type: object
  '/api/v1/brands/{brandUUID}/public/booking-engine/channel/{channelIdentifier}/group/{groupUUID}/center/{centerUUID}/bookings/{availabilityType}':
    post:
      tags:
        - Booking
      summary: 'Create a new booking'
      description: "This endpoint creates a new booking with appointments for a specific channel and group.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}\n\n**Note:** If channel_identifier, group_uuid or center_uuid are provided in the request body, they must match the corresponding values in the URL path."
      operationId: 'post_Create a booking by channel and group'
      parameters:
        -
          name: channelIdentifier
          in: path
          description: 'The identifier of the channel, it must be the alias or its uuid'
          required: true
          schema:
            type: string
          examples:
            channel-alias:
              summary: 'Channel alias'
              value: channel-alias
            channel-uuid:
              summary: 'Channel uuid'
              value: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: groupUUID
          in: path
          description: 'The UUID identifier of the group'
          required: true
          schema:
            type: string
        -
          name: centerUUID
          in: path
          description: 'The uuid of the center where the booking will be created'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: availabilityType
          in: path
          description: 'The type of product for creating the appointments. Use "services" for individual services or "service-packages" for service packages.'
          required: true
          schema:
            type: string
            enum:
              - services
              - service-packages
          example: services
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
      requestBody:
        description: 'Booking data including client information, purchase details, and appointments'
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicAPI:Shared:Booking'
      responses:
        '201':
          description: 'Booking created successfully'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Booking with uuid d02f3d9e-d12e-4680-9ad2-aefea1ce47e9 was created' }
                  booking_uuid: { type: string, example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9 }
                type: object
        '400':
          description: 'Bad request - center_uuid mismatch or invalid data'
          content:
            application/json:
              schema:
                properties:
                  error: { type: string, example: 'Booking center_uuid doesnt correspond to booking center_uuid endpoint' }
                type: object
  '/api/v1/brands/{brandUUID}/public/booking-engine/channel/{channelIdentifier}/group/{groupUUID}/bookings':
    get:
      tags:
        - Booking
      summary: 'Retrieve bookings list by channel and group'
      description: "This endpoint returns a list of bookings for a specific channel and group.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}\n\nYou can filter results using query parameters. All filters are optional."
      operationId: 'get_Get bookings generated by channel and group'
      parameters:
        -
          name: channelIdentifier
          in: path
          description: 'The identifier of the channel, it must be the alias or its uuid'
          required: true
          schema:
            type: string
          examples:
            channel-alias:
              summary: 'Channel alias'
              value: channel-alias
            channel-uuid:
              summary: 'Channel uuid'
              value: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: groupUUID
          in: path
          description: 'The UUID identifier of the group'
          required: true
          schema:
            type: string
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
      responses:
        '200':
          description: 'Retrieves a bookings list. Results may include pagination.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicAPI:BookingEngine:BookingFind'
  '/api/v1/brands/{brandUUID}/public/booking-engine/bookings':
    get:
      tags:
        - Booking
      summary: 'Retrieve bookings created by the authenticated API user'
      description: "This endpoint returns the bookings created by the authenticated API user via the Public API, across all channels and groups.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}\n\nThe response is scoped to the caller's own activity: only bookings whose creator matches the authenticated user are returned. Bookings created via the internal agenda, the public website, or by other API users are not exposed.\n\nTo retrieve bookings under a specific channel and group, use the channel/group endpoint instead."
      operationId: 'get_Get all bookings of the brand'
      parameters:
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
      responses:
        '200':
          description: 'Retrieves a bookings list. Results may include pagination.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicAPI:BookingEngine:BookingFind'
  '/api/v1/brands/{brandUUID}/public/booking-engine/channel/{channelIdentifier}/group/{groupUUID}/center/{centerUUID}/booking/{bookingIdentifier}/cancel':
    put:
      tags:
        - Booking
      summary: 'Cancel a booking and its appointments'
      description: "This endpoint cancels a booking and allows specifying which appointments to cancel.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}\n\nYou can identify the booking by either its UUID or booking code. Cancelling a booking may trigger refund processing depending on the cancellation policy."
      operationId: 'put_Cancel a booking by channel and group'
      parameters:
        -
          name: channelIdentifier
          in: path
          description: 'The identifier of the channel, it must be the alias or its uuid'
          required: true
          schema:
            type: string
          examples:
            channel-alias:
              summary: 'Channel alias'
              value: channel-alias
            channel-uuid:
              summary: 'Channel uuid'
              value: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: groupUUID
          in: path
          description: 'The UUID identifier of the group'
          required: true
          schema:
            type: string
        -
          name: centerUUID
          in: path
          description: 'The uuid of the center'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: bookingIdentifier
          in: path
          description: 'The identifier of the booking to cancel. Can be either the booking UUID or booking code.'
          required: true
          schema:
            type: string
          examples:
            booking-uuid:
              summary: 'Booking uuid'
              value: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
            booking-code:
              summary: 'Booking code'
              value: BOOKING123456
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
      requestBody:
        description: 'Appointment cancellation details specifying which appointments to cancel'
        required: true
        content:
          application/json:
            schema:
              required:
                - cancellations
              properties:
                cancellations:
                  description: 'List of appointments to cancel'
                  type: array
                  items: { $ref: '#/components/schemas/PublicAPI:BookingEngine:AppointmentCancellation' }
              type: object
      responses:
        '204':
          description: 'Booking was cancelled successfully'
        '400':
          description: 'Bad request - center_uuid mismatch or invalid data'
          content:
            application/json:
              schema:
                properties:
                  error: { type: string, example: 'Center uuid mismatch, center_uuid doesnt correspond to booking center_uuid endpoint' }
                type: object
  '/api/v1/brands/{brandUUID}/public/booking-engine/channel/{channelIdentifier}/group/{groupUUID}/centers':
    get:
      tags:
        - Center
      summary: 'Retrieve centers with services and service packages for booking engine'
      description: "This endpoint returns all centers with their available services and service packages for a specific channel and group.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}"
      operationId: 'get_Get booking engine centers with services'
      parameters:
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: channelIdentifier
          in: path
          description: 'The identifier of the channel, it must be the alias or its uuid'
          required: true
          schema:
            type: string
          examples:
            channel-alias:
              summary: 'Channel alias'
              value: channel-alias
            channel-uuid:
              summary: 'Channel uuid'
              value: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: groupUUID
          in: path
          description: 'The uuid of the group'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
      responses:
        '200':
          description: 'Retrieves centers with their services and service packages'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicAPI:Shared:CenterFind'
  '/api/v1/brands/{brandUUID}/public/booking-engine/channels':
    get:
      tags:
        - Channel
      summary: 'Retrieve all available booking engine channels'
      description: "This endpoint returns all available channels for the booking engine.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}"
      operationId: 'get_Get booking engine channels'
      parameters:
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
      responses:
        '200':
          description: 'Retrieves all available channels'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicAPI:BookingEngine:ChannelFind'
  '/api/v1/brands/{brandUUID}/public/booking-engine/groups':
    get:
      tags:
        - Group
      summary: 'Retrieve all available booking engine groups'
      description: "This endpoint returns all available groups for the booking engine.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}"
      operationId: 'get_Get all groups'
      parameters:
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
      responses:
        '200':
          description: 'Retrieves all available groups'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicAPI:BookingEngine:GroupFind'
  '/api/v1/brands/{brandUUID}/public/booking-engine/channel/{channelIdentifier}/group/{groupUUID}/center/{centerUUID}/service/{serviceUUID}/availability-range':
    get:
      tags:
        - 'Service / Availability'
      summary: 'Get cached availability for a service within a date range'
      description: "This endpoint returns the cached availability status for a specific service across a date range for a specific channel and group.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}\n\nUseful for displaying a calendar view showing which days have availability."
      operationId: 'get_Sends the cached availability for single service by channel and group of the given range'
      parameters:
        -
          name: centerUUID
          in: path
          description: 'The uuid of the center'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: serviceUUID
          in: path
          description: 'The uuid of the service'
          required: true
          schema:
            type: string
          example: 02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: from
          in: query
          description: 'Start date of the range in format yyyy-mm-dd'
          required: true
          example: '2024-01-01'
        -
          name: to
          in: query
          description: 'End date of the range in format yyyy-mm-dd'
          required: true
          example: '2024-01-31'
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: channelIdentifier
          in: path
          description: 'The identifier of the channel, it must be the alias or its uuid'
          required: true
          schema:
            type: string
          examples:
            channel-alias:
              summary: 'Channel alias'
              value: channel-alias
            channel-uuid:
              summary: 'Channel uuid'
              value: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: groupUUID
          in: path
          description: 'The UUID identifier of the group'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Returns cached availability information for each day in the specified range'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Shared:ServiceHasAvailabilityOption:ServiceHasAvailabilityOptionsResponse'
  '/api/v1/brands/{brandUUID}/public/booking-engine/channel/{channelIdentifier}/group/{groupUUID}/center/{centerUUID}/services/availability-range':
    get:
      tags:
        - 'Service / Availability'
      summary: 'Get cached availability for all services in a center within a date range'
      description: "This endpoint returns the cached availability status for all services in a specific center across a date range for a specific channel and group.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}\n\nUseful for displaying which services have availability in the specified date range."
      operationId: 'get_Sends the cached availability by channel and group of the given range'
      parameters:
        -
          name: centerUUID
          in: path
          description: 'The uuid of the center'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: from
          in: query
          description: 'Start date of the range in format yyyy-mm-dd'
          required: true
          example: '2024-01-01'
        -
          name: to
          in: query
          description: 'End date of the range in format yyyy-mm-dd'
          required: true
          example: '2024-01-31'
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: channelIdentifier
          in: path
          description: 'The identifier of the channel, it must be the alias or its uuid'
          required: true
          schema:
            type: string
          examples:
            channel-alias:
              summary: 'Channel alias'
              value: channel-alias
            channel-uuid:
              summary: 'Channel uuid'
              value: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: groupUUID
          in: path
          description: 'The UUID identifier of the group'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Returns cached availability information for all services for each day in the specified range'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Shared:ServiceHasAvailabilityOption:ServicesHasAvailabilityOptionsResponse'
  '/api/v1/brands/{brandUUID}/public/booking-engine/channel/{channelIdentifier}/group/{groupUUID}/center/{centerUUID}/service/{serviceUUID}/availability':
    get:
      tags:
        - 'Service / Availability'
      summary: 'Get availability options for a specific service on a specific date'
      description: "This endpoint returns the availability options (time slots) for a single service on a specific date for a specific channel and group.\n\n**Authentication required:** You must include the token obtained via the login endpoint in the Authorization header as: Authorization: {token}\n\nUseful for displaying available time slots when a user wants to book a specific service."
      operationId: 'get_Get availability options by channel and group for single service'
      parameters:
        -
          name: centerUUID
          in: path
          description: 'The uuid of the center'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: serviceUUID
          in: path
          description: 'The uuid of the service'
          required: true
          schema:
            type: string
          example: 02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: date
          in: query
          description: 'Date to check availability in format yyyy-mm-dd'
          required: true
          example: '2024-01-01'
        -
          name: pax
          in: query
          description: 'Number of people (pax) for the booking'
          required: true
          schema:
            type: integer
            minimum: 1
          example: 2
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: channelIdentifier
          in: path
          description: 'The identifier of the channel, it must be the alias or its uuid'
          required: true
          schema:
            type: string
          examples:
            channel-alias:
              summary: 'Channel alias'
              value: channel-alias
            channel-uuid:
              summary: 'Channel uuid'
              value: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        -
          name: groupUUID
          in: path
          description: 'The UUID identifier of the group'
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'Returns availability options with time slots for the specified service and date'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicAPI:Shared:ServiceAvailabilityFind'
        '400':
          description: 'Bad request - pax and date are required'
          content:
            application/json:
              schema:
                properties:
                  message: { type: string, example: 'Pax and date are required' }
                type: object
  '/api/v1/brands/{brandUUID}/public/login':
    post:
      tags:
        - Login
      summary: 'Obtain authentication token'
      description: 'To use our API, you must first have a registered user in our system. Use the email and password of this user to obtain an authentication token with this endpoint. All subsequent API requests must include the token in the Authorization header as follows: Authorization: {token}'
      operationId: 'post_Get authentication token for public api'
      parameters:
        -
          name: brandUUID
          in: path
          description: 'The uuid of the brand'
          required: true
          schema:
            type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
                - email
                - password
              properties:
                email:
                  description: 'User email to log in and get authentication token'
                  type: string
                  example: loginTest@spalopia.com
                password:
                  description: 'User password to log in and get authentication token'
                  type: string
                  example: loginTest-2
              type: object
      responses:
        '200':
          description: 'Authentication successful. Returns session token.'
          content:
            application/json:
              schema:
                properties:
                  token: { description: 'Authentication session token', type: string, example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 }
                type: object
        '401':
          description: 'Invalid credentials'
          content:
            application/json:
              schema:
                properties:
                  message: { description: 'Error message', type: string, example: 'Invalid credentials' }
                type: object
        '500':
          description: 'Internal server error'
components:
  schemas:
    'Shared:ServiceHasAvailabilityOption:ServicesHasAvailabilityOptionsResponse':
      description: 'Response containing availability status per date grouped by service UUID'
      required:
        - data
        - meta
      properties:
        data:
          description: 'Dictionary of service UUID to dictionary of date (yyyy-mm-dd) to availability status (boolean)'
          type: object
          example:
            a1b2c3d4-e5f6-7890-abcd-ef1234567890:
              '2024-01-15': true
              '2024-01-16': false
          additionalProperties:
            type: object
            additionalProperties:
              type: boolean
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'Shared:ServiceHasAvailabilityOption:ServiceHasAvailabilityOptionsResponse':
      description: 'Response containing availability status per date'
      required:
        - data
        - meta
      properties:
        data:
          description: 'Dictionary of date (yyyy-mm-dd) to availability status (boolean)'
          type: object
          example:
            '2024-01-15': true
            '2024-01-16': false
            '2024-01-17': true
          additionalProperties:
            type: boolean
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'Shared:Service:ServiceCapacity':
      description: 'Capacity of service'
      required:
        - incrementing
        - minimum
      properties:
        incrementing:
          description: 'Increment of person/s for add in service execution (should be less than maximum)'
          type: int
          example: 2
        maximum:
          description: 'Maximum person/s for allow during the service'
          type: int
          example: 2
          nullable: true
        minimum:
          description: 'Minimum person/s for allow which the service can start'
          type: int
          example: 2
      type: object
    'Shared:Service:AvailabilityPricing':
      description: 'Information for pricing in availability option'
      required:
        - price_per_person
        - total_price
      properties:
        price_per_person:
          $ref: '#/components/schemas/Shared:Generic:Price'
        total_price:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'Shared:Service:AvailabilityCancellation':
      description: 'Availability cancellation option'
      required:
        - type
        - from
        - to
        - center_timezone
        - price
      properties:
        type:
          type: string
          enum:
            - free
            - cancellation
            - no_show
        from:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
        to:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
        center_timezone:
          description: 'The timezone of the center'
          type: string
          example: Europe/Madrid
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'Shared:Purchase:Translation':
      description: 'Locale-keyed text map (e.g. {"en": "English text", "es": "Texto en español"})'
      type: object
      additionalProperties:
        type: string
    'Shared:Purchase:TermsAndConditionsItem':
      description: 'Terms and conditions checkbox item'
      required:
        - key
        - required
        - labels
        - body
      properties:
        key:
          type: string
          example: terms_and_conditions
        required:
          type: boolean
        labels:
          $ref: '#/components/schemas/Shared:Purchase:Translation'
        body:
          type: string
      type: object
    'Shared:Purchase:TermsAndConditions':
      description: 'Terms and conditions configuration'
      required:
        - spa_conditions
        - items
      properties:
        spa_conditions:
          $ref: '#/components/schemas/Shared:Purchase:Translation'
        items:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Purchase:TermsAndConditionsItem'
      type: object
    'Shared:Purchase:SpecificPeriodCollection':
      description: 'Collection of specific cancellation periods'
      type: array
      items:
        $ref: '#/components/schemas/Shared:Purchase:SpecificPeriod'
    'Shared:Purchase:SpecificPeriod':
      description: 'Specific cancellation period override'
      required:
        - from_date
        - to_date
        - reference_hour
        - weight
        - time_before_expire
        - penalization_before_expire
        - penalization_after_expire
      properties:
        from_date:
          type: string
          example: 19-03-2024
        to_date:
          type: string
          example: 20-03-2024
        reference_hour:
          type: string
          example: '0'
        users_can_cancel:
          type: boolean
          nullable: true
        weight:
          type: string
          example: '0'
        time_before_expire:
          $ref: '#/components/schemas/Shared:Purchase:FreeCancellation'
        penalization_before_expire:
          $ref: '#/components/schemas/Shared:Purchase:Penalization'
        penalization_after_expire:
          $ref: '#/components/schemas/Shared:Purchase:Penalization'
      type: object
    'Shared:Purchase:ServiceConditions':
      description: 'Legal conditions for a service'
      required:
        - service_uuid
        - service_name
        - legalConditions
        - anyCondition
      properties:
        service_uuid:
          type: string
        service_name:
          type: string
        legalConditions:
          $ref: '#/components/schemas/LegalConditions'
        anyCondition:
          type: boolean
      type: object
    'Shared:Purchase:PurchasePaymentMethodsResponse':
      description: 'Payment methods response'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Purchase:PurchasePaymentMethod'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'Shared:Purchase:PurchasePaymentMethod':
      description: 'Payment method available for purchase'
      required:
        - type
        - name
      properties:
        type:
          type: string
          example: stripe
        name:
          type: string
          example: Stripe
      type: object
    'Shared:Purchase:PurchaseExpirationRules':
      description: 'Purchase expiration rules'
      required:
        - type
        - months
        - weeks
        - days
        - hours
        - date
        - totalHours
      properties:
        type:
          type: string
          enum:
            - from_purchase
            - fixed_date
            - never
          example: from_purchase
        months:
          type: integer
          example: 0
        weeks:
          type: integer
          example: 0
        days:
          type: integer
          example: 0
        hours:
          type: integer
          example: 0
        date:
          type: string
          example: ''
        totalHours:
          type: integer
      type: object
    'Shared:Purchase:PurchaseCheckoutFields':
      description: 'Checkout field requirements'
      required:
        - name_required
        - surname_required
        - email_required
        - phone_required
      properties:
        name_required:
          type: boolean
        surname_required:
          type: boolean
        email_required:
          type: boolean
        phone_required:
          type: boolean
      type: object
    'Shared:Purchase:Penalization':
      description: 'Cancellation penalization'
      required:
        - price_type
        - fixed_price_value
      properties:
        price_type:
          type: string
        fixed_price_value:
          type: integer
      type: object
    'Shared:Purchase:FreeCancellation':
      description: 'Free cancellation window'
      required:
        - available
        - days_before
        - hours_before
      properties:
        available:
          type: boolean
        days_before:
          type: integer
        hours_before:
          type: integer
      type: object
    'Shared:Purchase:CancellationRules':
      description: 'Cancellation rules configuration'
      required:
        - users_can_cancel
        - free_cancellation
        - penalization_before_expire
        - penalization_after_expire
        - free_cancelation_alternative_text
        - specific_periods
      properties:
        users_can_cancel:
          type: boolean
        free_cancellation:
          $ref: '#/components/schemas/Shared:Purchase:FreeCancellation'
        penalization_before_expire:
          $ref: '#/components/schemas/Shared:Purchase:Penalization'
        penalization_after_expire:
          $ref: '#/components/schemas/Shared:Purchase:Penalization'
        free_cancelation_alternative_text:
          $ref: '#/components/schemas/Shared:Purchase:Translation'
        specific_periods:
          $ref: '#/components/schemas/Shared:Purchase:SpecificPeriodCollection'
      type: object
    'Shared:Purchase:BillingInfo':
      description: 'Billing info configuration'
      required:
        - ask_on_booking_engine
        - amount_for_force_fiscal
        - fields
      properties:
        ask_on_booking_engine:
          type: boolean
        amount_for_force_fiscal:
          type: integer
          example: 5000
        fields:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Purchase:BillingFieldDTO'
      type: object
    'Shared:Purchase:BillingFieldDTO':
      description: 'Billing field configuration'
      required:
        - key
        - status
        - labels
      properties:
        key:
          type: string
          example: billing_name
        status:
          type: string
          example: required
        labels:
          $ref: '#/components/schemas/Shared:Purchase:Translation'
      type: object
    'Shared:Generic:User':
      description: 'User information'
      required:
        - email
      properties:
        email:
          type: string
          example: info@spalopia.com
      type: object
    'Shared:Generic:TranslationLegalConditions':
      required:
        - legal_notice
        - political_condition
        - general_condition
      properties:
        legal_notice:
          description: 'Legal Notice'
          type: string
          example: 'Legal Notice in spanish'
        political_condition:
          description: 'Political condition'
          type: string
          example: 'Political condition in spanish'
        general_condition:
          description: 'General condition'
          type: string
          example: 'General condition in spanish'
      type: object
    'Shared:Generic:Translation':
      required:
        - langcode
        - name
        - description
        - legal_conditions
      properties:
        langcode:
          description: 'Language code of the translation in ISO 639-2'
          type: string
          example: es
        name:
          description: 'Name in translation'
          type: string
          example: 'Some name in spanish'
        description:
          description: 'Description in translation'
          type: string
          example: 'Some description in spanish'
        legal_conditions:
          $ref: '#/components/schemas/Shared:Generic:TranslationLegalConditions'
      type: object
    'Shared:Generic:Price':
      required:
        - amount
        - currency
      properties:
        amount:
          description: 'Amount with cents'
          type: integer
          example: 1000
        currency:
          description: 'Currency code'
          type: string
          example: EUR
      type: object
    'Shared:Generic:PersonalData':
      description: 'Personal data information'
      required:
        - name
        - surname
      properties:
        name:
          type: string
          example: Eleazar
        surname:
          type: string
          example: Perez
        gender:
          type: string
          enum:
            - F
            - M
          example: M
          nullable: true
        phone_number:
          type: string
          example: '+34 822 687 516'
          nullable: true
        postal_code:
          type: string
          example: '38300'
          nullable: true
        birth_date:
          description: 'Date in format YYYY-MM-DD'
          type: string
          example: '2024-03-06'
          nullable: true
      type: object
    'Shared:Generic:Pagination':
      description: pagination
      required:
        - current_page
        - max_elements_per_page
        - current_elements_at_this_page
        - total_elements
        - total_pages
      properties:
        current_page:
          type: integer
          example: 1
        max_elements_per_page:
          type: integer
          example: 10
        current_elements_at_this_page:
          type: integer
          example: 1
        total_elements:
          type: integer
          example: 1
        total_pages:
          type: integer
          example: 1
      type: object
    'Shared:Generic:MetaResponse':
      description: meta
      required:
        - pagination
      properties:
        pagination:
          $ref: '#/components/schemas/Shared:Generic:Pagination'
      type: object
    'Shared:Generic:FullName':
      required:
        - name
        - surname
      properties:
        name:
          description: 'Name of a person'
          type: string
          example: Raúl
        surname:
          description: 'Surname of a person'
          type: string
          example: Martínez
      type: object
    'Shared:Generic:File':
      required:
        - uuid
        - name
        - url
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        name:
          type: string
          example: image.jpg
        url:
          type: string
          example: 'https://marketplace-assets.s3.eu-west-3.amazonaws.com/2020/06/spa.jpg'
      type: object
    'Shared:Generic:ErrorResponse':
      description: 'Standard error response structure'
      required:
        - occurred_on
        - type
        - errors
      properties:
        occurred_on:
          description: 'Unix timestamp when the error occurred'
          type: integer
          example: 1706540123
        type:
          description: 'Error type identifier'
          type: string
          example: Exception
        errors:
          $ref: '#/components/schemas/Shared:Generic:ErrorDetails'
      type: object
    'Shared:Generic:ErrorDetails':
      description: 'Detailed error information. Only one of non_field or field will be present depending on error type'
      required:
        - Exception
      properties:
        Exception:
          description: 'Exception class name'
          type: string
          example: InvalidDataException
        non_field:
          description: 'General error messages (present for domain/business errors)'
          type: array
          items:
            type: string
          default: null
          nullable: true
        field:
          description: 'Validation error messages (present for input validation errors)'
          type: array
          items:
            type: string
          default: null
          nullable: true
      type: object
    'Shared:Generic:Client':
      description: 'Client information'
      required:
        - personal_data
      properties:
        personal_data:
          $ref: '#/components/schemas/Shared:Generic:PersonalData'
        user:
          oneOf:
            -
              $ref: '#/components/schemas/Shared:Generic:User'
          nullable: true
      type: object
    'Shared:Generic:BillableDateRequest':
      description: 'Request with a date in format Y-m-d for billable tasks'
      required:
        - date
      properties:
        date:
          description: 'Date in format Y-m-d'
          type: string
          example: '2024-01-15'
      type: object
    'Shared:Domain:DateStamp':
      type: string
      format: date
    'Shared:Booking:ServiceAvailabilityRequested':
      description: 'Information for availability option due to create an appointment'
      required:
        - fulfillment_on
        - duration_in_minutes
        - service_uuid
        - pricing
        - price
      properties:
        fulfillment_on:
          description: 'Date for fulfillment in format YYYY-MM-DD HH:mm:ss'
          type: string
          format: date-time
          example: '2024-03-06 12:00:00'
        duration_in_minutes:
          description: 'Duration of the service in minutes'
          type: int
          example: 60
        service_uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        pricing:
          $ref: '#/components/schemas/Shared:Service:AvailabilityPricing'
        rate_db_id:
          description: 'Optional custom service rate DB ID the requested price is based on'
          type: integer
          nullable: true
      type: object
    'Shared:Backoffice:VoucherStatusDatesDTO':
      description: 'Relevant voucher dates'
      required:
        - created
        - accepted
        - paid
        - exchanged_date_collection
        - canceled
        - expiration
      properties:
        created:
          description: 'Creation date (timestamp)'
          type: int
          example: 1574251932
        accepted:
          description: 'Accepted date (timestamp)'
          type: int
          example: 1574252932
        paid:
          description: 'Paid date (timestamp)'
          type: int
          example: 1574253932
        exchanged_date_collection:
          description: 'Collection of exchange dates (timestamp)'
          type: array
          items:
            type: int
          example:
            - 1574251932
            - 1574252932
        canceled:
          description: 'Cancelled date (timestamp)'
          type: int
          example: 1574254932
        expiration:
          description: 'Expiration date (timestamp)'
          type: int
          example: 1574255932
      type: object
    'Shared:Backoffice:VoucherStatusData':
      description: 'Voucher status data'
      required:
        - status
        - payment_status
        - exchanged_status
        - dates
      properties:
        status:
          description: 'Current status of the voucher'
          type: string
          enum:
            - pending
            - accepted
            - canceled
            - pending_cancelled
            - invalid
          example: accepted
        payment_status:
          description: 'Payment status of the voucher'
          type: string
          enum:
            - paid
            - not_paid
            - free
            - partial
            - invalid
            - pending_cancelled
          example: paid
        exchanged_status:
          description: 'Exchange status of the voucher'
          type: string
          enum:
            - exchanged
            - not_exchanged
            - invalid
          example: exchanged
        dates:
          $ref: '#/components/schemas/Shared:Backoffice:VoucherStatusDatesDTO'
      type: object
    'Shared:Backoffice:VoucherService':
      description: 'Servicio asociado al voucher'
      required:
        - name
        - units
      properties:
        name:
          description: 'Nombre del servicio'
          type: string
          example: 'Masaje relajante'
        units:
          description: 'Unidades del servicio'
          type: integer
          example: 2
      type: object
    'Shared:Backoffice:VoucherPurchaseInfo':
      description: 'Voucher purchase information'
      required:
        - price
        - price_before_offer
        - price_before_channel_group_discount
        - price_before_payment_discount
        - remaining_money
        - date
        - payment_method
        - promo_code
        - purchase_discount
        - group_discount
        - charged
        - balance
        - source
      properties:
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        price_before_offer:
          $ref: '#/components/schemas/Shared:Generic:Price'
        price_before_channel_group_discount:
          $ref: '#/components/schemas/Shared:Generic:Price'
        price_before_payment_discount:
          $ref: '#/components/schemas/Shared:Generic:Price'
        remaining_money:
          $ref: '#/components/schemas/Shared:Generic:Price'
        date:
          description: 'Accepted date as timestamp'
          type: int
          example: 1574251932
        payment_method:
          description: 'Payment method'
          type: string
          example: credit_card
        promo_code:
          description: 'Promo code'
          type: string
          example: PROMO2024
        purchase_discount:
          $ref: '#/components/schemas/Shared:Backoffice:VoucherPurchaseDiscount'
        group_discount:
          description: 'Group discount percentage'
          type: number
          format: float
          example: 5
        charged:
          $ref: '#/components/schemas/Shared:Generic:Price'
        balance:
          $ref: '#/components/schemas/Shared:Generic:Price'
        source:
          description: 'Purchase source'
          type: string
          enum:
            - backoffice
            - engine
          example: backoffice
      type: object
    'Shared:Backoffice:VoucherPurchaseDiscount':
      description: 'Voucher purchase discount'
      required:
        - percentage
        - motive
      properties:
        percentage:
          description: 'Discount percentage'
          type: float
          example: -5
        motive:
          description: 'Motive for the discount'
          type: string
          example: 'Black Friday discount'
      type: object
    'Shared:Backoffice:VoucherPurchaseComments':
      description: 'Purchase comments for the voucher'
      required:
        - client_comments
        - merchant_comments
      properties:
        client_comments:
          description: 'Client comment'
          type: string
          example: 'I want to be attended by the same person as last time.'
        merchant_comments:
          description: 'Merchant comment'
          type: string
          example: 'Client is a regular customer.'
      type: object
    'Shared:Backoffice:VoucherFind':
      description: 'Response of voucher finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Backoffice:Voucher'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'Shared:Backoffice:VoucherClientFullName':
      description: 'Full name of the voucher client'
      required:
        - name
        - surname
      properties:
        name:
          description: 'Client name'
          type: string
          example: John
        surname:
          description: 'Client surname'
          type: string
          example: Doe
      type: object
    'Shared:Backoffice:VoucherClient':
      description: 'Client associated with the voucher'
      required:
        - uuid
        - full_name
        - email
        - phone
        - group_uuid
      properties:
        uuid:
          description: 'Client UUID'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        full_name:
          $ref: '#/components/schemas/Shared:Backoffice:VoucherClientFullName'
        email:
          description: 'Client email'
          type: string
          example: client@example.com
        phone:
          description: 'Client phone number'
          type: string
          example: '+123456789'
        group_uuid:
          description: 'Client group UUID'
          type: string
          example: group-uuid-123
      type: object
    'Shared:Backoffice:VoucherChannelInformation':
      description: 'Channel information for the voucher'
      required:
        - uuid
        - name
        - alias_code
      properties:
        uuid:
          description: 'Channel UUID'
          type: string
          example: c1d2e3f4-5678-1234-9abc-def012345678
        name:
          description: 'Channel name'
          type: string
          example: Web
        alias_code:
          description: 'Channel alias code'
          type: string
          example: web
      type: object
    'Shared:Backoffice:VoucherAuthor':
      description: 'Author of the voucher'
      required:
        - metadata
      properties:
        uuid:
          description: 'Author UUID'
          type: string
          example: author-uuid-123
          nullable: true
        metadata:
          $ref: '#/components/schemas/Shared:Backoffice:AuthorMetadataDTO'
      type: object
    'Shared:Backoffice:Voucher':
      description: 'Voucher DTO for Public API response'
      required:
        - client
        - status
        - code
        - purchase_info
        - channel_information
        - services
        - comments
      properties:
        client:
          $ref: '#/components/schemas/Shared:Backoffice:VoucherClient'
        author:
          oneOf:
            -
              $ref: '#/components/schemas/Shared:Backoffice:VoucherAuthor'
          nullable: true
        status:
          $ref: '#/components/schemas/Shared:Backoffice:VoucherStatusData'
        code:
          description: 'Voucher code'
          type: string
          example: BOSPD000000277
        purchase_info:
          $ref: '#/components/schemas/Shared:Backoffice:VoucherPurchaseInfo'
        channel_information:
          $ref: '#/components/schemas/Shared:Backoffice:VoucherChannelInformation'
        services:
          description: 'Services associated with the voucher'
          type: array
          items:
            $ref: '#/components/schemas/Shared:Backoffice:VoucherService'
        comments:
          $ref: '#/components/schemas/Shared:Backoffice:VoucherPurchaseComments'
      type: object
    'Shared:Backoffice:BookingPurchaseInfoRemarks':
      description: 'Remarks for booking (merchant and client)'
      required:
        - merchant
        - client
      properties:
        merchant:
          description: 'Merchant comment in booking'
          type: string|null
          example: 'The client is a regular customer, give him a discount'
        client:
          description: 'Client comment in booking'
          type: string
          example: 'I want to be attended by the same person as last time'
      type: object
    'Shared:Backoffice:BookingPurchaseInfo':
      description: 'Purchase information for booking'
      required:
        - is_refundable
        - payment_method
        - promo_code
        - price_before_group_channel_discount
        - group_discount
        - price_before_purchase_discount
        - purchase_discount
        - price
        - charged
        - source
        - remarks
      properties:
        is_refundable:
          description: 'Indicates if the booking purchase is refundable'
          type: boolean
        payment_method:
          description: 'Payment method name'
          type: string|null
          example: stripe
        promo_code:
          description: 'Promo code'
          type: string
          example: BLACKFRIDAY
        price_before_group_channel_discount:
          $ref: '#/components/schemas/Shared:Generic:Price'
        group_discount:
          description: 'Group or channel percentage discount in the booking'
          type: float
          example: -5
        price_before_purchase_discount:
          $ref: '#/components/schemas/Shared:Generic:Price'
        purchase_discount:
          $ref: '#/components/schemas/Shared:Backoffice:BookingPurchaseDiscount'
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        charged:
          $ref: '#/components/schemas/Shared:Generic:Price'
        source:
          description: 'Source of the purchase, e.g., "web", "mobile", etc.'
          type: string
          enum:
            - backoffice
            - engine
        remarks:
          $ref: '#/components/schemas/Shared:Backoffice:BookingPurchaseInfoRemarks'
      type: object
    'Shared:Backoffice:BookingPurchaseDiscount':
      description: 'Booking purchase discount'
      required:
        - percentage
        - motive
      properties:
        percentage:
          description: 'Discount percentage'
          type: float
          example: -5
        motive:
          description: 'Motive for the discount'
          type: string
          example: 'Early bird discount'
      type: object
    'Shared:Backoffice:BookingChannelInformation':
      description: 'Booking channel information'
      required:
        - uuid
        - name
        - alias_code
      properties:
        uuid:
          description: 'Channel UUID'
          type: string
          example: a1b2c3d4-5678-90ab-cdef-1234567890ab
        name:
          description: 'Channel name'
          type: string
          example: 'Venta Online'
        alias_code:
          description: 'Channel alias code'
          type: string
          example: web
      type: object
    'Shared:Backoffice:BookingCenterMetadata':
      description: 'Center data in booking'
      required:
        - uuid
        - name
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        name:
          type: string
          example: 'Spa Demo 01'
      type: object
    'Shared:Backoffice:AuthorMetadataDTO':
      description: 'Metadata of the author'
      required:
        - db_id
      properties:
        db_id:
          description: 'Database ID of the author'
          type: integer
          example: 123
      type: object
    'Shared:Backoffice:NullAppointmentPurchaseInfoCancellation':
      description: 'Empty appointment cancellation information'
      type: object
    'Shared:Backoffice:AppointmentPurchaseInfoCancellation':
      description: 'Appointment cancellation information'
      required:
        - price
        - motive
      properties:
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        motive:
          description: 'Motive of the appointment cancellation'
          type: string
          example: 'Could not assist to the appointment'
      type: object
    'Shared:Backoffice:AppointmentPurchaseInfo':
      description: 'Purchase information for appointment'
      required:
        - price_before_channel_group_discount
        - price_before_appointment_discount
        - price_before_payment_discount
        - price
        - charged
        - fulfillment
        - is_refundable
        - remarks
        - cancellation
      properties:
        price_before_channel_group_discount:
          $ref: '#/components/schemas/Shared:Generic:Price'
        price_before_appointment_discount:
          $ref: '#/components/schemas/Shared:Generic:Price'
        price_before_payment_discount:
          $ref: '#/components/schemas/Shared:Generic:Price'
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        charged:
          $ref: '#/components/schemas/Shared:Generic:Price'
        fulfillment:
          description: 'Fulfillment date in TimeStamp format'
          type: int
          example: 1574251932
        is_refundable:
          description: 'Indicates if the appointment purchase is refundable'
          type: boolean
        remarks:
          description: 'Remarks for the appointment purchase'
          type: string
          example: 'I want to be attended by the same person as last time.'
        cancellation:
          anyOf:
            -
              type: App\B2B\Backend\Shared\BackOffice\Booking\Appointment\Application\Find\Response\DTO\PurchaseInfo\Cancellation\AppointmentCancellation
            -
              type: App\B2B\Backend\Shared\BackOffice\Booking\Appointment\Application\Find\Response\DTO\PurchaseInfo\Cancellation\NullAppointmentCancellation
          oneOf:
            -
              $ref: '#/components/schemas/Shared:Backoffice:AppointmentPurchaseInfoCancellation'
            -
              $ref: '#/components/schemas/Shared:Backoffice:NullAppointmentPurchaseInfoCancellation'
      type: object
    'Shared:Backoffice:AppointmentPenalties':
      description: 'Penalties and cancellation info for the appointment'
      required:
        - cancellation
        - remaining
      properties:
        cancellation:
          $ref: '#/components/schemas/Shared:Generic:Price'
        remaining:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'Shared:Backoffice:AppointmentMetadata':
      description: 'Metadata for the appointment'
      required:
        - db_id
        - appointment_booking_db_id
        - spa_booking_db_id
      properties:
        db_id:
          description: 'Appointment ID'
          type: string|null
          example: 10
        appointment_booking_db_id:
          description: 'Booking ID associated with the appointment'
          type: string|null
          example: 11
        spa_booking_db_id:
          description: 'Center ID for the appointment related to a booking'
          type: string|null
          example: 1
      type: object
    'Shared:Backoffice:AppointmentFind':
      description: 'Response of appointment finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Backoffice:Appointment'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'Shared:Backoffice:AppointmentEmployeeComments':
      description: 'Employee comments for the appointment'
      required:
        - appointment_comments
        - booking_comments
      properties:
        appointment_comments:
          description: 'Appointment employee comments'
          type: string
          example: 'The client prefers morning appointments.'
        booking_comments:
          description: 'Booking employee comments'
          type: string
          example: 'The client is a VIP member.'
      type: object
    'Shared:Backoffice:AppointmentDatesDates':
      description: 'Dates for appointment'
      required:
        - fulfillment
        - created
        - accepted
        - check_in
        - no_show
        - canceled
      properties:
        fulfillment:
          description: 'Fulfillment date in TimeStamp format'
          type: int
          example: 1574251932
        created:
          description: 'Created date in TimeStamp format'
          type: int
          example: 1574251932
        accepted:
          description: 'Accepted date in TimeStamp format'
          type: int
          example: 1574251932
        check_in:
          description: 'Check-in date in TimeStamp format'
          type: int
          example: 1574251932
        no_show:
          description: 'No-show date in TimeStamp format'
          type: int
          example: 1574251932
        canceled:
          description: 'Cancelled date in TimeStamp format'
          type: int
          example: 0
      type: object
    'Shared:Backoffice:AppointmentDates':
      description: 'Dates and status for appointment'
      required:
        - status
        - payment_status
        - check_in_status
        - dates
      properties:
        status:
          type: string
          enum:
            - pending
            - accepted
            - canceled
            - pending_cancelled
            - invalid
        payment_status:
          type: string
          enum:
            - paid
            - not_paid
            - free
            - partial
            - invalid
            - pending_cancelled
        check_in_status:
          type: string
          enum:
            - check_in
            - no_check_in
            - no_show
            - invalid
        dates:
          $ref: '#/components/schemas/Shared:Backoffice:AppointmentDatesDates'
      type: object
    'Shared:Backoffice:AppointmentClient':
      description: 'Client information for the appointment'
      required:
        - uuid
        - full_name
        - email
        - phone
        - group_uuid
        - beneficiary_name
        - client_comments
      properties:
        uuid:
          description: 'Client UUID'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        full_name:
          $ref: '#/components/schemas/Shared:Generic:FullName'
        email:
          description: 'Client email'
          type: string
          example: client@example.com
        phone:
          description: 'Client phone'
          type: string
          example: '+123456789'
        group_uuid:
          description: 'Client group UUID'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        beneficiary_name:
          description: 'Name of the person who is the benefit of the appointment'
          type: string
          example: 'Manuel Martínez'
        client_comments:
          description: 'Client comment'
          type: string
          example: 'I want to be attended by the same person as last time.'
      type: object
    'Shared:Backoffice:AppointmentBookingInfo':
      description: 'Information about a booking associated with an appointment'
      required:
        - uuid
        - code
        - channel_information
        - purchase_info
        - center
        - hotel_id
        - booking_number
        - room_number
      properties:
        uuid:
          type: string
          example: a1b2c3d4-5678-90ab-cdef-1234567890ab
        code:
          description: 'Booking code'
          type: string
          example: SPSPD000002089
        channel_information:
          $ref: '#/components/schemas/Shared:Backoffice:BookingChannelInformation'
        purchase_info:
          $ref: '#/components/schemas/Shared:Backoffice:BookingPurchaseInfo'
        center:
          $ref: '#/components/schemas/Shared:Backoffice:BookingCenterMetadata'
        hotel_id:
          description: 'Hotel ID'
          type: string
          example: '1'
        booking_number:
          description: 'Booking ID'
          type: string
          example: '4'
        room_number:
          description: 'Room number'
          type: string
          example: '101'
      type: object
    'Shared:Backoffice:AppointmentBookingAuthor':
      description: 'Booking author information'
      required:
        - uuid
        - full_name
      properties:
        uuid:
          description: 'Author UUID'
          type: string
          example: a1b2c3d4-5678-90ab-cdef-1234567890ab
        full_name:
          $ref: '#/components/schemas/Shared:Generic:FullName'
      type: object
    'Shared:Backoffice:AppointmentAvailability':
      description: 'Availability option for appointment'
      required:
        - service_uuid
        - service_translations
        - service_images
        - service_name
        - duration
        - pax
        - capacity
        - cancellation_policy_collection
      properties:
        service_uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        service_translations:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
        service_images:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindImage'
        service_name:
          description: 'Name of the service'
          type: string
          example: 'Circuito Spa'
        duration:
          description: 'Duration in minutes'
          type: int
          example: 60
        pax:
          description: 'Person/s who will enjoy the service'
          type: int|null
          example: 2
        capacity:
          $ref: '#/components/schemas/Shared:Service:ServiceCapacity'
        cancellation_policy_collection:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Service:AvailabilityCancellation'
      type: object
    'Shared:Backoffice:Appointment':
      description: 'Appointment DTO for Public API response'
      required:
        - uuid
        - dates
        - purchase_info
        - availability
        - penalties
        - client
        - booking_info
        - metadata
        - employee_purchase_comments
      properties:
        uuid:
          type: string
          example: a1b2c3d4-5678-90ab-cdef-1234567890ab
        dates:
          $ref: '#/components/schemas/Shared:Backoffice:AppointmentDates'
        purchase_info:
          $ref: '#/components/schemas/Shared:Backoffice:AppointmentPurchaseInfo'
        availability:
          $ref: '#/components/schemas/Shared:Backoffice:AppointmentAvailability'
        penalties:
          $ref: '#/components/schemas/Shared:Backoffice:AppointmentPenalties'
        client:
          $ref: '#/components/schemas/Shared:Backoffice:AppointmentClient'
        booking_info:
          $ref: '#/components/schemas/Shared:Backoffice:AppointmentBookingInfo'
        metadata:
          $ref: '#/components/schemas/Shared:Backoffice:AppointmentMetadata'
        merchant:
          oneOf:
            -
              $ref: '#/components/schemas/Shared:Backoffice:AppointmentBookingAuthor'
          nullable: true
          description: 'Booking author information'
        employee_purchase_comments:
          $ref: '#/components/schemas/Shared:Backoffice:AppointmentEmployeeComments'
      type: object
    'PublicAPI:Shared:ServiceVoucherPricing':
      description: 'Service pricing for vouchers'
      required:
        - price
        - price_per_person
      properties:
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        price_per_person:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'PublicAPI:Shared:ServiceRelease':
      description: 'Service release configuration'
      required:
        - type
        - value
      properties:
        type:
          type: string
          example: days
        value:
          type: integer
          example: 7
      type: object
    'PublicAPI:Shared:ServicePricing':
      description: 'Service pricing information for vouchers and bookings'
      required:
        - voucher
        - booking
      properties:
        voucher:
          $ref: '#/components/schemas/PublicAPI:Shared:ServiceVoucherPricing'
        booking:
          $ref: '#/components/schemas/PublicAPI:Shared:ServiceBookingPricing'
      type: object
    'PublicAPI:Shared:ServiceHasAvailabilityOn':
      description: 'Date from which the service has availability'
      type: string
      format: date-time
      example: '2024-03-15 10:00:00'
    'PublicAPI:Shared:ServiceCategoryTranslation':
      description: 'Service category translation'
      required:
        - langcode
        - name
        - description
      properties:
        langcode:
          type: string
          example: es
        name:
          type: string
          example: Masajes
        description:
          type: string
          example: 'Categoría de masajes relajantes'
      type: object
    'PublicAPI:Shared:ServiceCategory':
      description: 'Service category with translations and images'
      required:
        - translations
        - images
      properties:
        translations:
          type: array
          items:
            $ref: '#/components/schemas/PublicAPI:Shared:ServiceCategoryTranslation'
        images:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindImage'
      type: object
    'PublicAPI:Shared:ServiceBookingPricing':
      description: 'Service pricing for bookings'
      required:
        - price
        - price_per_person
      properties:
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        price_per_person:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'PublicAPI:Shared:ServiceAvailabilityFind':
      description: 'Response containing availability options for a service'
      required:
        - data
        - meta
      properties:
        data:
          description: 'Array of availability options'
          type: array
          items:
            $ref: '#/components/schemas/PublicAPI:Shared:ServiceAvailability'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'PublicAPI:Shared:ServiceAvailability':
      description: 'Availability option for a service with time slot, pricing and cancellation policies'
      required:
        - fulfillment_on
        - duration_in_minutes
        - service_uuid
        - pricing
        - cancellation_policy_collection
        - is_full_day
      properties:
        fulfillment_on:
          description: 'Date and time of the availability slot in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-01-15 10:00:00'
        duration_in_minutes:
          description: 'Duration of the service in minutes'
          type: integer
          example: 60
        service_uuid:
          description: 'UUID of the service'
          type: string
          format: uuid
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
        pricing:
          $ref: '#/components/schemas/Shared:Service:AvailabilityPricing'
        cancellation_policy_collection:
          description: 'Collection of cancellation policies'
          type: array
          items:
            $ref: '#/components/schemas/Shared:Service:AvailabilityCancellation'
        is_full_day:
          description: 'When true, the slot represents a full-day access (daypass). The fulfillment_on hour is informational (center opening time), not binding.'
          type: boolean
          example: false
      type: object
    'PublicAPI:Shared:Service':
      description: 'Service information with pricing, capacity, and availability details'
      required:
        - uuid
        - spa_uuid
        - status
        - client_time_duration
        - occupancy_type
        - has_availability_on
        - is_full_day
        - pricing
        - release
        - translations
        - capacity
        - category
        - images
        - booking_cancellation_policies
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        spa_uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        status:
          type: string
          example: enable
        client_time_duration:
          type: integer
          example: 60
        occupancy_type:
          type: string
          example: individual
        has_availability_on:
          $ref: '#/components/schemas/PublicAPI:Shared:ServiceHasAvailabilityOn'
        is_full_day:
          type: boolean
          example: false
        pricing:
          $ref: '#/components/schemas/PublicAPI:Shared:ServicePricing'
        release:
          $ref: '#/components/schemas/PublicAPI:Shared:ServiceRelease'
        translations:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
        capacity:
          $ref: '#/components/schemas/Shared:Service:ServiceCapacity'
        category:
          $ref: '#/components/schemas/PublicAPI:Shared:ServiceCategory'
        images:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindImage'
        booking_cancellation_policies:
          type: array
          items:
            $ref: '#/components/schemas/PublicAPI:Shared:BookingCancellationPolicy'
      type: object
    'PublicAPI:Shared:SaleTypes':
      description: 'Sale types with booking and voucher discounts'
      required:
        - booking
        - voucher
      properties:
        booking:
          type: number
          format: float
          example: 0
        voucher:
          type: number
          format: float
          example: 0
      type: object
    'PublicAPI:Shared:PurchaseInfoRemarks':
      required:
        - client
      properties:
        client:
          description: 'Client comment in appointment'
          type: string
          example: 'I want to be attended by the same person as last time'
      type: object
    'PublicAPI:Shared:CenterRegionalConfiguration':
      description: 'Center regional configuration settings'
      required:
        - currency
        - language
        - timezone
        - fiscal_address
      properties:
        currency:
          type: string
          example: EUR
        language:
          type: string
          example: es
        timezone:
          type: string
          example: Europe/Madrid
        fiscal_address:
          type: string
          example: 'Calle Fiscal 456'
      type: object
    'PublicAPI:Shared:CenterLogo':
      description: 'Center logo file information'
      required:
        - fid
        - uri
        - filename
        - description
        - display
        - delta
      properties:
        fid:
          type: integer
          example: 1
        uri:
          type: string
          example: 'public://logo.png'
        filename:
          type: string
          example: logo.png
        description:
          type: string
          example: 'Main logo'
        display:
          type: integer
          example: 1
        delta:
          type: integer
          example: 0
      type: object
    'PublicAPI:Shared:CenterLocalizationData':
      description: 'Center localization and regional configuration'
      required:
        - address
        - city
        - latitude
        - longitude
        - config
      properties:
        address:
          type: string
          example: 'Calle Principal 123'
        city:
          type: string
          example: Madrid
        latitude:
          type: number
          format: float
          example: 40.4168
        longitude:
          type: number
          format: float
          example: -3.7038
        config:
          $ref: '#/components/schemas/PublicAPI:Shared:CenterRegionalConfiguration'
      type: object
    'PublicAPI:Shared:CenterFind':
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/CenterWithServicesAndServicesPackages'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'PublicAPI:Shared:CenterFavicon':
      description: 'Center favicon file information'
      required:
        - fid
        - uri
        - filename
        - description
        - display
        - delta
      properties:
        fid:
          type: integer
          example: 1
        uri:
          type: string
          example: 'public://favicon.ico'
        filename:
          type: string
          example: favicon.ico
        description:
          type: string
          example: 'Main favicon'
        display:
          type: integer
          example: 1
        delta:
          type: integer
          example: 0
      type: object
    'PublicAPI:Shared:Center':
      description: 'Center information with localization, images, and contact details'
      required:
        - uuid
        - name
        - secondary_name
        - description
        - code
        - domain
        - telephone
        - email
        - category
        - localization
        - images
        - favicons
        - logos
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        name:
          type: string
          example: 'Spa Center Name'
        secondary_name:
          type: string
          example: 'Secondary Name'
        description:
          type: string
          example: 'A luxury spa center'
        code:
          type: string
          example: SPA001
        domain:
          type: string
          example: spa.example.com
        telephone:
          type: string
          example: '+34 912 345 678'
        email:
          type: string
          example: contact@spa.com
        category:
          type: string
          example: spa
        localization:
          $ref: '#/components/schemas/PublicAPI:Shared:CenterLocalizationData'
        images:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindImage'
        favicons:
          type: array
          items:
            $ref: '#/components/schemas/PublicAPI:Shared:CenterFavicon'
        logos:
          type: array
          items:
            $ref: '#/components/schemas/PublicAPI:Shared:CenterLogo'
      type: object
    'PublicAPI:Shared:BookingPurchaseInfoRemarks':
      description: 'Client remark for booking'
      required:
        - client
      properties:
        client:
          description: 'Client remark for booking'
          type: string
          example: 'This is a client remark'
      type: object
    'PublicAPI:Shared:BookingPurchaseInfo':
      description: 'Purchase information for booking'
      required:
        - price
        - charged
        - remarks
      properties:
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        charged:
          $ref: '#/components/schemas/Shared:Generic:Price'
        remarks:
          $ref: '#/components/schemas/PublicAPI:Shared:BookingPurchaseInfoRemarks'
      type: object
    'PublicAPI:Shared:BookingDatesDates':
      description: 'Dates for booking'
      required:
        - created
        - accepted
        - paid
        - canceled
      properties:
        created:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
        accepted:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
        paid:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
        canceled:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
      type: object
    'PublicAPI:Shared:BookingDates':
      description: 'Dates and status for booking'
      required:
        - status
        - dates
      properties:
        status:
          type: string
          enum:
            - pending
            - accepted
            - canceled
            - paid
            - invalid
        dates:
          $ref: '#/components/schemas/PublicAPI:Shared:BookingDatesDates'
      type: object
    'PublicAPI:Shared:BookingCreatePurchaseInfo':
      description: 'Information required for create a booking'
      required:
        - price
      properties:
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        remarks:
          oneOf:
            -
              $ref: '#/components/schemas/PublicAPI:Shared:PurchaseInfoRemarks'
          nullable: true
          description: 'Remarks on purchase. Optional, defaults to empty if not provided'
      type: object
    'PublicAPI:Shared:BookingCenterMetadata':
      description: 'Center data in booking'
      required:
        - uuid
        - name
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        name:
          type: string
          example: 'Spa Demo 01'
      type: object
    'PublicAPI:Shared:BookingCancellationPolicy':
      description: 'Booking cancellation policy with type, hours before, and penalty (percentage or fixed price)'
      required:
        - type
      properties:
        type:
          type: string
          enum:
            - free
            - cancellation
            - no-show
          example: free
        hours_before:
          type: integer
          example: 24
          nullable: true
        percentage_to_apply:
          type: integer
          example: 50
          nullable: true
        price:
          oneOf:
            -
              $ref: '#/components/schemas/Shared:Generic:Price'
          nullable: true
      type: object
    'PublicAPI:Shared:Booking':
      description: 'Information required for create a booking'
      required:
        - center_uuid
        - client
        - purchase_info
        - appointments
      properties:
        center_uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        client:
          $ref: '#/components/schemas/Shared:Generic:Client'
        purchase_info:
          $ref: '#/components/schemas/PublicAPI:Shared:BookingCreatePurchaseInfo'
        appointments:
          type: array
          items:
            $ref: '#/components/schemas/PublicAPI:Shared:Appointment'
      type: object
    'PublicAPI:Shared:NullAppointmentPurchaseInfoCancellation':
      description: 'Any appointment cancellation information'
      type: object
    'PublicAPI:Shared:AppointmentPurchaseInfoCancellation':
      description: 'Appointment cancellation information'
      required:
        - price
        - motive
      properties:
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        motive:
          description: 'Motive of the appointment cancellation'
          type: string
          example: 'Could not assist to the appointment'
      type: object
    'PublicAPI:Shared:AppointmentPurchaseInfo':
      description: 'Purchase information for appointment'
      required:
        - price
        - charged
        - fulfillment
        - cancellation
      properties:
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        charged:
          $ref: '#/components/schemas/Shared:Generic:Price'
        fulfillment:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
        cancellation:
          anyOf:
            -
              type: App\B2B\Backend\Context\PublicAPI\Shared\Booking\Application\Find\Response\DTO\Appointment\PurchaseInfo\Cancellation\AppointmentCancellation
            -
              type: App\B2B\Backend\Context\PublicAPI\Shared\Booking\Application\Find\Response\DTO\Appointment\PurchaseInfo\Cancellation\NullAppointmentCancellation
          oneOf:
            -
              $ref: '#/components/schemas/PublicAPI:Shared:AppointmentPurchaseInfoCancellation'
            -
              $ref: '#/components/schemas/PublicAPI:Shared:NullAppointmentPurchaseInfoCancellation'
      type: object
    'PublicAPI:Shared:AppointmentDatesDates':
      description: 'Dates for appointment'
      required:
        - fulfillment
        - created
        - accepted
        - canceled
      properties:
        fulfillment:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
        created:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
        accepted:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
        canceled:
          description: 'Date in format YYYY-MM-DD HH:mm:ss'
          type: string
          example: '2024-03-06 12:00:00'
      type: object
    'PublicAPI:Shared:AppointmentDates':
      description: 'Dates and status for appointment'
      required:
        - status
        - payment_status
        - dates
      properties:
        status:
          type: string
          enum:
            - pending
            - accepted
            - canceled
            - pending_cancelled
            - invalid
        payment_status:
          type: string
          enum:
            - paid
            - not_paid
            - free
            - partial
            - invalid
        dates:
          $ref: '#/components/schemas/PublicAPI:Shared:AppointmentDatesDates'
      type: object
    'PublicAPI:Shared:AppointmentCreatePurchaseInfo':
      description: 'Information required for create an appointment'
      required:
        - price
      properties:
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'PublicAPI:Shared:AppointmentCancellation':
      description: 'Information required for cancelling an appointment'
      required:
        - price
        - motive
      properties:
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        motive:
          description: 'The motive for cancelling the appointment'
          type: string
          example: 'Customer request'
      type: object
    'PublicAPI:Shared:AppointmentAvailability':
      description: 'Availability option for appointment'
      required:
        - service_uuid
        - service_translations
        - service_images
        - service_name
        - duration
        - pax
        - capacity
        - cancellation_policy_collection
      properties:
        service_uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        service_translations:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
        service_images:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindImage'
        service_name:
          description: 'Name of the service'
          type: string
          example: 'Circuito Spa'
        duration:
          description: 'Duration in minutes'
          type: int
          example: 60
        pax:
          description: 'Person/s who will enjoy the service'
          type: int
          example: 2
        capacity:
          $ref: '#/components/schemas/Shared:Service:ServiceCapacity'
        cancellation_policy_collection:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Service:AvailabilityCancellation'
      type: object
    'PublicAPI:Shared:Appointment':
      description: 'Information required for create an appointment'
      required:
        - purchase_info
        - availability
        - pax
      properties:
        purchase_info:
          $ref: '#/components/schemas/PublicAPI:Shared:AppointmentCreatePurchaseInfo'
        availability:
          $ref: '#/components/schemas/Shared:Booking:ServiceAvailabilityRequested'
        pax:
          title: 'Get the value of pax'
          description: 'Number of pax for the appointment'
          type: int
          example: 1
        beneficiary_name:
          title: 'Get the value of beneficiaryName'
          description: 'Name of the person who is the benefit of the appointment'
          type: string
          example: 'Eleazar Perez'
          nullable: true
      type: object
    'PublicAPI:Buyers:BookingFind':
      description: 'Response of booking finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/PublicAPI:Buyers:Booking'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'PublicAPI:Buyers:Booking':
      description: 'Definition of a booking'
      required:
        - uuid
        - password
        - code
        - dates
        - purchase_info
        - appointments
        - center
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        password:
          type: string
          example: 65ca7b
        code:
          type: string
          example: SP-65D8-6B00-D801-F
        groupUUID:
          type: string
          example: 0be60e88-c503-44ad-a46b-73dec89025fe
          nullable: true
        dates:
          $ref: '#/components/schemas/PublicAPI:Shared:BookingDates'
        purchase_info:
          $ref: '#/components/schemas/PublicAPI:Shared:BookingPurchaseInfo'
        appointments:
          type: array
          items:
            $ref: '#/components/schemas/Appointment'
        center:
          $ref: '#/components/schemas/PublicAPI:Shared:BookingCenterMetadata'
      type: object
    'PublicAPI:BookingEngine:GroupMetadata':
      description: 'Group metadata information'
      properties:
        db_id:
          type: integer
          example: 1
          nullable: true
      type: object
    'PublicAPI:BookingEngine:GroupFind':
      description: 'Response containing a list of groups'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/PublicAPI:BookingEngine:Group'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'PublicAPI:BookingEngine:Group':
      description: 'Group information'
      required:
        - uuid
        - name
        - description
        - sale_types
        - anonymous
        - system
        - choosable_in_booking_engine
        - metadata
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        name:
          type: string
          example: 'Clientes VIP'
        description:
          type: string
          example: 'Grupo de clientes preferentes'
        sale_types:
          $ref: '#/components/schemas/PublicAPI:Shared:SaleTypes'
        anonymous:
          type: boolean
          example: false
        system:
          type: boolean
          example: false
        choosable_in_booking_engine:
          type: boolean
          example: true
        metadata:
          $ref: '#/components/schemas/PublicAPI:BookingEngine:GroupMetadata'
      type: object
    'PublicAPI:BookingEngine:ChannelMetadata':
      description: 'Channel metadata information'
      required:
        - db_id
      properties:
        db_id:
          type: integer
          example: 1
      type: object
    'PublicAPI:BookingEngine:ChannelFind':
      description: 'Response containing a list of channels'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/PublicAPI:BookingEngine:Channel'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'PublicAPI:BookingEngine:Channel':
      description: 'Channel information'
      required:
        - uuid
        - name
        - description
        - category
        - alias
        - sale_types
        - system
        - allow_choose_client_group
        - default_client_group
        - metadata
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        name:
          type: string
          example: Spalopia
        description:
          type: string
          example: 'Canal principal de ventas'
        category:
          type: string
          example: direct
        alias:
          type: string
          example: spalopia
        sale_types:
          $ref: '#/components/schemas/PublicAPI:Shared:SaleTypes'
        system:
          type: boolean
          example: false
        allow_choose_client_group:
          type: boolean
          example: false
        default_client_group:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        metadata:
          $ref: '#/components/schemas/PublicAPI:BookingEngine:ChannelMetadata'
      type: object
    'PublicAPI:BookingEngine:BookingFind':
      description: 'Response of booking finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/PublicAPI:BookingEngine:Booking'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'PublicAPI:BookingEngine:Booking':
      description: 'Definition of a booking'
      required:
        - uuid
        - password
        - code
        - channel_uuid
        - dates
        - purchase_info
        - appointments
        - center
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        password:
          type: string
          example: 65ca7b
        code:
          type: string
          example: SP-65D8-6B00-D801-F
        channel_uuid:
          type: string
          example: 5a346cd6-8681-494b-887a-15265dd6ff85
        group_uuid:
          type: string
          example: 0be60e88-c503-44ad-a46b-73dec89025fe
          nullable: true
        dates:
          $ref: '#/components/schemas/PublicAPI:Shared:BookingDates'
        purchase_info:
          $ref: '#/components/schemas/PublicAPI:Shared:BookingPurchaseInfo'
        appointments:
          type: array
          items:
            $ref: '#/components/schemas/Appointment'
        center:
          $ref: '#/components/schemas/PublicAPI:Shared:BookingCenterMetadata'
      type: object
    'PublicAPI:BookingEngine:AppointmentCancellation':
      description: 'Appointment cancellation request with UUID and cancellation details'
      required:
        - uuid
        - price
        - motive
      properties:
        uuid:
          description: 'The uuid of the appointment'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        motive:
          description: 'The motive for cancelling the appointment'
          type: string
          example: 'Customer request'
      type: object
    'POS:Tax:TaxFindResponse':
      description: 'Response of tax finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/POS:Tax:Response'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'POS:PaymentMethod:PaymentMethodFindResponse':
      description: 'Response of payment method finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/POS:PaymentMethod:Response'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'POS:Order:PaymentMethod':
      description: 'Order payment method'
      required:
        - payment_method_name
        - payment_method_type
        - is_voucher
        - is_cash
        - currency
      properties:
        payment_method_name:
          type: string
          example: Efectivo
        payment_method_type:
          type: string
          example: commerce_pos_payment_cash
        is_voucher:
          type: boolean
          example: false
        is_cash:
          type: boolean
          example: true
        currency:
          type: string
          example: EUR
      type: object
    'POS:Order:OrderPaymentMethodFindResponse':
      description: 'Response of order payment method finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/POS:Order:PaymentMethod'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'OpenAccess:BookingEngine:SaleTypes':
      required:
        - booking
        - voucher
      properties:
        booking:
          type: number
          format: float
          example: 0
        voucher:
          type: number
          format: float
          example: 2.5
      type: object
    'OpenAccess:BookingEngine:ChoosableGroup':
      required:
        - uuid
        - name
        - description
        - sale_types
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        name:
          type: string
          example: 'VIP Clients'
        description:
          type: string
          example: 'Clients with preferential treatment'
        sale_types:
          $ref: '#/components/schemas/OpenAccess:BookingEngine:SaleTypes'
      type: object
    'OpenAccess:BookingEngine:ChannelConfiguration':
      required:
        - uuid
        - alias
        - name
        - allow_choose_client_group
        - default_client_group
        - sale_types
        - choosable_groups
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        alias:
          type: string
          example: hotel
        name:
          type: string
          example: 'Hotel Channel'
        allow_choose_client_group:
          type: boolean
          example: true
        default_client_group:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        sale_types:
          $ref: '#/components/schemas/OpenAccess:BookingEngine:SaleTypes'
        choosable_groups:
          type: array
          items:
            $ref: '#/components/schemas/OpenAccess:BookingEngine:ChoosableGroup'
      type: object
    'OpenAccess:BookingEngine:CenterAvailabilityRangeResponse':
      description: 'Response containing availability status per date for both services and service packages of a center'
      required:
        - data
        - meta
      properties:
        data:
          description: 'Dictionary keyed by entity type (services, service_packages). Each entry contains a dictionary of entity UUID to dictionary of date (yyyy-mm-dd) to availability status (boolean). Both keys are always present; when a specific "type" query param is provided, the non-requested key is an empty object.'
          properties:
            services:
              description: 'Dictionary of service UUID to dictionary of date (yyyy-mm-dd) to availability status'
              type: object
              example:
                a1b2c3d4-e5f6-7890-abcd-ef1234567890:
                  '2024-01-15': true
                  '2024-01-16': false
              additionalProperties:
                type: object
                additionalProperties:
                  type: boolean
            service_packages:
              description: 'Dictionary of service package UUID to dictionary of date (yyyy-mm-dd) to availability status'
              type: object
              example:
                b2c3d4e5-f6a7-8901-bcde-f23456789012:
                  '2024-01-15': true
                  '2024-01-16': true
              additionalProperties:
                type: object
                additionalProperties:
                  type: boolean
          type: object
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'CRM:Client:User':
      description: 'User system information of a client'
      required:
        - uuid
        - email
        - status
        - langCode
        - registerDate
      properties:
        uuid:
          description: 'User UUID of a client'
          type: string
          example: e920c2d2-1ffa-4b5f-ae20-e5a5df9185ae
        email:
          description: 'User email of a client'
          type: string
          example: user@gmail.com
        status:
          description: 'User status of a client to check if it is active in bool format'
          type: int
          example: 1
        langCode:
          description: 'User language code chossed by the client in ISO format'
          type: string
          example: es
        registerDate:
          description: 'User register date of a client in timestamp format'
          type: int
          example: 1684969200
      type: object
    'CRM:Client:PersonalData':
      description: 'Personal data information for client'
      required:
        - fullname
        - gender
        - phoneNumber
        - localization_data
        - birthDate
      properties:
        fullname:
          $ref: '#/components/schemas/Shared:Generic:FullName'
        gender:
          description: 'Gender of a client'
          type: string
          enum:
            - M
            - F
            - ''
        phoneNumber:
          description: 'Phone number of a client'
          type: string
          example: '675487215'
        localization_data:
          $ref: '#/components/schemas/CRM:Client:LocalizationData'
        birthDate:
          description: 'Date of birth of a client timestamp format'
          type: int
          example: 1684969200
      type: object
    'CRM:Client:LocalizationData':
      description: 'Localization data information for client'
      required:
        - postalCode
        - address
        - city
        - province
        - country
      properties:
        postalCode:
          description: 'Postal code of a client'
          type: string
          example: '08028'
        address:
          description: 'Address of a client'
          type: string
          example: 'C/ nueva nº2'
        city:
          description: 'City of a client'
          type: string
          example: Barcelona
        province:
          description: 'Province of a client'
          type: string
          example: Barcelona
        country:
          description: 'Country of a client in ISO 2 format'
          type: string
          example: ES
      type: object
    'CRM:Client:HotelBooking':
      description: 'Hotel booking information for client'
      required:
        - UUID
        - externalSystem
        - clientsUUID
        - externalID
        - bookingID
        - roomNumber
        - hotelId
        - checkin
        - checkout
        - paymentsCode
        - data
        - created
        - services
      properties:
        UUID:
          description: 'UUID list of the hotel where the client is staying'
          type: string
          example: 332f3d9e-d12e-4680-9ad2-aefea1ce4722
        externalSystem:
          description: 'Name of the external system through which the hotel booking was made'
          type: string
          example: booking
        clientsUUID:
          description: 'UUID list of the clients to whom the hotel booking belongs'
          type: string
          example:
            - 1e551c4b-7f91-4e60-afb9-129551f06923
            - 29e514d1-6faf-4a34-a12d-d654406e25a5
        externalID:
          description: 'ID of the external system that managed the hotel booking'
          type: string
          example: '1'
        bookingID:
          description: 'Booking ID'
          type: string
          example: '2'
        roomNumber:
          description: 'Hotel booking room number'
          type: string
          example: '22'
        hotelId:
          description: 'Hotel booking ID'
          type: string
          example: '3'
        checkin:
          description: 'Hotel check in date in timestamp format'
          type: int
          example: 1684969200
        checkout:
          description: 'Hotel check out date in timestamp format'
          type: int
          example: 1684969300
        paymentsCode:
          description: 'Booking code list'
          type: string
          example:
            - SPR0000042297
            - SPLM0000043267
        data:
          description: 'Metadata info about the booking hotel'
          type: object
        created:
          description: 'Creation date in a hotel booking'
          type: int
          example: 1684969200
        services:
          description: 'List of uuid and units of services related to hotel booking'
          type: string
          example:
            uuid: a51e6828-3c97-4e8f-a8c8-5ba1391995bd
            units: 2
      type: object
    'CRM:Client:ClientStatsVouchers':
      description: 'Information about the stats of a clients vouchers'
      required:
        - count
        - total_paid
        - vouchersConfirmed
        - vouchersExchanged
        - not_exchange_amount
      properties:
        count:
          description: 'Total number of vouchers for a client'
          type: int
          example: 4
        total_paid:
          $ref: '#/components/schemas/Shared:Generic:Price'
        vouchersConfirmed:
          description: 'Number of vouchers confirmed by the client'
          type: int
          example: 4
        vouchersExchanged:
          description: 'Number of vouchers redeemed by the customer'
          type: int
          example: 2
        not_exchange_amount:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'CRM:Client:ClientStatsPayments':
      description: 'Information about the number of payments and the total amount paid by a customer'
      required:
        - count
        - tota_paid
      properties:
        count:
          description: 'Number of total customer payments'
          type: int
          example: 3
        tota_paid:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'CRM:Client:ClientStatsChannelPayments':
      description: 'UUID and number of payments of a channel made by the client'
      required:
        - uuid
        - count
      properties:
        uuid:
          description: 'Payment identificator'
          type: string
          example: 29e514d1-6faf-4a34-a12d-d654406e25a5
        count:
          description: 'Number of payments'
          type: int
          example: 3
      type: object
    'CRM:Client:ClientStatsAppointments':
      description: 'Information about the stats of a clients appointments'
      required:
        - count
        - total_paid
        - appointmentsConfirmed
        - appointmentsCheckin
        - avg_amount
      properties:
        count:
          description: 'Number of appointments for a client'
          type: int
          example: 3
        total_paid:
          $ref: '#/components/schemas/Shared:Generic:Price'
        appointmentsConfirmed:
          description: 'Number of confirmed appointments for the client'
          type: int
          example: 3
        appointmentsCheckin:
          description: 'Checkin number made by a client'
          type: int
          example: 3
        avg_amount:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'CRM:Client:ClientStats':
      description: 'Information about appointments and vouchers related to the client'
      required:
        - clientUuid
        - payments
        - appointments
        - vouchers
        - paymentsPerChannel
        - cancellations
        - noShows
        - daysBetweenCheckins
        - paymentsConfirmed
        - payments_confirmed
        - lastPaymentDate
        - lastVisitDate
        - nextVisitDate
        - percentageCancellationNotShow
        - visits
      properties:
        clientUuid:
          description: 'UUID of a client'
          type: string
          example: e920c2d2-1ffa-4b5f-ae20-e5a5df9185ae
        payments:
          $ref: '#/components/schemas/CRM:Client:ClientStatsPayments'
        appointments:
          $ref: '#/components/schemas/CRM:Client:ClientStatsAppointments'
        vouchers:
          $ref: '#/components/schemas/CRM:Client:ClientStatsVouchers'
        paymentsPerChannel:
          type: array
          items:
            $ref: '#/components/schemas/CRM:Client:ClientStatsChannelPayments'
        cancellations:
          description: 'Number of client cancellations'
          type: int
          example: 1
        noShows:
          description: 'Number of no-shows at a client appointment'
          type: int
          example: 2
        daysBetweenCheckins:
          description: 'Number of days between check in of a client'
          type: int
          example: 33
        paymentsConfirmed:
          description: 'Number of payments confirmed by the client'
          type: int
          example: 3
        payments_confirmed:
          $ref: '#/components/schemas/Shared:Generic:Price'
        lastPaymentDate:
          description: 'Date the customer made the last payment'
          type: int
          example: 1684969200
        lastVisitDate:
          description: 'Date of the client last visit in timestamp format'
          type: int
          example: 1684969100
        nextVisitDate:
          description: 'Date on which the client will have the next visit in timestamp format'
          type: int
          example: 1684969200
        percentageCancellationNotShow:
          description: 'Percentage of cancellations and no-shows of a client'
          type: int
          example: 25
        visits:
          description: 'Number of visits by a client'
          type: int
          example: 3
      type: object
    'CRM:Client:ClientMetadata':
      description: 'Contains properties of internal interest of the client'
      required:
        - dbId
      properties:
        dbId:
          description: 'Client data base identifier'
          type: int
          example: 2
      type: object
      example:
        db_id: 3
    'CRM:Client:ClientFind':
      description: 'Response of client finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/CRM:Client:Client'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'CRM:Client:ClientBillingMetadata':
      description: 'Billing metadata of a client'
      required:
        - profileID
        - UID
      properties:
        profileID:
          description: 'Profile ID of a client'
          type: int
          example: 2
        UID:
          description: 'UID of a client'
          type: int
          example: 10
      type: object
    'CRM:Client:ClientBillingData':
      description: 'Personal data information for client'
      required:
        - country
        - fullName
        - companyName
        - address
        - province
        - city
        - dni
        - cif
        - postalCode
        - metadata
      properties:
        country:
          description: 'Country of a client in ISO 2 format'
          type: string
          example: ES
        fullName:
          $ref: '#/components/schemas/Shared:Generic:FullName'
        companyName:
          description: 'Billing company name of a client'
          type: string
          example: 'Company S.L'
        address:
          description: 'Billing address of a client'
          type: string
          example: 'C/ nueva nº2'
        province:
          description: 'Billing province of a client'
          type: string
          example: Barcelona
        city:
          description: 'Billing city of a client'
          type: string
          example: Barcelona
        dni:
          description: 'Billing DNI of a client'
          type: string
          example: 74646478-M
        cif:
          description: 'Billing CIF of a client'
          type: string
          example: R8224414F
        postalCode:
          description: 'Billing postal code of a client'
          type: string
          example: '08028'
        metadata:
          $ref: '#/components/schemas/CRM:Client:ClientBillingMetadata'
      type: object
    'CRM:Client:Client':
      description: 'Definition of a client'
      required:
        - groupUUID
        - personal_data
        - description
        - membershipNumber
        - newsletter
        - illness
        - lopd
        - billing
        - user
        - centerUUIDCollection
        - metadata
        - modifiedDate
        - hotel_booking
        - stats
      properties:
        groupUUID:
          description: 'Group UUID of a client'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        personal_data:
          $ref: '#/components/schemas/CRM:Client:PersonalData'
        description:
          description: 'Notes to take into account from the client'
          type: string
          example: 'The client likes cold water.'
        membershipNumber:
          description: 'Membership number of a client'
          type: string
          example: '1234'
        newsletter:
          description: 'Indicator that the client is subscribed to newsletter in bool format'
          type: int
          example: 1
        illness:
          description: 'Indicator that the client has an illness in bool format'
          type: int
          example: 0
        lopd:
          description: 'Indicator that the client has accepted lopd in bool format'
          type: int
          example: 0
        billing:
          $ref: '#/components/schemas/CRM:Client:ClientBillingData'
        user:
          $ref: '#/components/schemas/CRM:Client:User'
        centerUUIDCollection:
          description: 'List with the UUIDs of centers to which a client belongs'
          type: string
          example:
            - 1e551c4b-7f91-4e60-afb9-129551f06923
            - 29e514d1-6faf-4a34-a12d-d654406e25a5
        metadata:
          $ref: '#/components/schemas/CRM:Client:ClientMetadata'
        modifiedDate:
          description: 'Modified date of a client in timestamp format'
          type: int
          example: 1684969200
        hotel_booking:
          $ref: '#/components/schemas/CRM:Client:HotelBooking'
        stats:
          $ref: '#/components/schemas/CRM:Client:ClientStats'
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchaseStartItem':
      description: 'Voucher purchase start item request. Provide either `pax` + `price_per_person` for standard pax-based items, or `session` for session-tier items — never both.'
      required:
        - item_type
        - pax
        - price_per_person
        - extras
      properties:
        item_type:
          type: string
          enum:
            - service
            - service_package
            - gift_card
          example: service
        service_uuid:
          type: string
          format: uuid
          nullable: true
        pax:
          type: integer
          example: 1
        price_per_person:
          $ref: '#/components/schemas/Shared:Generic:Price'
        rate_db_id:
          description: 'Optional custom service rate DB ID. Omit to use the default service rate.'
          type: integer
          example: 42
          nullable: true
        extras:
          type: array
          items:
            type: object
        session:
          oneOf:
            -
              $ref: '#/components/schemas/VoucherPurchaseStartItemSession'
          nullable: true
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchaseStarterResponse':
      required:
        - data
      properties:
        data:
          type: array
          items: {  }
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchaseStart':
      description: 'Voucher purchase start request'
      required:
        - source
        - items
      properties:
        source:
          type: string
          example: booking_engine
        items:
          type: array
          items:
            $ref: '#/components/schemas/BookingEngine:VoucherPurchase:VoucherPurchaseStartItem'
        channel_uuid:
          description: 'Channel UUID. Either channel_uuid or channel_alias_code is required.'
          type: string
          format: uuid
          default: null
          nullable: true
        channel_alias_code:
          description: 'Channel alias code (e.g. "web"). Either channel_uuid or channel_alias_code is required.'
          type: string
          default: null
          example: web
          nullable: true
        group_uuid:
          description: 'Group UUID. If omitted, falls back to group_alias_code or channel default.'
          type: string
          format: uuid
          default: null
          nullable: true
        group_alias_code:
          description: 'Group alias code (e.g. "anonymous"). Falls back to channel default if omitted.'
          type: string
          default: null
          example: anonymous
          nullable: true
        lang_code:
          type: string
          default: null
          example: es
          nullable: true
        buyer:
          oneOf:
            -
              $ref: '#/components/schemas/VoucherPurchaseBuyer'
          nullable: true
          default: null
        client_uuid:
          type: string
          format: uuid
          default: null
          nullable: true
        author_uuid:
          type: string
          format: uuid
          default: null
          nullable: true
        ip:
          type: string
          default: null
          example: 127.0.0.1
          nullable: true
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchaseReconcile':
      description: 'Voucher purchase reconciliation response'
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchasePaymentPrepare':
      required:
        - payment_method_type
        - payment_data
      properties:
        payment_method_type:
          type: string
          example: ManualPaymentMethod
        payment_data:
          type: object
          additionalProperties: true
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchasePaymentConfirm':
      required:
        - payment_data
      properties:
        payment_data:
          type: object
          additionalProperties: true
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchasePaymentAuthorize':
      required:
        - payment_data
      properties:
        payment_data:
          type: object
          additionalProperties: true
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchaseFind':
      description: 'Voucher purchase response'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BookingEngine:VoucherPurchase:VoucherPurchase'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchaseCheckoutConfigurationFind':
      description: 'Voucher purchase checkout configuration'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BookingEngine:VoucherPurchase:VoucherPurchaseCheckoutConfiguration'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchaseCheckoutConfiguration':
      description: 'Voucher purchase checkout configuration'
      required:
        - checkout_fields
        - terms_and_conditions
        - services_conditions
        - billing_info
        - prepayment
        - expiration_rules
        - payment_methods
      properties:
        checkout_fields:
          $ref: '#/components/schemas/Shared:Purchase:PurchaseCheckoutFields'
        terms_and_conditions:
          $ref: '#/components/schemas/Shared:Purchase:TermsAndConditions'
        services_conditions:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Purchase:ServiceConditions'
        billing_info:
          $ref: '#/components/schemas/Shared:Purchase:BillingInfo'
        prepayment:
          $ref: '#/components/schemas/BookingEngine:VoucherPurchase:Prepayment'
        expiration_rules:
          $ref: '#/components/schemas/Shared:Purchase:PurchaseExpirationRules'
        payment_methods:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Purchase:PurchasePaymentMethod'
      type: object
    'BookingEngine:VoucherPurchase:VoucherPurchase':
      description: 'Voucher purchase response'
      type: object
    'BookingEngine:VoucherPurchase:Prepayment':
      description: 'Prepayment configuration — voucher purchases are always full prepayment'
      required:
        - type
      properties:
        type:
          type: string
          example: price
      type: object
    'BookingEngine:Shared:PurchaseFind':
      required:
        - data
        - meta
        - locator
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BookingEngine:Shared:Purchase'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
        locator:
          $ref: '#/components/schemas/Locator'
      type: object
    'BookingEngine:Shared:Purchase':
      required:
        - uuid
        - locator
        - purchase_type
        - status
        - center_uuid
        - resolution
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        locator:
          type: string
          example: R-LSG-5HK3-9PMA-D
        purchase_type:
          type: string
          enum:
            - appointment
            - voucher
          example: appointment
        status:
          type: string
          example: started
        center_uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        resolution:
          $ref: '#/components/schemas/PurchaseResolution'
      type: object
    'BookingEngine:Shared:PaymentConfirmResponse':
      type: object
    'BookingEngine:Service:CartSlot':
      description: 'Cart slot representing a service already added to the cart, used to deduct from availability'
      required:
        - service_uuid
        - fulfillment_on
        - duration
        - pax
      properties:
        service_uuid:
          description: 'UUID of the service'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        fulfillment_on:
          description: 'Date and time of the appointment'
          type: string
          example: '2024-01-01 10:00:00'
        duration:
          description: 'Duration in minutes'
          type: integer
          example: 60
        pax:
          description: 'Number of guests'
          type: integer
          example: 1
        employee_db_id:
          description: 'Employee database ID'
          type: integer
          example: null
          nullable: true
        resource_db_id:
          description: 'Resource database ID'
          type: integer
          example: 1
          nullable: true
      type: object
    'BookingEngine:AppointmentPurchase:VoucherPaymentMethods':
      description: 'Voucher payment methods configuration'
      required:
        - enabled
        - methods
      properties:
        enabled:
          type: boolean
        methods:
          type: array
          items:
            $ref: '#/components/schemas/BookingEngine:AppointmentPurchase:VoucherPaymentMethod'
      type: object
    'BookingEngine:AppointmentPurchase:VoucherPaymentMethod':
      description: 'Voucher payment method with label'
      required:
        - id
        - label
      properties:
        id:
          type: string
          example: utb_commerce_voucher_gift_card
        label:
          type: string
          example: 'Gift card'
      type: object
    'BookingEngine:AppointmentPurchase:StoreCardMethod':
      description: 'Card tokenization method configuration'
      required:
        - notFillCreditCard
      properties:
        gateway:
          type: string
          example: StripePaymentMethod
          nullable: true
        configuration_id:
          type: integer
          example: 1
          nullable: true
        notFillCreditCard:
          type: boolean
      type: object
    'BookingEngine:AppointmentPurchase:Prepayment':
      description: 'Prepayment configuration'
      required:
        - type
        - fixed_price_value
        - is_test
        - prepayment_on_client_confirmation
      properties:
        type:
          type: string
          example: free
        fixed_price_value:
          type: integer
        is_test:
          type: boolean
        prepayment_on_client_confirmation:
          type: string
          example: by_services
      type: object
    'BookingEngine:AppointmentPurchase:ChargeStoredCard':
      description: 'Charge stored card request'
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchaseUpdate':
      description: 'Appointment purchase update request'
      required:
        - buyer
      properties:
        buyer:
          $ref: '#/components/schemas/AppointmentPurchaseBuyer'
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchaseStartSlot':
      description: 'Appointment purchase slot request'
      required:
        - service_uuid
        - fulfillment_on
        - duration
        - pax
        - price_per_person
      properties:
        service_uuid:
          type: string
          format: uuid
        service_package_uuid:
          type: string
          format: uuid
          nullable: true
        employee_db_id:
          type: integer
          nullable: true
        resource_db_id:
          type: integer
          nullable: true
        fulfillment_on:
          type: string
          example: '2024-10-14 10:00:00'
        duration:
          type: integer
          example: 60
        pax:
          type: integer
          example: 1
        price_per_person:
          $ref: '#/components/schemas/Shared:Generic:Price'
        rate_db_id:
          description: 'Optional custom service rate DB ID selected by the buyer. Canonical key: `rate_db_id` (matches `employee_db_id`, `resource_db_id`, and the voucher purchase contract). The legacy key `rate_id` is still accepted as a transitional alias for older clients.'
          type: integer
          example: 84
          nullable: true
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchaseStarterResponse':
      required:
        - data
      properties:
        data:
          type: array
          items: {  }
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchaseStart':
      description: 'Appointment purchase start request'
      required:
        - channel_uuid
        - group_uuid
        - source
        - slots
      properties:
        channel_uuid:
          type: string
          format: uuid
        group_uuid:
          type: string
          format: uuid
        source:
          type: string
          example: booking_engine
        slots:
          type: array
          items:
            $ref: '#/components/schemas/BookingEngine:AppointmentPurchase:AppointmentPurchaseStartSlot'
        is_proposal:
          description: 'Optional frontend hint. When present, the backend validates it matches its own computation and rejects the request on mismatch (422). Absent means no claim.'
          type: boolean
          example: false
          nullable: true
        lang_code:
          type: string
          default: null
          example: es
          nullable: true
        buyer:
          oneOf:
            -
              $ref: '#/components/schemas/AppointmentPurchaseBuyer'
          nullable: true
          default: null
        client_uuid:
          type: string
          format: uuid
          default: null
          nullable: true
        author_uuid:
          type: string
          format: uuid
          default: null
          nullable: true
        ip:
          type: string
          default: null
          example: 127.0.0.1
          nullable: true
        hold_ttl:
          type: integer
          default: null
          example: 900
          nullable: true
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchaseReconcile':
      description: 'Appointment purchase reconciliation response'
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchasePaymentPrepare':
      required:
        - payment_method_type
        - payment_data
      properties:
        payment_method_type:
          type: string
          example: ManualPaymentMethod
        payment_data:
          type: object
          additionalProperties: true
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchasePaymentConfirm':
      required:
        - payment_data
      properties:
        payment_data:
          type: object
          additionalProperties: true
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchasePaymentAuthorize':
      required:
        - payment_data
      properties:
        payment_data:
          type: object
          additionalProperties: true
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchaseFind':
      description: 'Appointment purchase response'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BookingEngine:AppointmentPurchase:AppointmentPurchase'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchaseCheckoutConfigurationFind':
      description: 'Appointment purchase checkout configuration'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BookingEngine:AppointmentPurchase:AppointmentPurchaseCheckoutConfiguration'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchaseCheckoutConfiguration':
      description: 'Appointment purchase checkout configuration'
      required:
        - checkout_fields
        - terms_and_conditions
        - services_conditions
        - service_packages_conditions
        - billing_info
        - prepayment
        - expiration_rules
        - cancellation_rules
        - payment_methods
        - voucher_payment_methods
        - store_card_method
      properties:
        checkout_fields:
          $ref: '#/components/schemas/Shared:Purchase:PurchaseCheckoutFields'
        terms_and_conditions:
          $ref: '#/components/schemas/Shared:Purchase:TermsAndConditions'
        services_conditions:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Purchase:ServiceConditions'
        service_packages_conditions:
          type: array
          items:
            $ref: '#/components/schemas/ServicePackageConditions'
        billing_info:
          $ref: '#/components/schemas/Shared:Purchase:BillingInfo'
        prepayment:
          $ref: '#/components/schemas/BookingEngine:AppointmentPurchase:Prepayment'
        expiration_rules:
          $ref: '#/components/schemas/Shared:Purchase:PurchaseExpirationRules'
        cancellation_rules:
          $ref: '#/components/schemas/Shared:Purchase:CancellationRules'
        payment_methods:
          type: array
          items:
            $ref: '#/components/schemas/Shared:Purchase:PurchasePaymentMethod'
        voucher_payment_methods:
          $ref: '#/components/schemas/BookingEngine:AppointmentPurchase:VoucherPaymentMethods'
        store_card_method:
          $ref: '#/components/schemas/BookingEngine:AppointmentPurchase:StoreCardMethod'
      type: object
    'BookingEngine:AppointmentPurchase:AppointmentPurchase':
      description: 'Appointment purchase response'
      type: object
    'BackOffice:Settings:VoucherPurchaseConfigurationFind':
      description: 'Response of voucher purchase configuration finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Settings:VoucherPurchaseConfiguration'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BackOffice:Settings:VoucherPurchaseConfiguration':
      description: 'Aggregated voucher purchase configuration'
      properties:
        expiration:
          oneOf:
            -
              $ref: '#/components/schemas/BackOffice:Settings:PurchaseDatesRules'
          nullable: true
        terms:
          oneOf:
            -
              $ref: '#/components/schemas/Shared:Purchase:TermsAndConditions'
          nullable: true
      type: object
    'BackOffice:Settings:PurchaseDatesRules':
      description: 'Purchase dates rules (expiration + cancellation configuration)'
      required:
        - expiration
        - cancellation
      properties:
        expiration:
          $ref: '#/components/schemas/Shared:Purchase:PurchaseExpirationRules'
        cancellation:
          $ref: '#/components/schemas/Shared:Purchase:CancellationRules'
      type: object
    'BackOffice:Settings:Proposal':
      description: 'Appointment proposal configuration'
      required:
        - prepayment_on_client_confirmation
      properties:
        prepayment_on_client_confirmation:
          type: string
          example: by_services
      type: object
    'BackOffice:Settings:CheckMoney':
      description: 'Prepayment (check money) configuration'
      required:
        - type
        - fixed_price_value
        - is_test
      properties:
        type:
          type: string
          example: free
        fixed_price_value:
          type: integer
        is_test:
          type: boolean
      type: object
    'BackOffice:Settings:BookingPurchaseConfigurationFind':
      description: 'Response of booking purchase configuration finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Settings:BookingPurchaseConfiguration'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BackOffice:Settings:BookingPurchaseConfiguration':
      description: 'Aggregated booking purchase configuration'
      properties:
        proposal:
          oneOf:
            -
              $ref: '#/components/schemas/BackOffice:Settings:Proposal'
          nullable: true
        billing:
          oneOf:
            -
              $ref: '#/components/schemas/Shared:Purchase:BillingInfo'
          nullable: true
        check_money:
          oneOf:
            -
              $ref: '#/components/schemas/BackOffice:Settings:CheckMoney'
          nullable: true
        expiration:
          oneOf:
            -
              $ref: '#/components/schemas/BackOffice:Settings:PurchaseDatesRules'
          nullable: true
        cancellation:
          oneOf:
            -
              $ref: '#/components/schemas/BackOffice:Settings:PurchaseDatesRules'
          nullable: true
        terms:
          oneOf:
            -
              $ref: '#/components/schemas/Shared:Purchase:TermsAndConditions'
          nullable: true
      type: object
    'BackOffice:ServicePackage:CalculateServicePackageAvailabilityOptionsDateRange':
      description: 'Date range for availability calculation'
      required:
        - from
        - to
      properties:
        from:
          description: 'Start date for availability calculation in format yyyy-mm-dd'
          type: string
          format: date
          example: '2024-01-01'
        to:
          description: 'End date for availability calculation in format yyyy-mm-dd'
          type: string
          format: date
          example: '2024-01-31'
      type: object
    'BackOffice:Service:CalculateServiceAvailabilityOptions':
      description: 'Date range for calculating service availability options'
      required:
        - from
        - to
      properties:
        from:
          description: 'Start date'
          type: string
          example: '2024-01-01'
        to:
          description: 'End date'
          type: string
          example: '2024-01-31'
      type: object
    'BackOffice:PaymentConfiguration:Update':
      description: 'Payment configuration update data'
      required:
        - context
        - namespace
        - section
        - data
        - updated
      properties:
        context:
          type: string
          example: '10'
        namespace:
          type: string
          example: payment_methods
        section:
          type: string
          example: general
        data:
          type: object
          example:
            key: value
          additionalProperties: true
        updated:
          type: integer
          example: 1700000000
      type: object
    'BackOffice:PaymentConfiguration:FindResponse':
      description: 'Payment configuration list response'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:PaymentConfiguration:Find'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BackOffice:PaymentConfiguration:Find':
      description: 'Payment configuration response data'
      required:
        - context
        - namespace
        - section
        - data
        - updated
      properties:
        context:
          type: string
          example: '10'
        namespace:
          type: string
          example: payment_methods
        section:
          type: string
          example: general
        data:
          type: object
          example:
            key: value
          additionalProperties: true
        updated:
          type: integer
          example: 1700000000
      type: object
    'BackOffice:PaymentConfiguration:Delete':
      description: 'Payment configuration deletion data'
      required:
        - context
        - namespace
        - section
      properties:
        context:
          type: string
          example: '10'
        namespace:
          type: string
          example: payment_methods
        section:
          type: string
          example: general
      type: object
    'BackOffice:PaymentConfiguration:CreateResponse':
      description: 'Payment configuration creation response data'
      required:
        - context
        - namespace
        - section
      properties:
        context:
          type: string
          example: '10'
        namespace:
          type: string
          example: payment_methods
        section:
          type: string
          example: general
      type: object
    'BackOffice:PaymentConfiguration:Create':
      description: 'Payment configuration creation data'
      required:
        - context
        - namespace
        - section
        - data
        - updated
      properties:
        context:
          type: string
          example: '10'
        namespace:
          type: string
          example: payment_methods
        section:
          type: string
          example: general
        data:
          type: object
          example:
            key: value
          additionalProperties: true
        updated:
          type: integer
          example: 1700000000
      type: object
    'BackOffice:Me:MeFind':
      description: 'Response of authenticated user profile'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Me:Me'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BackOffice:Me:Me':
      description: 'Authenticated user profile'
      required:
        - uuid
        - email
        - name
        - surname
        - lang
        - avatar
        - brand_uuid
        - accessible_centers
      properties:
        uuid:
          description: 'User UUID'
          type: string
          example: 00000000-ffdb-4454-9aa0-bb7f1c0db391
        email:
          description: 'User email'
          type: string
          example: employee@spalopia.com
        name:
          description: 'User first name'
          type: string
          example: John
        surname:
          description: 'User last name'
          type: string
          example: Doe
        lang:
          description: 'User language code'
          type: string
          example: es
        avatar:
          description: 'User avatar URL'
          type: string
          example: ''
        brand_uuid:
          description: 'Brand UUID'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        accessible_centers:
          description: 'Centers accessible by the user'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Me:AccessibleCenter'
      type: object
    'BackOffice:Me:AccessibleCenter':
      description: 'Accessible center for the authenticated user'
      required:
        - uuid
        - db_id
      properties:
        uuid:
          description: 'Center UUID'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        db_id:
          description: 'Center database ID'
          type: integer
          example: 10
      type: object
    'BackOffice:Bootstrap:BootstrapNonCenterFind':
      description: 'Response of bootstrap finder for hotel/property-group'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Bootstrap:FindNonCenter'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BackOffice:Bootstrap:BootstrapFind':
      description: 'Response of bootstrap finder'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Bootstrap:Find'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BackOffice:Booking:BookingRevisionFind':
      required:
        - data
      properties:
        data:
          type: array
          items: {  }
      type: object
    'Agenda:ScheduleType:ScheduleTypeFindResponse':
      required:
        - data
      properties:
        data:
          type: array
          items: {  }
      type: object
    'Agenda:Resource:ResourceFindResponse':
      required:
        - data
      properties:
        data:
          type: array
          items: {  }
      type: object
    'Agenda:Employee:EmployeeFinderLegacyResponse':
      required:
        - data
      properties:
        data:
          type: array
          items: {  }
      type: object
    'BackOffice:NotificationEmail:Update':
      required:
        - id
        - title
        - type
        - context
        - enable
        - entity_type
        - entity_id
        - is_system
        - info
        - center_uuid
      properties:
        id:
          type: integer
          example: 1
        title:
          type: string
          example: 'Booking confirmation'
        type:
          type: string
          example: booking
        context:
          type: string
          example: ''
        enable:
          type: boolean
          example: true
        entity_type:
          type: string
          example: ''
        entity_id:
          type: integer
          example: 0
        is_system:
          type: boolean
          example: false
        info:
          type: string
          example: ''
        center_uuid:
          type: string
          format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
      type: object
    'BackOffice:NotificationEmail:Find':
      required:
        - id
        - title
        - type
        - context
        - enable
        - entity_type
        - entity_id
        - is_system
        - info
      properties:
        id:
          type: integer
          example: 1
        title:
          type: string
          example: 'Booking confirmation'
        type:
          type: string
          example: booking
        context:
          type: string
          example: ''
        enable:
          type: boolean
          example: true
        entity_type:
          type: string
          example: ''
        entity_id:
          type: integer
          example: 0
        is_system:
          type: boolean
          example: false
        info:
          type: string
          example: ''
      type: object
    'BackOffice:NotificationEmail:CreateResponse':
      required:
        - id
      properties:
        id:
          type: integer
          example: 1
      type: object
    'BackOffice:NotificationEmail:Create':
      required:
        - title
        - type
        - context
        - enable
        - entity_type
        - entity_id
        - is_system
        - info
        - center_uuid
      properties:
        title:
          type: string
          example: 'Booking confirmation'
        type:
          type: string
          example: booking
        context:
          type: string
          example: ''
        enable:
          type: boolean
          example: true
        entity_type:
          type: string
          example: ''
        entity_id:
          type: integer
          example: 0
        is_system:
          type: boolean
          example: false
        info:
          type: string
          example: ''
        center_uuid:
          type: string
          format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
      type: object
    'BackOffice:EmailTemplate:Update':
      required:
        - name
        - subject
        - body_html
        - body_text
        - type
        - locale
        - is_active
      properties:
        name:
          type: string
          example: booking_confirmation_en
        subject:
          type: string
          example: 'Your booking confirmation'
        body_html:
          type: string
          example: '<h1>Booking Confirmed</h1>'
        body_text:
          type: string
          example: 'Booking Confirmed'
        type:
          type: string
          example: booking_confirmation
        locale:
          type: string
          example: en
        is_active:
          type: boolean
          example: true
      type: object
    'BackOffice:EmailTemplate:Find':
      required:
        - uuid
        - center_uuid
        - name
        - subject
        - body_html
        - body_text
        - type
        - locale
        - is_active
      properties:
        db_id:
          type: integer
          example: 1
          nullable: true
        uuid:
          type: string
          format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
        center_uuid:
          type: string
          format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
        name:
          type: string
          example: booking_confirmation_en
        subject:
          type: string
          example: 'Your booking confirmation'
        body_html:
          type: string
          example: '<h1>Booking Confirmed</h1>'
        body_text:
          type: string
          example: 'Booking Confirmed'
        type:
          type: string
          example: booking_confirmation
        locale:
          type: string
          example: en
        is_active:
          type: boolean
          example: true
        created_at:
          type: string
          format: date-time
          nullable: true
        updated_at:
          type: string
          format: date-time
          nullable: true
      type: object
    'BackOffice:EmailTemplate:CreateResponse':
      required:
        - uuid
      properties:
        uuid:
          type: string
          format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
      type: object
    'BackOffice:EmailTemplate:Create':
      required:
        - name
        - subject
        - body_html
        - body_text
        - type
        - locale
        - is_active
      properties:
        name:
          type: string
          example: booking_confirmation_en
        subject:
          type: string
          example: 'Your booking confirmation'
        body_html:
          type: string
          example: '<h1>Booking Confirmed</h1>'
        body_text:
          type: string
          example: 'Booking Confirmed'
        type:
          type: string
          example: booking_confirmation
        locale:
          type: string
          example: en
        is_active:
          type: boolean
          example: true
      type: object
    'Agenda:Backup:Send':
      required:
        - email
        - file_content
        - file_name
      properties:
        email:
          type: string
          format: email
          example: user@example.com
        file_content:
          description: 'Base64 encoded file content'
          type: string
        file_name:
          type: string
          example: appointments-2024-01-15.xlsx
      type: object
    'CRM:Role:Update':
      description: 'Role update data'
      required:
        - uuid
        - name
      properties:
        uuid:
          $ref: '#/components/schemas/RoleUUID'
        name:
          type: string
          example: 'spa manager'
      type: object
    'CRM:Role:CreateResponse':
      description: 'Role creation response data'
      required:
        - uuid
      properties:
        uuid:
          type: string
          example: 550e8400-e29b-41d4-a716-446655440000
      type: object
    'CRM:Role:Create':
      description: 'Role creation data'
      required:
        - name
      properties:
        name:
          type: string
          example: 'spa reception'
      type: object
    'CRM:Role:AssignPermission':
      description: 'Assign permissions to a role'
      required:
        - roleUUID
        - permissions
      properties:
        roleUUID:
          $ref: '#/components/schemas/RoleUUID'
        permissions:
          type: array
          items:
            type: string
          example:
            - EmployeeCreateCommand
            - EmployeeUpdateCommand
      type: object
    'POS:Tax:Response':
      description: 'Tax response data'
      required:
        - name
        - title
        - display_title
        - description
        - rate
        - type
        - default_rules_component
        - module
      properties:
        name:
          type: string
          example: iva
        title:
          type: string
          example: 'IVA General 21%'
        display_title:
          type: string
          example: 'IVA General 21%'
        description:
          type: string
          example: 'Impuesto sobre el valor añadido'
        rate:
          type: number
          example: 0.21
        type:
          type: string
          example: vat
        default_rules_component:
          type: boolean
          example: true
        module:
          type: string
          example: commerce_tax_ui
      type: object
    'POS:Tax:Update':
      description: 'Tax update data'
      required:
        - centerUUID
        - name
        - title
        - display_title
        - description
        - rate
        - type
        - default_rules_component
        - module
      properties:
        centerUUID:
          $ref: '#/components/schemas/CenterUUID'
        name:
          $ref: '#/components/schemas/TaxName'
        title:
          type: string
          example: 'IVA Updated 10%'
        display_title:
          type: string
          example: 'IVA Updated 10%'
        description:
          type: string
          example: 'Updated VAT rate'
        rate:
          type: number
          example: 0.1
        type:
          type: string
          example: vat
        default_rules_component:
          type: boolean
          example: false
        module:
          type: string
          example: commerce_tax_ui
      type: object
    'POS:Tax:CreateResponse':
      description: 'Tax creation response data'
      required:
        - name
      properties:
        name:
          type: string
          example: iva
      type: object
    'POS:Tax:Create':
      description: 'Tax creation data'
      required:
        - centerUUID
        - name
        - title
        - display_title
        - description
        - rate
        - type
        - default_rules_component
        - module
      properties:
        centerUUID:
          $ref: '#/components/schemas/CenterUUID'
        name:
          type: string
          example: iva_custom
        title:
          type: string
          example: 'IVA Custom 15%'
        display_title:
          type: string
          example: 'IVA Custom 15%'
        description:
          type: string
          example: 'Custom VAT rate'
        rate:
          type: number
          example: 0.15
        type:
          type: string
          example: vat
        default_rules_component:
          type: boolean
          example: false
        module:
          type: string
          example: commerce_tax_ui
      type: object
    'BackOffice:ServiceExtra:Update':
      description: 'Service extra update data'
      required:
        - sys_name
        - translation_collection
        - is_lock
      properties:
        sys_name:
          type: string
          example: aromatherapy
        translation_collection:
          type: array
          items:
            type: object
            additionalProperties: true
        is_lock:
          type: boolean
          example: false
      type: object
    'BackOffice:ServiceExtra:Find':
      description: 'Service extra response data'
      required:
        - db_id
        - sys_name
        - translation_collection
        - is_lock
      properties:
        db_id:
          type: integer
          example: 1
        sys_name:
          type: string
          example: aromatherapy
        translation_collection:
          type: array
          items:
            type: object
            additionalProperties: true
        is_lock:
          type: boolean
          example: false
      type: object
    'BackOffice:ServiceExtra:CreateResponse':
      description: 'Service extra creation response data'
      required:
        - db_id
      properties:
        db_id:
          type: integer
          example: 1
      type: object
    'BackOffice:ServiceExtra:Create':
      description: 'Service extra creation data'
      required:
        - sys_name
        - translation_collection
        - is_lock
      properties:
        sys_name:
          type: string
          example: aromatherapy
        translation_collection:
          type: array
          items:
            type: object
            additionalProperties: true
        is_lock:
          type: boolean
          example: false
      type: object
    'POS:Product:Response':
      description: 'Product response data'
      required:
        - sku
        - title
        - type
        - status
        - center_db_id
        - price
        - metadata
      properties:
        sku:
          description: 'Product SKU code'
          type: string
          example: SKU-001
        title:
          description: 'Product title'
          type: string
          example: 'Product Name'
        type:
          description: 'Product type. Possible values: product.'
          type: string
          enum:
            - product
          example: product
        status:
          description: 'Product active status'
          type: boolean
          example: true
        center_db_id:
          description: 'Center database ID'
          type: integer
          example: 10
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        metadata:
          description: 'Product metadata'
          type: object
      type: object
    'POS:Product:Update':
      description: 'Product update data'
      required:
        - id
        - center_uuid
        - sku
        - title
        - status
        - price
      properties:
        id:
          description: 'Product database ID'
          type: integer
          example: 1
        center_uuid:
          description: 'Center UUID'
          type: string
          format: uuid
        sku:
          description: 'Product SKU code'
          type: string
          example: SKU-001
        title:
          description: 'Product title'
          type: string
          example: 'Massage Oil'
        status:
          description: 'Product active status'
          type: boolean
          example: true
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'POS:Product:CreateResponse':
      description: 'Product creation response data'
      required:
        - db_id
      properties:
        db_id:
          description: 'Database ID of the created product'
          type: integer
          example: 1
      type: object
    'POS:Product:Create':
      description: 'Product creation data'
      required:
        - centerUUID
        - sku
        - title
        - type
        - status
        - price
        - productType
      properties:
        centerUUID:
          $ref: '#/components/schemas/CenterUUID'
        sku:
          description: 'Product SKU code'
          type: string
          example: SKU-001
        title:
          description: 'Product title'
          type: string
          example: 'Massage Oil'
        type:
          description: 'Product type'
          type: string
          enum:
            - product
          example: product
        status:
          description: 'Product active status'
          type: boolean
          example: true
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        productType:
          $ref: '#/components/schemas/ProductType'
      type: object
    'POS:PaymentMethod:Response':
      description: 'Payment method response data'
      required:
        - id
        - title
        - description
        - status
        - checkout
        - terminal
        - refund
        - has_id_transaction
        - is_voucher
      properties:
        id:
          type: string
          example: cash
        title:
          type: string
          example: Efectivo
        description:
          type: string
          example: 'Pago en efectivo'
        status:
          type: boolean
          example: true
        checkout:
          type: boolean
          example: true
        terminal:
          type: boolean
          example: true
        refund:
          type: boolean
          example: true
        has_id_transaction:
          type: boolean
          example: false
        is_voucher:
          type: boolean
          example: false
      type: object
    'POS:PaymentMethod:Update':
      description: 'Payment method update data'
      required:
        - code
        - title
        - description
        - status
        - checkout
        - terminal
        - refund
        - has_id_transaction
        - is_voucher
      properties:
        code:
          $ref: '#/components/schemas/PaymentMethodCode'
        title:
          type: string
          example: Efectivo
        description:
          type: string
          example: 'Pago en efectivo'
        status:
          type: boolean
          example: true
        checkout:
          type: boolean
          example: true
        terminal:
          type: boolean
          example: true
        refund:
          type: boolean
          example: true
        has_id_transaction:
          type: boolean
          example: false
        is_voucher:
          type: boolean
          example: false
      type: object
    'POS:PaymentMethod:CreateResponse':
      description: 'Payment method creation response data'
      required:
        - id
      properties:
        id:
          type: string
          example: cash
      type: object
    'POS:PaymentMethod:Create':
      description: 'Payment method creation data'
      required:
        - id
        - title
        - description
        - status
        - checkout
        - terminal
        - refund
        - has_id_transaction
        - is_voucher
      properties:
        id:
          description: 'Optional. Auto-generated from title if not provided.'
          type: string
          example: cash
        title:
          type: string
          example: Efectivo
        description:
          type: string
          example: 'Pago en efectivo'
        status:
          type: boolean
          example: true
        checkout:
          type: boolean
          example: true
        terminal:
          type: boolean
          example: true
        refund:
          type: boolean
          example: true
        has_id_transaction:
          type: boolean
          example: false
        is_voucher:
          type: boolean
          example: false
      type: object
    'POS:Order:Response':
      required:
        - order_id
        - order_number
        - type
        - uid
        - mail
        - status
        - created
        - changed
        - placed
        - hostname
        - data
        - utb_commerce_entity_id
        - utb_commerce_entity_type
      properties:
        order_id:
          type: integer
          example: 1
        order_number:
          type: string
          example: ORD-001
        type:
          type: string
          example: commerce_order
        uid:
          type: integer
          example: 1
        mail:
          type: string
          example: test@example.com
        status:
          type: string
          example: pending
        created:
          type: integer
          example: 1700000000
        changed:
          type: integer
          example: 1700000000
        placed:
          type: integer
          example: 1700000000
        hostname:
          type: string
          example: 127.0.0.1
        data:
          type: object
        utb_commerce_entity_id:
          type: integer
          example: 10
        utb_commerce_entity_type:
          type: string
          example: rfh_spa
        utb_document_type:
          type: string
          example: invoice
          nullable: true
        utb_state:
          type: string
          example: active
          nullable: true
        order_total:
          oneOf:
            -
              $ref: '#/components/schemas/OrderTotal'
          nullable: true
        invoice_date:
          type: integer
          example: 1700000000
          nullable: true
        cancel_date:
          type: integer
          example: 1700000000
          nullable: true
      type: object
    'POS:Order:Update':
      required:
        - order_number
        - type
        - uid
        - mail
        - status
        - created
        - changed
        - placed
        - hostname
        - data
        - utb_commerce_entity_id
        - utb_commerce_entity_type
      properties:
        order_number:
          type: string
        type:
          type: string
        uid:
          type: integer
        mail:
          type: string
        status:
          type: string
        created:
          type: integer
        changed:
          type: integer
        placed:
          type: integer
        hostname:
          type: string
        data:
          type: object
        utb_commerce_entity_id:
          type: integer
        utb_commerce_entity_type:
          type: string
        utb_document_type:
          type: string
          nullable: true
        utb_state:
          type: string
          nullable: true
        order_total:
          oneOf:
            -
              $ref: '#/components/schemas/OrderTotal'
          nullable: true
        invoice_date:
          type: integer
          nullable: true
        cancel_date:
          type: integer
          nullable: true
      type: object
    'POS:Order:CreateResponse':
      required:
        - order_id
      properties:
        order_id:
          type: integer
          example: 1
      type: object
    'POS:Order:Create':
      required:
        - order_number
        - type
        - uid
        - mail
        - status
        - created
        - changed
        - placed
        - hostname
        - data
        - utb_commerce_entity_id
        - utb_commerce_entity_type
      properties:
        order_number:
          type: string
          example: ORD-001
        type:
          type: string
          example: commerce_order
        uid:
          type: integer
          example: 1
        mail:
          type: string
          example: test@example.com
        status:
          type: string
          example: pending
        created:
          type: integer
          example: 1700000000
        changed:
          type: integer
          example: 1700000000
        placed:
          type: integer
          example: 1700000000
        hostname:
          type: string
          example: 127.0.0.1
        data:
          type: object
        utb_commerce_entity_id:
          type: integer
          example: 10
        utb_commerce_entity_type:
          type: string
          example: rfh_spa
        utb_document_type:
          type: string
          example: invoice
          nullable: true
        utb_state:
          type: string
          example: active
          nullable: true
        order_total:
          oneOf:
            -
              $ref: '#/components/schemas/OrderTotal'
          nullable: true
        invoice_date:
          type: integer
          example: 1700000000
          nullable: true
        cancel_date:
          type: integer
          example: 1700000000
          nullable: true
      type: object
    'BackOffice:Settings:Configuration':
      required:
        - context
        - section
        - center_uuid
        - values
        - data
      properties:
        context:
          description: 'Configuration context identifier'
          type: string
        section:
          description: 'Configuration section identifier'
          type: string
        center_uuid:
          description: 'UUID of the center this configuration belongs to'
          type: string
        values:
          description: 'Configuration key/value pairs for the requested setting'
          type: object
          additionalProperties: true
        data:
          type: array
          items: {  }
      type: object
    'BackOffice:ServicePackage:Update':
      description: 'Service package data for update operations'
      required:
        - status
        - order
        - availability_configuration
        - services
        - price
        - capacity
        - online_booking_available
        - online_voucher_available
        - prepayment_required
        - release
        - expiration_rule
        - translations
        - offers
        - images
        - channels_configuration
        - groups_configuration
      properties:
        status:
          description: 'Service package status'
          type: string
          enum:
            - enable
            - disable
          example: enable
        order:
          description: 'Display order'
          type: number
          example: 1
        availability_configuration:
          $ref: '#/components/schemas/BackOffice:ServicePackage:FindAvailabilityConfiguration'
        services:
          description: 'Services included in the package'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindServiceItem'
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        capacity:
          description: 'Maximum capacity'
          type: integer
          example: 4
        online_booking_available:
          description: 'Enable online booking'
          type: boolean
          example: true
        online_voucher_available:
          description: 'Enable online voucher purchase'
          type: boolean
          example: false
        prepayment_required:
          description: 'Require prepayment'
          type: boolean
          example: true
        release:
          $ref: '#/components/schemas/BackOffice:ServicePackage:FindRelease'
        expiration_rule:
          $ref: '#/components/schemas/BackOffice:ServicePackage:FindExpiration'
        translations:
          description: 'Service package translations'
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
        offers:
          description: 'Offers for the service package'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindOffer'
        images:
          description: 'Images associated with the service package'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindImage'
        channels_configuration:
          description: 'Channel-specific configuration'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindChannelConfiguration'
        groups_configuration:
          description: 'Group-specific configuration'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindGroupConfiguration'
      type: object
    'BackOffice:ServicePackage:FindServiceItem':
      description: 'Service included in a service package'
      required:
        - uuid
        - people
        - price
        - price_per_person
        - metadata
      properties:
        uuid:
          description: 'Service UUID'
          type: string
          example: b2c3d4e5-6789-2345-abcd-ef0123456789
        people:
          description: 'Number of people for this service'
          type: integer
          example: 2
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        price_per_person:
          $ref: '#/components/schemas/Shared:Generic:Price'
        metadata:
          description: 'Service metadata'
          properties:
            db_id:
              description: 'Service package-service relation database ID'
              type: integer
              example: 1
            service_db_id:
              description: 'Service database ID'
              type: integer
              example: 10
          type: object
      type: object
    'BackOffice:ServicePackage:FindRelease':
      description: 'Release configuration for a service package'
      required:
        - type
        - value
      properties:
        type:
          description: 'Release type'
          type: string
          example: hours
        value:
          description: 'Release value'
          type: integer
          example: 24
      type: object
    'BackOffice:ServicePackage:FindOffer':
      description: 'Offer for a service package'
      required:
        - start_date
        - end_date
        - monday
        - tuesday
        - wednesday
        - thursday
        - friday
        - saturday
        - sunday
        - discount_mode
        - spa_discount_value
        - bono_discount_value
      properties:
        start_date:
          description: 'Offer start date'
          type: string
          example: '2024-01-01'
        end_date:
          description: 'Offer end date'
          type: string
          example: '2024-12-31'
        monday:
          description: 'Offer applies on Monday'
          type: boolean
          example: true
        tuesday:
          description: 'Offer applies on Tuesday'
          type: boolean
          example: true
        wednesday:
          description: 'Offer applies on Wednesday'
          type: boolean
          example: true
        thursday:
          description: 'Offer applies on Thursday'
          type: boolean
          example: true
        friday:
          description: 'Offer applies on Friday'
          type: boolean
          example: true
        saturday:
          description: 'Offer applies on Saturday'
          type: boolean
          example: false
        sunday:
          description: 'Offer applies on Sunday'
          type: boolean
          example: false
        discount_mode:
          description: 'Discount mode applied'
          type: string
          example: percentage
        spa_discount_value:
          description: 'Spa booking discount value'
          type: number
          format: float
          example: 10
        bono_discount_value:
          description: 'Voucher discount value'
          type: number
          format: float
          example: 5
        start_time:
          description: 'Offer start time. Null if all day'
          type: string
          example: '09:00'
          nullable: true
        end_time:
          description: 'Offer end time. Null if all day'
          type: string
          example: '18:00'
          nullable: true
      type: object
    'BackOffice:ServicePackage:FindMetadata':
      description: 'Metadata for a service package'
      required:
        - db_id
      properties:
        db_id:
          description: 'Database ID'
          type: integer
          example: 42
      type: object
    'BackOffice:ServicePackage:FindImage':
      required:
        - uuid
        - relation_type
        - order
        - file
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        relation_type:
          type: string
          example: images
        order:
          type: int
          example: 1
        file:
          $ref: '#/components/schemas/Shared:Generic:File'
      type: object
    'BackOffice:ServicePackage:FindGroupConfiguration':
      description: 'Group-specific configuration for a service package'
      required:
        - uuid
        - id
        - enable
        - base_price
      properties:
        uuid:
          description: 'Group UUID'
          type: string
          example: 8eda3a47-93c8-4b02-a663-dd3acb6302dd
        id:
          description: 'Group database ID'
          type: integer
          example: 1
        enable:
          description: 'Whether the package is enabled for this group'
          type: boolean
          example: true
        base_price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        capacity:
          description: 'Group-specific capacity. Null inherits from package'
          type: integer
          example: null
          nullable: true
      type: object
    'BackOffice:ServicePackage:FindExpiration':
      description: 'Expiration configuration for a service package'
      required:
        - type
        - months
        - weeks
        - days
        - hours
      properties:
        type:
          description: 'Expiration type (disable, never, day, purchase_date)'
          type: string
          example: purchase_date
        months:
          description: 'Months until expiration'
          type: integer
          example: 6
        weeks:
          description: 'Weeks until expiration'
          type: integer
          example: 0
        days:
          description: 'Days until expiration'
          type: integer
          example: 0
        hours:
          description: 'Hours until expiration'
          type: integer
          example: 0
        time:
          description: 'Expiration time as timestamp. Null for purchase_date expiration'
          type: integer
          example: null
          nullable: true
      type: object
    'BackOffice:ServicePackage:FindChannelConfiguration':
      description: 'Channel-specific configuration for a service package'
      required:
        - uuid
        - id
        - enable
        - base_price
      properties:
        uuid:
          description: 'Channel UUID'
          type: string
          example: c1d2e3f4-5678-1234-abcd-ef0123456789
        id:
          description: 'Channel database ID'
          type: integer
          example: 1
        enable:
          description: 'Whether the package is enabled for this channel'
          type: boolean
          example: true
        base_price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        capacity:
          description: 'Channel-specific capacity. Null inherits from package'
          type: integer
          example: 4
          nullable: true
      type: object
    'BackOffice:ServicePackage:FindAvailabilityConfiguration':
      description: 'Availability configuration for a service package'
      required:
        - times_between_services
        - allow_other_combinations
      properties:
        times_between_services:
          description: 'Available times between services in minutes'
          type: array
          items:
            type: integer
          example:
            - 0
            - 5
            - 10
            - 15
        allow_other_combinations:
          description: 'Whether other service combinations are allowed'
          type: boolean
          example: true
        has_availability_on:
          description: 'Number of days with availability. Null if not calculated'
          type: integer
          example: 7
          nullable: true
      type: object
    'BackOffice:ServicePackage:Find':
      description: 'Service package data returned by GET endpoint'
      required:
        - uuid
        - spa_uuid
        - status
        - order
        - availability_configuration
        - services
        - total_client_time_duration
        - price
        - capacity
        - online_booking_available
        - online_voucher_available
        - prepayment_required
        - release
        - expiration_rule
        - translations
        - offers
        - images
        - channels_configuration
        - groups_configuration
        - metadata
      properties:
        uuid:
          description: 'Service package UUID'
          type: string
          example: a1b2c3d4-5678-1234-9abc-def012345678
        spa_uuid:
          description: 'Center UUID'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        status:
          description: 'Service package status'
          type: string
          enum:
            - enable
            - disable
          example: enable
        order:
          description: 'Display order of the service package'
          type: number
          format: float
          example: 1
        availability_configuration:
          $ref: '#/components/schemas/BackOffice:ServicePackage:FindAvailabilityConfiguration'
        services:
          description: 'Services included in the package'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindServiceItem'
        total_client_time_duration:
          description: 'Total client time duration in minutes'
          type: integer
          example: 90
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        capacity:
          description: 'Maximum capacity of the service package'
          type: integer
          example: 4
        online_booking_available:
          description: 'Whether online booking is available for this package'
          type: boolean
          example: true
        online_voucher_available:
          description: 'Whether online voucher purchase is available for this package'
          type: boolean
          example: false
        prepayment_required:
          description: 'Whether prepayment is required for this package'
          type: boolean
          example: true
        release:
          $ref: '#/components/schemas/BackOffice:ServicePackage:FindRelease'
        expiration_rule:
          $ref: '#/components/schemas/BackOffice:ServicePackage:FindExpiration'
        translations:
          description: 'Service package translations'
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
        offers:
          description: 'Active offers for the service package'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindOffer'
        images:
          description: 'Images associated with the service package'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindImage'
        channels_configuration:
          description: 'Channel-specific configuration for the service package'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindChannelConfiguration'
        groups_configuration:
          description: 'Group-specific configuration for the service package'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindGroupConfiguration'
        metadata:
          $ref: '#/components/schemas/BackOffice:ServicePackage:FindMetadata'
      type: object
    'BackOffice:ServicePackage:CreateResponse':
      description: 'Response after creating a service package'
      required:
        - uuid
      properties:
        uuid:
          description: 'Created service package UUID'
          type: string
          example: a1b2c3d4-5678-1234-9abc-def012345678
      type: object
    'BackOffice:ServicePackage:Create':
      description: 'Service package data for create operations'
      required:
        - status
        - order
        - availability_configuration
        - services
        - price
        - capacity
        - online_booking_available
        - online_voucher_available
        - prepayment_required
        - release
        - expiration_rule
        - translations
        - offers
        - channels_configuration
        - groups_configuration
      properties:
        status:
          description: 'Service package status'
          type: string
          enum:
            - enable
            - disable
          example: enable
        order:
          description: 'Display order'
          type: number
          example: 1
        availability_configuration:
          $ref: '#/components/schemas/BackOffice:ServicePackage:FindAvailabilityConfiguration'
        services:
          description: 'Services included in the package'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindServiceItem'
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        capacity:
          description: 'Maximum capacity'
          type: integer
          example: 4
        online_booking_available:
          description: 'Enable online booking'
          type: boolean
          example: true
        online_voucher_available:
          description: 'Enable online voucher purchase'
          type: boolean
          example: false
        prepayment_required:
          description: 'Require prepayment'
          type: boolean
          example: true
        release:
          $ref: '#/components/schemas/BackOffice:ServicePackage:FindRelease'
        expiration_rule:
          $ref: '#/components/schemas/BackOffice:ServicePackage:FindExpiration'
        translations:
          description: 'Service package translations'
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
        offers:
          description: 'Offers for the service package'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindOffer'
        channels_configuration:
          description: 'Channel-specific configuration'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindChannelConfiguration'
        groups_configuration:
          description: 'Group-specific configuration'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:ServicePackage:FindGroupConfiguration'
      type: object
    'BackOffice:GiftCard:Response':
      description: 'Paginated response of gift cards'
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:GiftCard:Find'
        meta:
          $ref: '#/components/schemas/Shared:Generic:MetaResponse'
      type: object
    'BackOffice:GiftCard:Find':
      description: 'Gift card response data'
      required:
        - id
        - payment_code
        - type
        - money
        - extra_info
      properties:
        id:
          type: integer
          example: 1
        payment_code:
          type: string
          example: GC001
        type:
          description: 'Gift card type. Possible values: bono.'
          type: string
          enum:
            - bono
          example: bono
        money:
          type: number
          example: 50
        expiration_date:
          type: string
          example: '2025-12-31'
          nullable: true
        extra_info:
          type: string
          example: 'Gift card for birthday'
      type: object
    'BackOffice:GiftCard:Update':
      description: 'Gift card update data'
      required:
        - centerUUID
        - dbID
        - type
        - money
        - extra_info
      properties:
        centerUUID:
          $ref: '#/components/schemas/CenterUUID'
        dbID:
          $ref: '#/components/schemas/GiftCardDBID'
        type:
          description: 'Gift card type. Possible values: bono.'
          type: string
          enum:
            - bono
          example: bono
        money:
          type: number
          example: 75
        expiration_date:
          type: string
          example: '2025-12-31'
          nullable: true
        extra_info:
          type: string
          example: 'Updated gift card info'
      type: object
    'BackOffice:GiftCard:Create':
      description: 'Gift card creation data'
      required:
        - centerUUID
        - payment_code
        - type
        - money
        - extra_info
      properties:
        centerUUID:
          $ref: '#/components/schemas/CenterUUID'
        payment_code:
          type: string
          example: GC-2024-001
        type:
          description: 'Gift card type. Possible values: bono.'
          type: string
          enum:
            - bono
          example: bono
        money:
          type: number
          example: 50
        expiration_date:
          type: string
          example: '2025-12-31'
          nullable: true
        extra_info:
          type: string
          example: 'Gift card for birthday'
      type: object
    'BackOffice:Service:Update':
      description: 'Service data for update operations'
      required:
        - status
        - order
        - category_id
        - release
        - only_package
        - translations
        - price
        - benefit_price
        - capacity
        - availability_configuration
        - offers
        - images
        - channels_configuration
        - groups_configuration
        - sessions
        - tax
        - is_featured
      properties:
        status:
          description: 'Service status'
          type: string
          enum:
            - enable
            - disable
          example: enable
        order:
          description: 'Display order'
          type: number
          example: 1
        category_id:
          description: 'Category database ID'
          type: integer
          example: 5
        release:
          $ref: '#/components/schemas/BackOffice:Service:FindRelease'
        only_package:
          description: 'Whether the service is only available as part of a package'
          type: boolean
          example: false
        translations:
          description: 'Service translations'
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        benefit_price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        capacity:
          $ref: '#/components/schemas/BackOffice:Service:FindCapacity'
        availability_configuration:
          $ref: '#/components/schemas/BackOffice:Service:FindAvailabilityConfiguration'
        offers:
          description: 'Active offers for the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindOffer'
        images:
          description: 'Images associated with the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindImage'
        channels_configuration:
          description: 'Channel-specific configuration'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindChannelConfiguration'
        groups_configuration:
          description: 'Group-specific configuration'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindGroupConfiguration'
        sessions:
          description: 'Session configuration'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindSession'
        tax:
          $ref: '#/components/schemas/BackOffice:Service:FindTax'
        is_featured:
          description: 'Whether the service is featured'
          type: boolean
          example: false
      type: object
    'BackOffice:Service:FindTimePeriod':
      description: 'Time period for a service'
      required:
        - time
        - type
      properties:
        time:
          description: 'Duration in minutes'
          type: integer
          example: 30
        type:
          description: 'Time period type'
          type: string
          example: client
      type: object
    'BackOffice:Service:FindTax':
      description: 'Tax information for a service'
      required:
        - id
        - name
      properties:
        id:
          description: 'Tax identifier'
          type: string
          example: iva_21
        name:
          description: 'Tax display name'
          type: string
          example: 'IVA 21%'
      type: object
    'BackOffice:Service:FindSession':
      description: 'Session configuration for a service'
      required:
        - count
        - price
      properties:
        count:
          description: 'Number of sessions'
          type: integer
          example: 5
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'BackOffice:Service:FindRelease':
      description: 'Release configuration for a service'
      required:
        - type
        - value
      properties:
        type:
          description: 'Release type'
          type: string
          example: hours
        value:
          description: 'Release value'
          type: integer
          example: 24
      type: object
    'BackOffice:Service:FindRate':
      description: 'Rate configuration for a service'
      required:
        - db_id
        - translations
        - enable
        - available_online
        - price
        - people
        - order
        - apply_offers
      properties:
        db_id:
          description: 'Rate database ID'
          type: integer
          example: 1
        translations:
          description: 'Rate translations'
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
        enable:
          description: 'Whether the rate is enabled'
          type: boolean
          example: true
        available_online:
          description: 'Whether the rate is available online'
          type: boolean
          example: true
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        people:
          description: 'Number of people for this rate'
          type: integer
          example: 2
        order:
          description: 'Rate display order'
          type: integer
          example: 1
        apply_offers:
          description: 'Whether offers apply to this rate'
          type: boolean
          example: true
      type: object
    'BackOffice:Service:FindOffer':
      description: 'Offer configuration for a service'
      required:
        - start_date
        - end_date
        - monday
        - tuesday
        - wednesday
        - thursday
        - friday
        - saturday
        - sunday
        - discount_mode
        - spa_discount_value
        - bono_discount_value
      properties:
        start_date:
          description: 'Offer start date'
          type: string
          example: '2024-01-01'
        end_date:
          description: 'Offer end date'
          type: string
          example: '2024-12-31'
        monday:
          description: 'Offer applies on Monday'
          type: boolean
          example: true
        tuesday:
          description: 'Offer applies on Tuesday'
          type: boolean
          example: true
        wednesday:
          description: 'Offer applies on Wednesday'
          type: boolean
          example: true
        thursday:
          description: 'Offer applies on Thursday'
          type: boolean
          example: true
        friday:
          description: 'Offer applies on Friday'
          type: boolean
          example: true
        saturday:
          description: 'Offer applies on Saturday'
          type: boolean
          example: false
        sunday:
          description: 'Offer applies on Sunday'
          type: boolean
          example: false
        discount_mode:
          description: 'Discount mode applied'
          type: string
          example: percentage
        spa_discount_value:
          description: 'Spa booking discount value'
          type: number
          format: float
          example: 10
        bono_discount_value:
          description: 'Voucher discount value'
          type: number
          format: float
          example: 5
        start_time:
          description: 'Offer start time. Null if all day'
          type: string
          example: '09:00'
          nullable: true
        end_time:
          description: 'Offer end time. Null if all day'
          type: string
          example: '18:00'
          nullable: true
      type: object
    'BackOffice:Service:FindMetadata':
      description: 'Metadata for a service'
      required:
        - db_id
      properties:
        db_id:
          description: 'Database ID'
          type: integer
          example: 42
      type: object
    'BackOffice:Service:FindImage':
      description: 'Image associated with a service'
      required:
        - entity_uuid
        - relation_type
        - order
        - file
      properties:
        entity_uuid:
          description: 'Entity UUID the image belongs to'
          type: string
          example: b2c3d4e5-6789-2345-abcd-ef0123456789
        relation_type:
          description: 'Type of relation'
          type: string
          example: service
        order:
          description: 'Image display order'
          type: integer
          example: 1
        file:
          $ref: '#/components/schemas/Shared:Generic:File'
      type: object
    'BackOffice:Service:FindGroupConfiguration':
      description: 'Group-specific configuration for a service'
      required:
        - uuid
        - id
        - enable
        - base_price
      properties:
        uuid:
          description: 'Group UUID'
          type: string
          example: 8eda3a47-93c8-4b02-a663-dd3acb6302dd
        id:
          description: 'Group database ID'
          type: integer
          example: 1
        enable:
          description: 'Whether the service is enabled for this group'
          type: boolean
          example: true
        base_price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        capacity:
          description: 'Group-specific capacity. Null inherits from service'
          type: integer
          example: null
          nullable: true
      type: object
    'BackOffice:Service:FindChannelConfiguration':
      description: 'Channel-specific configuration for a service'
      required:
        - uuid
        - id
        - enable
        - base_price
      properties:
        uuid:
          description: 'Channel UUID'
          type: string
          example: c1d2e3f4-5678-1234-abcd-ef0123456789
        id:
          description: 'Channel database ID'
          type: integer
          example: 1
        enable:
          description: 'Whether the service is enabled for this channel'
          type: boolean
          example: true
        base_price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        capacity:
          description: 'Channel-specific capacity. Null inherits from service'
          type: integer
          example: 4
          nullable: true
      type: object
    'BackOffice:Service:FindCategory':
      description: 'Category information for a service'
      required:
        - id
        - translations
      properties:
        id:
          description: 'Category database ID'
          type: integer
          example: 5
        translations:
          description: 'Category translations'
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
      type: object
    'BackOffice:Service:FindCapacity':
      description: 'Capacity configuration for a service'
      required:
        - incrementing
        - minimum
      properties:
        incrementing:
          description: 'Capacity increment step'
          type: integer
          example: 1
        maximum:
          description: 'Maximum capacity. Null if unlimited'
          type: integer
          example: 10
          nullable: true
        minimum:
          description: 'Minimum capacity'
          type: integer
          example: 1
      type: object
    'BackOffice:Service:FindCancellationPolicy':
      description: 'Cancellation policy for a service'
      required:
        - type
        - hours_before
        - percentage_to_apply
        - price
      properties:
        type:
          description: 'Cancellation policy type'
          type: string
          example: percentage
        hours_before:
          description: 'Hours before appointment for this policy'
          type: integer
          example: 24
        percentage_to_apply:
          description: 'Percentage to apply as penalty. Present when type is percentage'
          type: integer
          example: 50
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    'BackOffice:Service:FindAvailabilityConfiguration':
      description: 'Availability configuration for a service'
      required:
        - time_periods
        - start_times
      properties:
        time_periods:
          description: 'Time periods for the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindTimePeriod'
        start_times:
          description: 'Available start times for the service'
          type: array
          items:
            type: string
            example: '09:00'
      type: object
    'BackOffice:Service:Find':
      description: 'Service data returned by GET endpoint'
      required:
        - uuid
        - spa_uuid
        - status
        - order
        - time_periods
        - client_time_duration
        - online_booking_available
        - is_online_voucher_available
        - multi_appointment
        - prepayment_required
        - occupancy_type
        - only_package
        - employee_quantity
        - is_employee_required
        - is_resource_required
        - has_availability_on
        - is_full_day
        - price_per_person
        - release
        - benefit_price
        - start_times
        - translations
        - capacity
        - category
        - price
        - offers
        - images
        - channels_configuration
        - groups_configuration
        - sessions
        - rates
        - employee_db_ids
        - resource_db_ids
        - booking_cancellation_policy_collection
        - tax_name
        - tax
        - metadata
      properties:
        uuid:
          description: 'Service UUID'
          type: string
          example: b2c3d4e5-6789-2345-abcd-ef0123456789
        spa_uuid:
          description: 'Center UUID'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        status:
          description: 'Service status'
          type: string
          enum:
            - enable
            - disable
          example: enable
        order:
          description: 'Display order of the service'
          type: number
          format: float
          example: 1
        time_periods:
          description: 'Time periods for the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindTimePeriod'
        client_time_duration:
          description: 'Total client-facing time duration in minutes'
          type: integer
          example: 60
        online_booking_available:
          description: 'Online booking availability mode'
          type: string
          enum:
            - none
            - spa
            - bono
            - spa_bono
          example: spa_bono
        is_online_voucher_available:
          description: 'Whether online voucher purchase is available'
          type: boolean
          example: true
        multi_appointment:
          description: 'Whether the service supports multiple appointments'
          type: boolean
          example: false
        prepayment_required:
          description: 'Whether prepayment is required'
          type: boolean
          example: true
        occupancy_type:
          description: 'Occupancy type of the service'
          type: string
          enum:
            - individual
            - group
          example: individual
        only_package:
          description: 'Whether the service is only available as part of a package'
          type: boolean
          example: false
        employee_quantity:
          description: 'Number of employees required for the service'
          type: integer
          example: 1
        is_employee_required:
          description: 'Whether an employee is required for the service'
          type: boolean
          example: true
        is_resource_required:
          description: 'Whether a resource is required for the service'
          type: boolean
          example: false
        has_availability_on:
          description: 'Number of days with availability'
          type: integer
          example: 7
        is_full_day:
          description: 'Whether the service occupies a full day'
          type: boolean
          example: false
        price_per_person:
          $ref: '#/components/schemas/Shared:Generic:Price'
        release:
          $ref: '#/components/schemas/BackOffice:Service:FindRelease'
        benefit_price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        start_times:
          description: 'Available start times for the service'
          type: array
          items:
            type: string
            example: '09:00'
        translations:
          description: 'Service translations'
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
        capacity:
          $ref: '#/components/schemas/BackOffice:Service:FindCapacity'
        category:
          $ref: '#/components/schemas/BackOffice:Service:FindCategory'
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        offers:
          description: 'Active offers for the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindOffer'
        images:
          description: 'Images associated with the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindImage'
        channels_configuration:
          description: 'Channel-specific configuration for the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindChannelConfiguration'
        groups_configuration:
          description: 'Group-specific configuration for the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindGroupConfiguration'
        sessions:
          description: 'Session configuration for the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindSession'
        rates:
          description: 'Rate configuration for the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindRate'
        employee_db_ids:
          description: 'Database IDs of assigned employees'
          type: array
          items:
            type: integer
            example: 1
        resource_db_ids:
          description: 'Database IDs of assigned resources'
          type: array
          items:
            type: integer
            example: 1
        booking_cancellation_policy_collection:
          description: 'Booking cancellation policies for the service'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:Service:FindCancellationPolicy'
        tax_name:
          description: 'Tax name applied to the service'
          type: string
          example: 'IVA 21%'
        tax:
          $ref: '#/components/schemas/BackOffice:Service:FindTax'
        metadata:
          $ref: '#/components/schemas/BackOffice:Service:FindMetadata'
      type: object
    'BackOffice:Service:CreateResponse':
      description: 'Response after creating a service'
      required:
        - uuid
      properties:
        uuid:
          description: 'Created service UUID'
          type: string
          example: b2c3d4e5-6789-2345-abcd-ef0123456789
      type: object
    'BackOffice:Service:Create':
      description: 'Service data for create operations'
      required:
        - status
        - order
        - category_id
        - translations
        - price
        - capacity
        - availability_configuration
      properties:
        status:
          description: 'Service status'
          type: string
          enum:
            - enable
            - disable
          example: enable
        order:
          description: 'Display order'
          type: number
          example: 1
        category_id:
          description: 'Category database ID'
          type: integer
          example: 5
        translations:
          description: 'Service translations'
          type: array
          items:
            $ref: '#/components/schemas/Shared:Generic:Translation'
        price:
          $ref: '#/components/schemas/Shared:Generic:Price'
        capacity:
          $ref: '#/components/schemas/BackOffice:Service:FindCapacity'
        availability_configuration:
          $ref: '#/components/schemas/BackOffice:Service:FindAvailabilityConfiguration'
      type: object
    'BackOffice:ServiceAssociation:AssociateExtra':
      required:
        - extra_db_id
      properties:
        extra_db_id:
          type: integer
          example: 10
        enable:
          type: boolean
          default: false
          example: true
        available_online:
          type: boolean
          default: false
          example: false
        price:
          type: number
          format: float
          default: 0
          example: 15
        order:
          type: integer
          default: 0
          example: 1
        apply_offers:
          type: boolean
          default: false
          example: true
      type: object
    'BackOffice:ServiceAssociation:AssociateRate':
      required:
        - rate_db_id
      properties:
        rate_db_id:
          type: integer
          example: 9
        enable:
          type: boolean
          default: false
          example: true
        available_online:
          type: boolean
          default: false
          example: true
        price:
          type: number
          format: float
          default: 0
          example: 59.99
        people:
          type: integer
          default: null
          example: 2
          nullable: true
        order:
          type: integer
          default: 0
          example: 1
        apply_offers:
          type: boolean
          default: false
          example: false
      type: object
    'BackOffice:ServiceAssociation:Find':
      required:
        - id
        - enable
        - available_online
        - price
        - order
        - apply_offers
      properties:
        id:
          type: integer
          example: 9
        enable:
          type: boolean
          example: true
        available_online:
          type: boolean
          example: true
        price:
          type: number
          format: float
          example: 59.99
        order:
          type: integer
          example: 1
        apply_offers:
          type: boolean
          example: false
        people:
          type: integer
          default: null
          example: 2
          nullable: true
      type: object
    'BackOffice:PropertyGroup:Update':
      description: 'Property group update data'
      required:
        - name
        - domain
        - modes
        - description
        - code
        - address
        - telephone
        - fax
        - email
      properties:
        name:
          type: string
          example: 'Senator Hotels Updated'
        domain:
          type: string
          example: senatorhotels.com
        modes:
          type: array
          items:
            type: object
        description:
          type: string
          example: 'Hotel chain operating in Spain'
        code:
          type: string
          example: SEN
        address:
          type: string
          example: 'Calle Mayor 1, Madrid'
        telephone:
          type: string
          example: '+34 910 000 000'
        fax:
          type: string
          example: '+34 910 000 001'
        email:
          type: string
          example: info@senatorhotels.com
        latitude:
          type: number
          format: float
          example: 40.4168
          nullable: true
        longitude:
          type: number
          format: float
          example: -3.7038
          nullable: true
      type: object
    'BackOffice:PropertyGroup:Find':
      description: 'Property group data'
      required:
        - db_id
        - uuid
        - name
        - domain
        - description
        - code
        - address
        - telephone
        - fax
        - email
      properties:
        db_id:
          type: integer
          example: 1
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        name:
          type: string
          example: 'Senator Hotels'
        domain:
          type: string
          example: senatorhotels.com
        description:
          type: string
          example: 'Hotel chain operating in Spain'
        code:
          type: string
          example: SEN
        address:
          type: string
          example: 'Calle Mayor 1, Madrid'
        telephone:
          type: string
          example: '+34 910 000 000'
        fax:
          type: string
          example: '+34 910 000 001'
        email:
          type: string
          example: info@senatorhotels.com
        latitude:
          type: number
          format: float
          example: 40.4168
          nullable: true
        longitude:
          type: number
          format: float
          example: -3.7038
          nullable: true
      type: object
    'BackOffice:PropertyGroup:CreateResponse':
      description: 'Property group creation response data'
      required:
        - db_id
      properties:
        db_id:
          type: integer
          example: 1
      type: object
    'BackOffice:PropertyGroup:Create':
      description: 'Property group creation data'
      required:
        - name
        - domain
        - modes
        - description
        - code
        - address
        - telephone
        - fax
        - email
      properties:
        name:
          type: string
          example: 'Senator Hotels'
        domain:
          type: string
          example: senatorhotels.com
        modes:
          type: array
          items:
            type: object
        description:
          type: string
          example: 'Hotel chain operating in Spain'
        code:
          type: string
          example: SEN
        address:
          type: string
          example: 'Calle Mayor 1, Madrid'
        telephone:
          type: string
          example: '+34 910 000 000'
        fax:
          type: string
          example: '+34 910 000 001'
        email:
          type: string
          example: info@senatorhotels.com
        latitude:
          type: number
          format: float
          example: 40.4168
          nullable: true
        longitude:
          type: number
          format: float
          example: -3.7038
          nullable: true
      type: object
    'BackOffice:ProductCategory:Update':
      description: 'Product category update data'
      required:
        - title
        - description
      properties:
        title:
          type: string
          example: 'Cosmetics Updated'
        description:
          type: string
          example: 'Updated cosmetic products'
      type: object
    'BackOffice:ProductCategory:Find':
      description: 'Product category response data'
      required:
        - name
        - title
        - description
      properties:
        name:
          type: string
          example: cosmetics
        title:
          type: string
          example: Cosmetics
        description:
          type: string
          example: 'Cosmetic products'
      type: object
    'BackOffice:ProductCategory:CreateResponse':
      description: 'Product category creation response data'
      required:
        - name
      properties:
        name:
          type: string
          example: cosmetics
      type: object
    'BackOffice:ProductCategory:Create':
      description: 'Product category creation data'
      required:
        - name
        - title
        - description
      properties:
        name:
          type: string
          example: cosmetics
        title:
          type: string
          example: Cosmetics
        description:
          type: string
          example: 'Cosmetic products'
      type: object
    'BackOffice:ProductBrand:Update':
      description: 'Product brand update data'
      required:
        - title
        - description
      properties:
        title:
          type: string
          example: 'Loreal Updated'
        description:
          type: string
          example: 'Updated premium beauty brand'
      type: object
    'BackOffice:ProductBrand:Find':
      description: 'Product brand response data'
      required:
        - name
        - title
        - description
      properties:
        name:
          type: string
          example: loreal
        title:
          type: string
          example: Loreal
        description:
          type: string
          example: 'Premium beauty brand'
      type: object
    'BackOffice:ProductBrand:CreateResponse':
      description: 'Product brand creation response data'
      required:
        - name
      properties:
        name:
          type: string
          example: loreal
      type: object
    'BackOffice:ProductBrand:Create':
      description: 'Product brand creation data'
      required:
        - name
        - title
        - description
      properties:
        name:
          type: string
          example: loreal
        title:
          type: string
          example: Loreal
        description:
          type: string
          example: 'Premium beauty brand'
      type: object
    'BackOffice:Hotel:Update':
      description: 'Hotel update data'
      required:
        - name
        - domain
        - modes
      properties:
        name:
          type: string
          example: 'Hotel Playa Grande Updated'
        domain:
          type: string
          example: playagrande.com
        modes:
          type: array
          items:
            type: object
        property_group_uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
          nullable: true
      type: object
    'BackOffice:Hotel:Find':
      description: 'Hotel data'
      required:
        - db_id
        - uuid
        - name
        - domain
        - service_id
      properties:
        db_id:
          type: integer
          example: 1
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        name:
          type: string
          example: 'Hotel Playa Grande'
        domain:
          type: string
          example: playagrande.com
        property_group_uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
          nullable: true
        service_id:
          type: integer
          example: 42
      type: object
    'BackOffice:Hotel:CreateResponse':
      description: 'Hotel creation response data'
      required:
        - db_id
      properties:
        db_id:
          type: integer
          example: 1
      type: object
    'BackOffice:Hotel:Create':
      description: 'Hotel creation data'
      required:
        - name
        - domain
        - modes
      properties:
        name:
          type: string
          example: 'Hotel Playa Grande'
        domain:
          type: string
          example: playagrande.com
        modes:
          type: array
          items:
            type: object
        property_group_uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
          nullable: true
      type: object
    'BackOffice:Discount:Update':
      description: 'Discount update data'
      required:
        - title
        - description
        - type
        - value
      properties:
        title:
          type: string
          example: 'Early Bird Updated'
        description:
          type: string
          example: 'Updated early bird discount'
        type:
          type: string
          example: percentage
        value:
          type: number
          format: float
          example: 15
      type: object
    'BackOffice:Discount:Find':
      description: 'Discount response data'
      required:
        - name
        - title
        - description
        - type
        - value
      properties:
        name:
          type: string
          example: early_bird
        title:
          type: string
          example: 'Early Bird'
        description:
          type: string
          example: 'Early bird discount'
        type:
          type: string
          example: percentage
        value:
          type: number
          format: float
          example: 10
      type: object
    'BackOffice:Discount:CreateResponse':
      description: 'Discount creation response data'
      required:
        - name
      properties:
        name:
          type: string
          example: early_bird
      type: object
    'BackOffice:Discount:Create':
      description: 'Discount creation data'
      required:
        - name
        - title
        - description
        - type
        - value
      properties:
        name:
          type: string
          example: early_bird
        title:
          type: string
          example: 'Early Bird'
        description:
          type: string
          example: 'Early bird discount'
        type:
          type: string
          example: percentage
        value:
          type: number
          format: float
          example: 10
      type: object
    'BackOffice:Bootstrap:FindUserInfo':
      description: 'Authenticated user information'
      required:
        - name
        - image
        - is_logged
      properties:
        name:
          description: 'User display name'
          type: string
          example: 'John Doe'
        image:
          description: 'User avatar URL'
          type: string
          example: ''
        is_logged:
          description: 'Whether the user is logged in'
          type: boolean
          example: true
      type: object
    'BackOffice:Bootstrap:FindHubspot':
      description: 'Hubspot integration configuration'
      required:
        - id
        - identify
      properties:
        id:
          description: 'Hubspot ID'
          type: string
          example: ''
        identify:
          description: 'Hubspot identify data'
          type: array
          items:
            type: string
          example: []
      type: object
    'BackOffice:Bootstrap:FindEntityConfigurations':
      description: 'Top-level entity configurations (pre-checkin, booking print options)'
      required:
        - is_precheckin_enabled
        - booking_print_options
      properties:
        is_precheckin_enabled:
          description: 'Whether pre-checkin is enabled for the entity'
          type: boolean
          example: false
        booking_print_options:
          description: 'Booking print options configuration'
          type: object
      type: object
    'BackOffice:Bootstrap:FindCurrency':
      description: 'Currency configuration'
      required:
        - active_currency
      properties:
        active_currency:
          description: 'Active currency code'
          type: string
          example: EUR
      type: object
    'BackOffice:Bootstrap:FindCurrentCenter':
      description: 'Current center summary for bootstrap'
      required:
        - uuid
        - type
        - category
        - brand_id
      properties:
        uuid:
          description: 'Center UUID'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        id:
          description: 'Center database ID'
          type: integer
          example: 10
          nullable: true
        type:
          description: 'Center type'
          type: string
          example: wellness
        category:
          description: 'Center category'
          type: string
          example: wellness
        brand_id:
          description: 'Brand ID'
          type: string
          example: f1401001
      type: object
    'BackOffice:Bootstrap:FindNonCenter':
      description: 'Bootstrap data for hotel/property-group initialization'
      required:
        - current_entity_type
        - current
        - default_language
        - languages
        - user_info
        - entities_available
        - entity_configurations
        - backoffice_color
        - hubspot
      properties:
        current_entity_type:
          description: 'Entity type of the current bootstrap target'
          type: string
          example: rfh_hotel
        current:
          description: 'Current entity data'
          type: object
        default_language:
          description: 'Default language code'
          type: string
          example: es
        languages:
          description: 'Available languages'
          type: array
          items:
            type: string
            example: es
        user_info:
          $ref: '#/components/schemas/BackOffice:Bootstrap:FindUserInfo'
        entities_available:
          description: 'Available entities'
          type: array
          items:
            type: object
        entity_configurations:
          $ref: '#/components/schemas/BackOffice:Bootstrap:FindEntityConfigurations'
        backoffice_color:
          description: 'Backoffice theme color'
          type: string
          example: ''
        hubspot:
          $ref: '#/components/schemas/BackOffice:Bootstrap:FindHubspot'
      type: object
    'BackOffice:Bootstrap:Find':
      description: 'Bootstrap data for center initialization'
      required:
        - current
        - default_language
        - center_language
        - languages
        - site_name
        - currency
        - timezone
        - center
        - user_info
        - user_menu_items
        - menu_items
        - entities_available
        - backoffice_color
        - hubspot
        - utb_feature_manager
        - entity_configurations
      properties:
        current:
          $ref: '#/components/schemas/BackOffice:Bootstrap:FindCurrentCenter'
        default_language:
          description: 'Default language code'
          type: string
          example: es
        center_language:
          description: 'Center language code'
          type: string
          example: es
        languages:
          description: 'Available languages'
          type: array
          items:
            type: string
            example: es
        site_name:
          description: 'Center display name'
          type: string
          example: 'Spa Resort'
        currency:
          $ref: '#/components/schemas/BackOffice:Bootstrap:FindCurrency'
        timezone:
          description: 'Center timezone'
          type: string
          example: Europe/Madrid
        center:
          description: 'Full center data'
          type: object
        user_info:
          $ref: '#/components/schemas/BackOffice:Bootstrap:FindUserInfo'
        user_menu_items:
          description: 'User menu items'
          type: array
          items:
            type: object
        menu_items:
          description: 'Menu items'
          type: array
          items:
            type: object
        entities_available:
          description: 'Available entities'
          type: array
          items:
            type: object
        backoffice_color:
          description: 'Backoffice theme color'
          type: string
          example: ''
        hubspot:
          $ref: '#/components/schemas/BackOffice:Bootstrap:FindHubspot'
        utb_feature_manager:
          description: 'Feature manager modules'
          type: array
          items:
            type: object
        entity_configurations:
          $ref: '#/components/schemas/BackOffice:Bootstrap:FindEntityConfigurations'
      type: object
    'BackOffice:Center:Find':
      description: 'Center data returned by the API'
      required:
        - uuid
        - name
        - secondary_name
        - domain
        - description
        - code
        - telephone
        - email
        - category
        - localization
        - configuration
        - images
        - metadata
      properties:
        uuid:
          description: 'Center UUID'
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        name:
          description: 'Center name'
          type: string
          example: 'Spa Resort Mediterranean'
        secondary_name:
          description: 'Secondary name of the center'
          type: string
          example: 'Mediterranean Resort & Spa'
        domain:
          description: 'Center domain'
          type: string
          example: spa-resort.example.com
        description:
          description: 'Center description'
          type: string
          example: 'A luxury spa resort in the Mediterranean coast'
        code:
          description: 'Unique center code'
          type: string
          example: SPA-MED-001
        telephone:
          description: 'Contact telephone'
          type: string
          example: '+34 912 345 678'
        email:
          description: 'Contact email'
          type: string
          example: info@spa-resort.com
        category:
          description: 'Center category type'
          type: string
          enum:
            - wellness
            - activities
          example: wellness
        localization:
          description: 'Center localization data'
          properties:
            address:
              description: 'Street address'
              type: string
              example: 'Calle Mayor 1'
            city:
              description: City
              type: string
              example: Barcelona
            country:
              description: 'Country code'
              type: string
              example: ES
            latitude:
              description: Latitude
              type: number
              format: float
              example: 41.3851
            longitude:
              description: Longitude
              type: number
              format: float
              example: 2.1734
            config:
              description: 'Localization configuration'
              properties:
                currency:
                  description: 'Currency code'
                  type: string
                  example: EUR
                language:
                  description: 'Default language'
                  type: string
                  example: es
                timezone:
                  description: Timezone
                  type: string
                  example: Europe/Madrid
                fiscal_address:
                  description: 'Fiscal address'
                  type: string
                  example: 'Calle Fiscal 5, 08001 Barcelona'
              type: object
          type: object
        configuration:
          description: 'Center configuration'
          properties:
            default_tax:
              description: 'Default tax configuration'
              properties:
                name:
                  description: 'Tax name'
                  type: string
                  example: IVA
                percentage:
                  description: 'Tax percentage'
                  type: number
                  format: float
                  example: 21
              type: object
          type: object
        images:
          description: 'Center images'
          type: array
          items:
            properties:
              fid:
                description: 'File ID'
                type: integer
                example: 123
              uri:
                description: 'Image URI'
                type: string
                example: 'public://images/spa-logo.jpg'
              filename:
                description: 'File name'
                type: string
                example: spa-logo.jpg
              alt:
                description: 'Alt text'
                type: string
                example: 'Spa Resort Logo'
              title:
                description: 'Image title'
                type: string
                example: 'Main Logo'
              width:
                description: 'Image width in pixels'
                type: integer
                example: 800
                nullable: true
              height:
                description: 'Image height in pixels'
                type: integer
                example: 600
                nullable: true
              delta:
                description: 'Image sort order'
                type: integer
                example: 0
        metadata:
          description: 'Center metadata'
          properties:
            db_id:
              description: 'Database ID'
              type: integer
              example: 10
            agenda_db_id:
              description: 'Agenda database ID'
              type: integer
              example: 5
          type: object
        hotel_uuid:
          description: 'UUID of the hotel this center belongs to (null if standalone)'
          type: string
          default: null
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
          nullable: true
      type: object
    'BackOffice:AgendaConfiguration:CustomView':
      description: 'Custom view configuration'
      required:
        - show_resources_with_appointments
        - resources
      properties:
        show_resources_with_appointments:
          description: 'Whether to show only resources with appointments'
          type: string
          example: '1'
        resources:
          description: 'List of resource identifiers'
          type: array
          items:
            type: string
      type: object
    'BackOffice:AgendaConfiguration:Release':
      description: 'Release timing configuration'
      required:
        - type
        - value
      properties:
        type:
          description: 'Release type'
          type: string
          enum:
            - disable
            - hours
            - days
          example: disable
        value:
          description: 'Release value'
          type: integer
          example: 0
      type: object
    'BackOffice:AgendaConfiguration:Backup':
      description: 'Backup configuration'
      required:
        - type
        - days
        - language
        - value
      properties:
        type:
          description: 'Backup type (e.g. email)'
          type: string
          example: email
        days:
          description: 'Number of days for backup retention'
          type: string
          example: '5'
        language:
          description: 'Backup language code'
          type: string
          example: es
        value:
          description: 'Backup value'
          type: string
          example: '0'
      type: object
    'BackOffice:AgendaConfiguration:Awe':
      description: 'AWE (Advanced Workforce Engine) settings'
      required:
        - active
        - overbooking
        - release
        - capacity
      properties:
        active:
          description: 'Whether AWE is active'
          type: string
          example: '1'
        overbooking:
          description: 'Overbooking setting'
          type: string
          example: '0'
        release:
          description: 'Release time in days'
          type: string
          example: '14'
        capacity:
          description: 'Capacity setting'
          type: string
          example: '0'
      type: object
    'BackOffice:AgendaConfiguration:IframeAlert':
      description: 'Iframe alert configuration'
      required:
        - enable
        - text
      properties:
        enable:
          description: 'Whether the iframe alert is enabled'
          type: integer
          example: 1
        text:
          description: 'Translations keyed by language code'
          type: object
          example:
            es: 'Texto de alerta'
            en: 'Alert text'
          additionalProperties:
            type: string
      type: object
    'BackOffice:AgendaConfiguration:TimeSlot':
      description: 'Time slot with hour and minutes'
      required:
        - h
        - m
      properties:
        h:
          description: Hour
          type: string
          example: '9'
        m:
          description: Minutes
          type: string
          example: '0'
      type: object
    'BackOffice:AgendaConfiguration:ByWeekDay':
      description: 'Single day configuration within weekly schedule'
      required:
        - enable
        - from
        - to
        - from2
        - to2
      properties:
        enable:
          description: 'Whether this day is enabled'
          type: integer
          example: 1
        from:
          $ref: '#/components/schemas/BackOffice:AgendaConfiguration:TimeSlot'
        to:
          $ref: '#/components/schemas/BackOffice:AgendaConfiguration:TimeSlot'
        from2:
          $ref: '#/components/schemas/BackOffice:AgendaConfiguration:TimeSlot'
        to2:
          $ref: '#/components/schemas/BackOffice:AgendaConfiguration:TimeSlot'
      type: object
    'BackOffice:AgendaConfiguration:ByWeek':
      description: 'Weekly schedule configuration'
      required:
        - data
      properties:
        data:
          description: 'Array of day configurations (index 0=Monday through 6=Sunday)'
          type: array
          items:
            $ref: '#/components/schemas/BackOffice:AgendaConfiguration:ByWeekDay'
      type: object
    'BackOffice:AgendaConfiguration:CacheTimes':
      description: 'Agenda configuration - cache times section'
      required:
        - default
        - employee_schedule
        - maximum_editing_time
      properties:
        default:
          description: 'Default cache time in seconds'
          type: integer
          example: 3600
        employee_schedule:
          description: 'Employee schedule cache time in seconds'
          type: integer
          example: 3600
        maximum_editing_time:
          description: 'Maximum editing time cache in seconds'
          type: integer
          example: 3600
      type: object
    'BackOffice:AgendaConfiguration:Connector':
      description: 'Agenda configuration - connector section (availability settings)'
      required:
        - disable_booking_botton
        - appointment_request
        - disable_voucher_botton
        - interval_minutes
        - send_appointments
        - employee_filter_mode
        - appointment_request_on_no_availability
      properties:
        disable_booking_botton:
          description: 'Whether the booking button is disabled'
          type: integer
          example: 0
        appointment_request:
          description: 'Whether appointment requests are enabled'
          type: integer
          example: 0
        disable_voucher_botton:
          description: 'Whether the voucher button is disabled'
          type: integer
          example: 0
        interval_minutes:
          description: 'Interval in minutes for availability slots'
          type: integer
          example: 30
        send_appointments:
          description: 'Whether to send appointment notifications'
          type: integer
          example: 1
        employee_filter_mode:
          description: 'Employee filter mode (0=ALL, 1=CATEGORY, 2=NONE)'
          type: integer
          example: 0
        appointment_request_on_no_availability:
          description: 'Exception types that allow appointment requests when no availability'
          type: object
          example:
            exception_type_1: 0
            exception_type_2: 1
          additionalProperties:
            type: integer
      type: object
    'BackOffice:AgendaConfiguration:Main':
      description: 'Agenda configuration - main section'
      required:
        - start_hour
        - start_minutes
        - end_hour
        - end_minutes
        - start_hour2
        - start_minutes2
        - end_hour2
        - end_minutes2
        - by_week
        - iframe_alert
        - awe
        - backup
        - release
        - default_view
        - default_appointment_color
        - custom_view
        - hour_height
        - date_format
        - first_day_week
        - inform_client
        - filter_max_num
      properties:
        start_hour:
          description: 'Start hour of agenda'
          type: string
          example: '9'
        start_minutes:
          description: 'Start minutes of agenda'
          type: string
          example: '0'
        end_hour:
          description: 'End hour of agenda'
          type: string
          example: '22'
        end_minutes:
          description: 'End minutes of agenda'
          type: string
          example: '0'
        start_hour2:
          description: 'Second period start hour'
          type: string
          example: ''
        start_minutes2:
          description: 'Second period start minutes'
          type: string
          example: ''
        end_hour2:
          description: 'Second period end hour'
          type: string
          example: ''
        end_minutes2:
          description: 'Second period end minutes'
          type: string
          example: ''
        by_week:
          $ref: '#/components/schemas/BackOffice:AgendaConfiguration:ByWeek'
        iframe_alert:
          $ref: '#/components/schemas/BackOffice:AgendaConfiguration:IframeAlert'
        awe:
          $ref: '#/components/schemas/BackOffice:AgendaConfiguration:Awe'
        backup:
          $ref: '#/components/schemas/BackOffice:AgendaConfiguration:Backup'
        release:
          $ref: '#/components/schemas/BackOffice:AgendaConfiguration:Release'
        default_view:
          description: 'Default agenda view'
          type: string
          example: workerday
        default_appointment_color:
          description: 'Default color scheme for appointments'
          type: string
          example: service
        custom_view:
          $ref: '#/components/schemas/BackOffice:AgendaConfiguration:CustomView'
        hour_height:
          description: 'Height in pixels per hour in agenda'
          type: string
          example: '80'
        date_format:
          description: 'Date format pattern'
          type: string
          example: '{{D}}/{{M}}/{{YYYY}}'
        first_day_week:
          description: 'First day of the week (0=Sunday, 1=Monday)'
          type: string
          example: '1'
        inform_client:
          description: 'Whether to inform client about appointments'
          type: string
          example: '1'
        filter_max_num:
          description: 'Maximum number of filters to display'
          type: string
          example: '15'
      type: object
    CenterWithServicesAndServicesPackages:
      description: 'Center with its available services'
      type: object
      allOf:
        -
          $ref: '#/components/schemas/PublicAPI:Shared:Center'
        -
          properties:
            services:
              type: array
              items:
                $ref: '#/components/schemas/PublicAPI:Shared:Service'
    Appointment:
      description: 'Definition of an appointment'
      required:
        - uuid
        - dates
        - purchase_info
        - availability
        - beneficiary_name
      properties:
        uuid:
          type: string
          example: d02f3d9e-d12e-4680-9ad2-aefea1ce47e9
        dates:
          $ref: '#/components/schemas/PublicAPI:Shared:AppointmentDates'
        purchase_info:
          $ref: '#/components/schemas/PublicAPI:Shared:AppointmentPurchaseInfo'
        availability:
          $ref: '#/components/schemas/PublicAPI:Shared:AppointmentAvailability'
        beneficiary_name:
          description: 'Name of the person who is the benefit of the appointment'
          type: string|null
          example: 'Eleazar Perez'
      type: object
    LegalConditions:
      required:
        - generalCondition
        - politicalCondition
        - legalNotice
      properties:
        generalCondition:
          $ref: '#/components/schemas/GeneralCondition'
        politicalCondition:
          $ref: '#/components/schemas/PoliticalCondition'
        legalNotice:
          $ref: '#/components/schemas/LegalNotice'
      type: object
    VoucherPurchaseStartItemSession:
      required:
        - count
        - quantity
        - tier_price
      properties:
        count:
          type: integer
          example: 5
        quantity:
          type: integer
          example: 3
        tier_price:
          $ref: '#/components/schemas/Shared:Generic:Price'
      type: object
    VoucherPurchaseBuyer:
      required:
        - name
        - surname
        - email
        - phoneNumber
        - comment
        - allowNotifications
        - localization
        - isGift
        - beneficiaryName
        - billingFields
      properties:
        name:
          $ref: '#/components/schemas/Name'
        surname:
          $ref: '#/components/schemas/Surname'
        email:
          $ref: '#/components/schemas/Email'
        phoneNumber:
          $ref: '#/components/schemas/PhoneNumber'
        comment:
          $ref: '#/components/schemas/Comment'
        allowNotifications:
          $ref: '#/components/schemas/AllowNotifications'
        localization:
          $ref: '#/components/schemas/VoucherPurchaseBuyerLocalization'
        isGift:
          $ref: '#/components/schemas/VoucherPurchaseIsGift'
        beneficiaryName:
          $ref: '#/components/schemas/VoucherPurchaseBeneficiaryName'
        billingFields:
          $ref: '#/components/schemas/VoucherPurchaseBillingFields'
      type: object
    Locator:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    PurchaseResolution:
      required:
        - kind
      properties:
        kind:
          type: string
          enum:
            - ready
            - needs_hydration_from_legacy
            - confirmed
            - canceled
            - expired
          example: ready
      type: object
    AppointmentPurchaseBuyer:
      required:
        - name
        - surname
        - email
        - phoneNumber
        - comment
        - allowNotifications
        - isGift
        - beneficiaryName
        - billingFields
      properties:
        name:
          $ref: '#/components/schemas/Name'
        surname:
          $ref: '#/components/schemas/Surname'
        email:
          $ref: '#/components/schemas/Email'
        phoneNumber:
          $ref: '#/components/schemas/PhoneNumber'
        comment:
          $ref: '#/components/schemas/Comment'
        allowNotifications:
          $ref: '#/components/schemas/AllowNotifications'
        isGift:
          $ref: '#/components/schemas/AppointmentPurchaseIsGift'
        beneficiaryName:
          $ref: '#/components/schemas/AppointmentPurchaseBeneficiaryName'
        billingFields:
          $ref: '#/components/schemas/AppointmentPurchaseBillingFields'
      type: object
    ServicePackageConditions:
      description: 'Legal conditions for a service package'
      required:
        - service_package_uuid
        - service_package_name
        - legalConditions
        - anyCondition
      properties:
        service_package_uuid:
          type: string
        service_package_name:
          type: string
        legalConditions:
          $ref: '#/components/schemas/LegalConditions'
        anyCondition:
          type: boolean
      type: object
    RoleUUID:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    CenterUUID:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    TaxName:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    ProductType:
      type: string
      enum:
        - product
    PaymentMethodCode:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    OrderTotal:
      required:
        - amount
        - currency_code
        - data
      properties:
        amount:
          type: integer
          example: 5000
        currency_code:
          type: string
          example: EUR
        data:
          type: object
      type: object
    GiftCardDBID:
      type: integer
    GeneralCondition:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    PoliticalCondition:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    LegalNotice:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    Name:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    Surname:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    Email:
      required:
        - admin
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        admin:
          type: boolean
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    PhoneNumber:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    Comment:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    AllowNotifications:
      required:
        - value
        - 'false'
        - 'true'
      properties:
        value:
          type: boolean
        'false':
          type: boolean
        'true':
          type: boolean
      type: object
    VoucherPurchaseBuyerLocalization:
      required:
        - address
        - country
        - city
        - postalCode
      properties:
        address:
          $ref: '#/components/schemas/Address'
        country:
          $ref: '#/components/schemas/Country'
        city:
          $ref: '#/components/schemas/City'
        postalCode:
          $ref: '#/components/schemas/PostalCode'
      type: object
    VoucherPurchaseIsGift:
      required:
        - value
        - 'false'
        - 'true'
      properties:
        value:
          type: boolean
        'false':
          type: boolean
        'true':
          type: boolean
      type: object
    VoucherPurchaseBeneficiaryName:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    VoucherPurchaseBillingFields:
      required:
        - empty
      properties:
        empty:
          type: boolean
      type: object
    AppointmentPurchaseIsGift:
      required:
        - value
        - 'false'
        - 'true'
      properties:
        value:
          type: boolean
        'false':
          type: boolean
        'true':
          type: boolean
      type: object
    AppointmentPurchaseBeneficiaryName:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    AppointmentPurchaseBillingFields:
      required:
        - empty
      properties:
        empty:
          type: boolean
      type: object
    Address:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    Country:
      required:
        - valueAsISO2
        - spain
        - unknownCountryCode
        - empty
      properties:
        value:
          type: string
          default: ''
        valueAsISO2:
          type: string
        spain:
          type: boolean
        unknownCountryCode:
          type: boolean
        empty:
          type: boolean
      type: object
    City:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
    PostalCode:
      required:
        - empty
        - valueAsStrtoupper
        - numeric
        - alphaNumeric
      properties:
        value:
          type: string
          default: ''
        empty:
          type: boolean
        valueAsStrtoupper:
          type: string
        numeric:
          type: boolean
        alphaNumeric:
          type: boolean
      type: object
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      name: X-API-KEY
      in: header
tags:
  -
    name: Bookings
  -
    name: Vouchers
  -
    name: 'Booking / Appointment'
  -
    name: Booking
  -
    name: Center
  -
    name: Channel
  -
    name: Group
  -
    name: 'Service / Availability'
  -
    name: Login

x-tagGroups:
  - name: 'Authentication'
    tags:
      - 'Login'
  - name: 'BackOffice'
    tags:
      - 'Bookings'
      - 'Vouchers'
  - name: 'Booking Engine'
    tags:
      - 'Booking'
      - 'Booking / Appointment'
      - 'Center'
      - 'Channel'
      - 'Group'
      - 'Service / Availability'
