{
  "addedInModelVersion" : 1200,
  "ash" : {
    "generateResource" : "Y"
  },
  "attributes" : [
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "N",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "_rowid",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "bookingDefinitionID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "createDate",
      "externalType" : "datetime",
      "name" : "createDate",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSDate"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "modifyDate",
      "externalType" : "datetime",
      "name" : "modifyDate",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSDate"
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "name",
      "externalType" : "char",
      "name" : "name",
      "purpose" : "The customer-facing name for this booking definition.\n\nThis name identifies the booking definition in the online booking web UI, it’s also shown to the person booking the appointment, and it’s used as the name for booked appointment in generated ICS files.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 256
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "details",
      "externalType" : "char",
      "name" : "details",
      "purpose" : "An optional description for this booking definition.\n\nThis description is shown to the person booking the appointment to give them more context about the appointment.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 8192
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "ashType" : ":slug",
        "includeInResource" : "Y"
      },
      "columnName" : "cachedSlug",
      "externalType" : "char",
      "name" : "cachedSlug",
      "purpose" : "A company-wide unique url slug for this booking definition.\n\nThis attribute is maintained by the backend, as this is a cached copy of the booking template's current slug.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "N"
      },
      "valueClassName" : "NSString",
      "width" : 1024
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "ashName" : "active?",
        "includeInResource" : "Y"
      },
      "columnName" : "isActive",
      "defaultValue" : "1",
      "externalType" : "int",
      "name" : "isActive",
      "purpose" : "Indicates whether this booking template is active and allows new bookings.\n\n",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Boolean"
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "ashName" : "personal?",
        "includeInResource" : "Y"
      },
      "columnName" : "isPersonal",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "isPersonal",
      "purpose" : "Indicates whether this is a personal booking template belonging to the owner.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Boolean"
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "minimumNoticeMinutes",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "minimumNoticeMinutes",
      "purpose" : "The amount of time that people cannot schedule before a booking.\n\nThis is used to ensure that assignees have an adequate amount of lead time before new booked appointments.\n\nThe duration is stored in minutes.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Integer"
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "bufferMinutesBefore",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "bufferMinutesBefore",
      "purpose" : "The amount of empty calendar space that must precede a booked appointment.\n\nThis is used to ensure that there is adequate time for the assignee between consecutive bookings or other appointments and new bookings.\n\nDuration is stored in minutes.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Integer"
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "bufferMinutesAfter",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "bufferMinutesAfter",
      "purpose" : "The amount of empty calendar space that must follow a booked appointment.\n\nThis is used to ensure that there is adequate time for the assignee between consecutive bookings or new bookings and other appointments.\n\nDuration is stored in minutes.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Integer"
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeSlotStartMinuteIncrements",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "timeSlotStartMinuteIncrements",
      "purpose" : "The start time increments control how start time options are shown on the booking page.\n\nExample: if there is an availability window from 10:00am – 11:30am for a 30 min booking, this can be set to 15 mins to show start time options of 10:00, 10:15, 10:30, 10:45, 11:00.\n\nStored in minutes. Defaults to `0`, which uses the default behaviour of using the default duration option as the increment.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Integer"
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "dailyLimit",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "dailyLimit",
      "purpose" : "The maximum number of bookings to allow per-assignee per-day.\n\nDefaults to `0`, which is interpreted as *No Limit*.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Integer"
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "allowedTimeRangeType",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "allowedTimeRangeType",
      "purpose" : "The time range that bookings are allowed to be booked within.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "EnumInteger",
      "valueEnum" : "BookingDefinitionTimeRangeType"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "allowedTimeRangeStart",
      "externalType" : "char",
      "name" : "allowedTimeRangeStart",
      "purpose" : "The start of the time range for definitions with a specific time range.\n\nRequired when `allowedTimeRangeType` is `SpecificRange`.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "CalendarDate",
      "width" : 128
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "allowedTimeRangeEnd",
      "externalType" : "char",
      "name" : "allowedTimeRangeEnd",
      "purpose" : "The end of the time range for definitions with a specific time range.\n\nRequired when `allowedTimeRangeType` is `SpecificRange`.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "CalendarDate",
      "width" : 128
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "allowedTimeRangeRelativeDays",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "allowedTimeRangeRelativeDays",
      "purpose" : "The number of days into the future that appointments can be booked.\n\nRequired to be > 0 when `allowedTimeRangeType` is `Relative`.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Integer"
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "assignmentType",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "assignmentType",
      "purpose" : "Determines whether the booking definition supports multiple assignees and how the assignee is selected for new bookings.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "EnumInteger",
      "valueEnum" : "BookingDefinitionAssignmentType"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "overrideLanguageCode",
      "externalType" : "char",
      "name" : "overrideLanguageCode",
      "purpose" : "The 2-3 character ISO 639-1\/2 language code representing the language to use for the booking pages and all email notifications related to this booking template. Must be one of Daylite’s supported languages.\n\nDefaults to `nil`, which infers the language code from the scheduler's browser, defaulting to \"en\" if it's not one of Daylite's supported languages.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 128
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockTitleFormat",
      "externalType" : "char",
      "name" : "timeblockTitleFormat",
      "purpose" : "The title format to use for booked appointments in Daylite.\n\nThis is a format string that uses single curly braces as the variable `{placeholder}` and supports the following variables: `definitionName`, `firstName`, `lastName`, `emailAddress`, and `fullName`.\n\nWhen nil, the default behaviour is to format the title by combining the definition’s name with the scheduler’s name.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 1024
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockReadPermissions",
      "externalType" : "char",
      "name" : "timeblockReadPermissions",
      "purpose" : "The read permissions to apply to the booked appointment timeblock.\n\nIf nil, the read permissions fall back to the primary assignee (also the timeblock owner)’s default permissions first, then the global timeblock permissions second.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 1024
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockWritePermissions",
      "externalType" : "char",
      "name" : "timeblockWritePermissions",
      "purpose" : "The write permissions to apply to the booked appointment timeblock.\n\nIf nil, the write permissions fall back to the primary assignee (also the timeblock owner)’s default permissions first, then the global timeblock permissions second.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 1024
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "remindersType",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "remindersType",
      "purpose" : "Determines when to send external reminders.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "EnumInteger",
      "valueEnum" : "BookingDefinitionRemindersType"
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "ashType" : ":pipe_set",
        "includeInResource" : "Y"
      },
      "columnName" : "reminderOffsets",
      "externalType" : "char",
      "name" : "reminderOffsets",
      "purpose" : "The reminder offsets to apply when the reminders type is `BookingDefinition`.\n\nThe offsets are positive integers that represent the minutes before the start of the appointment.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 1024
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "archivedDate",
      "externalType" : "datetime",
      "name" : "archivedDate",
      "purpose" : "The date that the booking definition was archived.\n\nThe `archivedBy` relationship and `archivedDate` attribute must be set together.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSDate"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "defaultDurationID",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "defaultDurationID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockCategoryID",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "timeblockCategoryID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockVisibilityPresetID",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "timeblockVisibilityPresetID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "ownerID",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "ownerID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "archivedByID",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "archivedByID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "createdByID",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "createdByID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1200,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "defaultLocationID",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "defaultLocationID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    }
  ],
  "className" : "GWBookingDefinition",
  "classProperties" : [
    "bookingDefinitionID",
    "createDate",
    "modifyDate",
    "name",
    "details",
    "cachedSlug",
    "isActive",
    "isPersonal",
    "minimumNoticeMinutes",
    "bufferMinutesBefore",
    "bufferMinutesAfter",
    "timeSlotStartMinuteIncrements",
    "dailyLimit",
    "allowedTimeRangeType",
    "allowedTimeRangeStart",
    "allowedTimeRangeEnd",
    "allowedTimeRangeRelativeDays",
    "assignmentType",
    "overrideLanguageCode",
    "timeblockTitleFormat",
    "timeblockReadPermissions",
    "timeblockWritePermissions",
    "remindersType",
    "reminderOffsets",
    "archivedDate",
    "defaultDurationID",
    "timeblockCategoryID",
    "timeblockVisibilityPresetID",
    "ownerID",
    "archivedByID",
    "createdByID",
    "defaultLocationID",
    "locations",
    "defaultDuration",
    "durations",
    "assignees",
    "timeblockCategory",
    "bookingDefinitionKeywords",
    "timeblockKeywords",
    "timeblockVisibilityPreset",
    "owner",
    "archivedBy",
    "createdBy",
    "defaultLocation"
  ],
  "domain" : "OnlineBooking",
  "enums" : [
    {
      "addedInModelVersion" : 1200,
      "items" : [
        {
          "addedInModelVersion" : 1200,
          "name" : "Indefinite",
          "purpose" : "Does not constrain how far into the future bookings are allowed to be made.",
          "value" : 0
        },
        {
          "addedInModelVersion" : 1200,
          "name" : "Relative",
          "purpose" : "Bookings are only allowed _X_ days into the future, relative to the current date in the time zone selected from the booking page.\n\nParameterized with `allowedTimeRangeRelativeDays`.",
          "value" : 1
        },
        {
          "addedInModelVersion" : 1200,
          "name" : "SpecificRange",
          "purpose" : "Bookings are only allowed within the explicitly specified date\/time range.\n\nParameterized with `allowedTimeRangeStart` and `allowedTimeRangeEnd`.",
          "value" : 2
        }
      ],
      "name" : "BookingDefinitionTimeRangeType",
      "purpose" : "Type of time range for a booking definition.",
      "type" : 1
    },
    {
      "addedInModelVersion" : 1200,
      "items" : [
        {
          "addedInModelVersion" : 1200,
          "name" : "Individual",
          "purpose" : "Only one assignee is supported for the booking template, so that assignee is assigned to the booking.",
          "value" : 0
        },
        {
          "addedInModelVersion" : 1200,
          "name" : "Collective",
          "purpose" : "All assignees on the booking template are required for the appointment. The highest priority assignee is considered the *primary* assignee.",
          "value" : 1
        },
        {
          "addedInModelVersion" : 1200,
          "name" : "Priority",
          "purpose" : "The highest priority assignee that is available during the selected time slot is assigned to the booking. \n\nSupports multiple assignees on the booking template.",
          "value" : 2
        },
        {
          "addedInModelVersion" : 1200,
          "name" : "LeastRecentlyScheduled",
          "purpose" : "The least recently scheduled assignee that is available during the selected time slot is assigned to the booking. \n\nSupports multiple assignees on the booking template.",
          "value" : 3
        }
      ],
      "name" : "BookingDefinitionAssignmentType",
      "purpose" : "Assignment type determines whether the booking definition supports multiple assignees, and how the assignees are selected when more than one is available during the selected time slot.",
      "type" : 1
    },
    {
      "addedInModelVersion" : 1200,
      "items" : [
        {
          "addedInModelVersion" : 1200,
          "name" : "Default",
          "purpose" : "Uses the default set of reminders for external invitations.\n\nUses the values from the `ExternalReminderMinuteOffsets` user default.",
          "value" : 0
        },
        {
          "addedInModelVersion" : 1200,
          "name" : "BookingDefinition",
          "purpose" : "Uses the reminders configured for this booking definition, via the `externalReminders` relationship.",
          "value" : 1
        }
      ],
      "name" : "BookingDefinitionRemindersType",
      "purpose" : "The schedule to use for external reminders.",
      "type" : 1
    }
  ],
  "externalName" : "BookingDefinition",
  "isDatabasePreference" : false,
  "isTrashable" : false,
  "localizationKey" : "Booking Template",
  "localizationPluralKey" : "Booking Templates",
  "moduleName" : "DLSubstrate",
  "name" : "BookingDefinition",
  "primaryKeyAttributes" : [
    "bookingDefinitionID"
  ],
  "purpose" : "A booking definition is the template for an appointment that can be booked using an online booking page.\n\nBooking definitions can be shared across the company, or can be personal definitions owned and managed by an individual user.\n\nPersonal booking definitions are limited to the `Individual` assignment type and must have exactly one assignee. They will have a non-null owner and the `isPersonal` flag set to true.",
  "record" : {
    "allowsRecord" : "Y",
    "isDirectlyUpdatable" : "Y"
  },
  "relationships" : [
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "deleteRule" : "EODeleteRuleCascade",
      "destination" : "BookingDefinitionLocation",
      "isToMany" : "Y",
      "joins" : [
        {
          "destinationAttribute" : "bookingDefinitionID",
          "sourceAttribute" : "bookingDefinitionID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "locations",
      "ownsDestination" : "Y",
      "purpose" : "The location options for schedulers to choose from when booking an appointment.\n\nAll booking definitions must have at least one location.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "deleteRule" : "EODeleteRuleNoAction",
      "destination" : "BookingDefinitionDuration",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "bookingDefinitionDurationID",
          "sourceAttribute" : "defaultDurationID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "defaultDuration",
      "purpose" : "The default duration for the booking definition.\n\nThis duration is also contained in the `durations` relationship.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "deleteRule" : "EODeleteRuleCascade",
      "destination" : "BookingDefinitionDuration",
      "isToMany" : "Y",
      "joins" : [
        {
          "destinationAttribute" : "bookingDefinitionID",
          "sourceAttribute" : "bookingDefinitionID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "durations",
      "ownsDestination" : "Y",
      "purpose" : "All duration options for the booking definition.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "deleteRule" : "EODeleteRuleCascade",
      "destination" : "BookingDefinitionAssignee",
      "destinationAttributeNameForOrdering" : "order",
      "isOrdered" : "Y",
      "isToMany" : "Y",
      "joins" : [
        {
          "destinationAttribute" : "bookingDefinitionID",
          "sourceAttribute" : "bookingDefinitionID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "assignees",
      "ownsDestination" : "Y",
      "purpose" : "The assignees and their availability schedules for the booking definition, in priority order.\n\nThis is an ordered relationship.\n\nAn empty set of assignees is valid for shared booking definitions.\n\nPersonal booking definitions must have exactly one assignee.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "destination" : "Category",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "categoryID",
          "sourceAttribute" : "timeblockCategoryID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "timeblockCategory",
      "purpose" : "The category to apply to new booked appointment timeblocks.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "deleteRule" : "EODeleteRuleCascade",
      "destination" : "KeywordBookingDefinitionJoin",
      "isToMany" : "Y",
      "joins" : [
        {
          "destinationAttribute" : "bookingDefinitionID",
          "sourceAttribute" : "bookingDefinitionID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "bookingDefinitionKeywords",
      "ownsDestination" : "Y",
      "record" : {
        "allowsRecord" : "N",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "definition" : "bookingDefinitionKeywords.keyword",
      "destination" : "Keyword",
      "joins" : [

      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "timeblockKeywords",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "destination" : "VisibilityPreset",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "visibilityPresetID",
          "sourceAttribute" : "timeblockVisibilityPresetID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "timeblockVisibilityPreset",
      "purpose" : "The visibility preset that was selected for booked appointment timeblocks.\n\nWhen non-null, both `timeblockReadPermissions` and `timeblockWritePermissions` must be set to the visibility preset’s read and write permissions.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "destination" : "User",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "userID",
          "sourceAttribute" : "ownerID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "owner",
      "purpose" : "Set to the user who owns this booking definition.\n\nInitially set to the user that creates the booking definition.\n\nIf `isPersonal` is true, the owner cannot be re-assigned. For shared templates, the owner can be assigned to any Daylite user.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "destination" : "User",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "userID",
          "sourceAttribute" : "archivedByID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "archivedBy",
      "purpose" : "The user that archived this booking definition.\n\nThe `archivedBy` relationship and `achivedDate` attribute must be set together.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "destination" : "User",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "userID",
          "sourceAttribute" : "createdByID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "createdBy",
      "purpose" : "The user that created the booking definition.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1200,
      "ash" : {
        "includeInResource" : "Y"
      },
      "deleteRule" : "EODeleteRuleNoAction",
      "destination" : "BookingDefinitionLocation",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "bookingDefinitionLocationID",
          "sourceAttribute" : "defaultLocationID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "defaultLocation",
      "purpose" : "The default location for the booking definition.\n\nThis location is also contained in the `locations` relationship.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    }
  ],
  "supportsPermissions" : false,
  "uniqueIdentifier" : 224
}