{
  "addedInModelVersion" : 1001,
  "ash" : {
    "generateResource" : "Y"
  },
  "attributes" : [
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "N",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "_rowid",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "externalInvitationID",
      "record" : {
        "allowsRecord" : "N",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1001,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "invitationType",
      "defaultValue" : "0",
      "externalType" : "int",
      "isIndexed" : "Y",
      "name" : "invitationType",
      "purpose" : "The type of external invitation, which impacts the email and ICS file that the backend generates.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "EnumInteger",
      "valueEnum" : "ExternalInvitationType",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1001,
      "ash" : {
        "ashName" : "send_to_all_recipients?",
        "includeInResource" : "Y"
      },
      "columnName" : "sendToAllRecipients",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "sendToAllRecipients",
      "purpose" : "Set to `true` when the backend is expected to resolve ‘All’ recipients when processing the external invitation.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Boolean"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "emailSubject",
      "externalType" : "char",
      "name" : "emailSubject",
      "purpose" : "The organizing user may enter a custom email subject to be used for the generated email.\n\n- Note: `emailMessage` is only supported for invitations of type `.invite` or `.cancel`.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 2048
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "emailMessage",
      "externalType" : "char",
      "name" : "emailMessage",
      "purpose" : "The organizing user may enter a custom message to be included within the body of the generated emails.\n\n- Note: `emailMessage` is only supported for invitations of type `.invite` or `.cancel`.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 8192
    },
    {
      "addedInModelVersion" : 1001,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "status",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "status",
      "purpose" : "The processing status of the overall invitation by the backend.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "EnumInteger",
      "valueEnum" : "ExternalInvitationStatus",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1001,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "icsSequence",
      "defaultValue" : "-1",
      "externalType" : "int",
      "name" : "icsSequence",
      "purpose" : "The backend increments the ICS sequence number when there are significant revisions to the appointment details.\n\nDefaults to -1, which is an invalid sequence number.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Integer",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockDAVIdentifier",
      "externalType" : "char",
      "name" : "timeblockDAVIdentifier",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/davIdentifier``.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 1024
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "ashType" : ":timestamp_seconds",
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockStartDate",
      "externalType" : "datetime",
      "name" : "timeblockStartDate",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/startDate``.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSDate"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "ashType" : ":timestamp_seconds",
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockEndDate",
      "externalType" : "datetime",
      "name" : "timeblockEndDate",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/endDate``.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSDate"
    },
    {
      "addedInModelVersion" : 1001,
      "ash" : {
        "ashName" : "timeblock_all_day?",
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockAllDay",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "timeblockAllDay",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/allDay``.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Boolean"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockLocation",
      "externalType" : "char",
      "name" : "timeblockLocation",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/location``.\n\nSuperseded by ``timeblockVideoConferenceJoinURL`` when it is non-null.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 2048
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockSubject",
      "externalType" : "char",
      "name" : "timeblockSubject",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/subject``.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 2048
    },
    {
      "addedInModelVersion" : 1001,
      "ash" : {
        "ashName" : "timeblock_status",
        "ashType" : "Daylite.Events.Timeblock.Status",
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockStatusCode",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "timeblockStatusCode",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/statusCode``.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1001,
      "ash" : {
        "ashName" : "timeblock_show_as_busy?",
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockShowAsBusy",
      "defaultValue" : "1",
      "externalType" : "int",
      "name" : "timeblockShowAsBusy",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/showAsBusy``.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Boolean",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockDetails",
      "externalType" : "char",
      "name" : "timeblockDetails",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/details``.\n\n- Note: The `details` property is only tracked if the ``ExternalInvitationConfig\/includeDetails`` value is `true`.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 8192
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockCreateDate",
      "externalType" : "datetime",
      "name" : "timeblockCreateDate",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/createDate``.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSDate"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockModifyDate",
      "externalType" : "datetime",
      "name" : "timeblockModifyDate",
      "purpose" : "For history tracking, when the invitation is processed this property is updated with the current value from ``Timeblock\/modifyDate``.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSDate"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockID",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "timeblockID",
      "record" : {
        "allowsRecord" : "N",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "externalInvitationConfigID",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "externalInvitationConfigID",
      "record" : {
        "allowsRecord" : "N",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "createDate",
      "externalType" : "datetime",
      "name" : "createDate",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSDate"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "modifyDate",
      "externalType" : "datetime",
      "name" : "modifyDate",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSDate"
    },
    {
      "addedInModelVersion" : 1001,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockTimeZoneName",
      "externalType" : "char",
      "name" : "timeblockTimeZoneName",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 256
    },
    {
      "addedInModelVersion" : 1100,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockVideoConferenceJoinURL",
      "externalType" : "char",
      "name" : "timeblockVideoConferenceJoinURL",
      "purpose" : "For history tracking, when the invitation is processed this attribute is updated with the current value from the timeblock's video conference meeting (``VideoConferenceMeeting\/joinURL``), if there is one.\n\nWhen processing invitations, if this value is non-null, it supercedes the ``timeblockLocation`` field.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 1024
    },
    {
      "addedInModelVersion" : 1100,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockVideoConferenceProviderInvitation",
      "externalType" : "char",
      "name" : "timeblockVideoConferenceProviderInvitation",
      "purpose" : "For history tracking, when the invitation is processed this attribute is updated with the current value from the timeblock's video conference meeting (``VideoConferenceMeeting\/providerInvitation``), if there is one.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 8192
    },
    {
      "addedInModelVersion" : 1100,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockVideoConferenceDialInURL",
      "externalType" : "char",
      "name" : "timeblockVideoConferenceDialInURL",
      "purpose" : "For history tracking, when the invitation is processed this attribute is updated with the current value from the timeblock's video conference meeting (``VideoConferenceMeeting\/dialInURL``), if there is one.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 1024
    },
    {
      "addedInModelVersion" : 1100,
      "allowsNull" : "Y",
      "ash" : {
        "ashType" : ":plist",
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockVideoConferenceDialInNumbers",
      "externalType" : "object",
      "name" : "timeblockVideoConferenceDialInNumbers",
      "purpose" : "For history tracking, when the invitation is processed this attribute is updated with the current value from the timeblock's video conference meeting (``VideoConferenceMeeting\/dialInNumbers``), if there is one.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSData"
    },
    {
      "addedInModelVersion" : 1100,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockHadVideoConferenceLocation",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "timeblockHadVideoConferenceLocation",
      "purpose" : "Set to true if the timeblock had a video conference location at the time the invitation was processed.\n\nThis is set to true even when the video conference location failed to schedule.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "Boolean"
    },
    {
      "addedInModelVersion" : 1100,
      "allowsNull" : "N",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "timeblockVideoConferenceProvider",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "timeblockVideoConferenceProvider",
      "purpose" : "For history tracking, when the invitation is processed this attribute is updated with the current value from the timeblock's video conference config (``VideoConferenceConfig\/provider``), if there is one.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "EnumInteger",
      "valueEnum" : "VideoConferenceConfig.VideoConferenceConfigProvider",
      "valueType" : "i"
    }
  ],
  "className" : "GWExternalInvitation",
  "classProperties" : [
    "externalInvitationID",
    "invitationType",
    "sendToAllRecipients",
    "emailSubject",
    "emailMessage",
    "status",
    "icsSequence",
    "timeblockDAVIdentifier",
    "timeblockStartDate",
    "timeblockEndDate",
    "timeblockAllDay",
    "timeblockLocation",
    "timeblockSubject",
    "timeblockStatusCode",
    "timeblockShowAsBusy",
    "timeblockDetails",
    "timeblockCreateDate",
    "timeblockModifyDate",
    "timeblockID",
    "externalInvitationConfigID",
    "createDate",
    "modifyDate",
    "timeblockTimeZoneName",
    "timeblockVideoConferenceJoinURL",
    "timeblockVideoConferenceProviderInvitation",
    "timeblockVideoConferenceDialInURL",
    "timeblockVideoConferenceDialInNumbers",
    "timeblockHadVideoConferenceLocation",
    "timeblockVideoConferenceProvider",
    "timeblock",
    "recipients",
    "externalInvitationConfig"
  ],
  "domain" : "Meetings",
  "enums" : [
    {
      "addedInModelVersion" : 1001,
      "items" : [
        {
          "addedInModelVersion" : 1001,
          "name" : "Invite",
          "purpose" : "Used when sending an initial invitation to an external invitee, or when resending invitations.\n\nThe app may either specify ``ExternalInvitation\/sendToAllRecipients`` as `true` or specify individual recipients in the `recipients` relationship. \n\nThe user _may_ enter a custom ``ExternalInvitation\/emailSubject`` and ``ExternalInvitation\/emailMessage`` to be included in the generated email.",
          "value" : 0
        },
        {
          "addedInModelVersion" : 1001,
          "name" : "Update",
          "purpose" : "Used to notify all external invitees of a _signficant change_ to the appointment. \n\nUpdate invitations are always sent to all external invitees. The app will always specify ``ExternalInvitation\/sendToAllRecipients`` as `true`.\n\nUsers cannot enter a custom subject or message for `.update` invitations.",
          "value" : 1
        },
        {
          "addedInModelVersion" : 1001,
          "name" : "Cancel",
          "purpose" : "Notifies invitees that they are no longer expected at an appointment, either due to the appointment being cancelled or the invitee being removed from the list of participants.\n\nThe app may either specify ``ExternalInvitation\/sendToAllRecipients`` as `true` or specify individual recipients in the `recipients` relationship. \n\nThe user _may_ enter a custom ``ExternalInvitation\/emailSubject`` and ``ExternalInvitation\/emailMessage`` to be included in the generated email.",
          "value" : 2
        }
      ],
      "name" : "ExternalInvitationType",
      "purpose" : "Represents the type of external invitation, which impacts the email and ICS file that the backend generates for it.",
      "type" : 1
    },
    {
      "addedInModelVersion" : 1001,
      "items" : [
        {
          "addedInModelVersion" : 1001,
          "name" : "Pending",
          "purpose" : "The backend has not processed this invitation yet.",
          "value" : 0
        },
        {
          "addedInModelVersion" : 1001,
          "name" : "Completed",
          "purpose" : "The backend has finished processing this invitation.",
          "value" : 1
        }
      ],
      "name" : "ExternalInvitationStatus",
      "purpose" : "Represents the processing status of the overall invitation.\n\nThe status of individual emails to recipients can be monitored via the associated ``ExternalInvitationRecipient`` objects.",
      "type" : 1
    }
  ],
  "externalName" : "ExternalInvitation",
  "isDatabasePreference" : false,
  "isTrashable" : false,
  "moduleName" : "DLSubstrate",
  "name" : "ExternalInvitation",
  "primaryKeyAttributes" : [
    "externalInvitationID"
  ],
  "purpose" : "Represents an Invite, Update, or Cancel invitation that the user confirmed to send to an external invitee. \n\nThe `ExternalInvitation` object is also used to track the status of the invitation. The app creates the `ExternalInvitation` object, and then the backend updates its status in response to processing that it does, including tracking the associated `Timeblock` state that was used to generate the invitation email and ICS file.",
  "record" : {
    "allowsRecord" : "Y",
    "isDirectlyUpdatable" : "Y"
  },
  "relationships" : [
    {
      "addedInModelVersion" : 1001,
      "ash" : {
        "includeInResource" : "Y"
      },
      "deleteRule" : "EODeleteRuleNoAction",
      "destination" : "Timeblock",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "timeblockID",
          "sourceAttribute" : "timeblockID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "timeblock",
      "purpose" : "The appointment that this external invitation was created for.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1001,
      "ash" : {
        "includeInResource" : "Y"
      },
      "deleteRule" : "EODeleteRuleCascade",
      "destination" : "ExternalInvitationRecipient",
      "isToMany" : "Y",
      "joins" : [
        {
          "destinationAttribute" : "externalInvitationID",
          "sourceAttribute" : "externalInvitationID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "recipients",
      "ownsDestination" : "Y",
      "purpose" : "The recipients for the external invitation.\n\nThe behaviour of this relationship depends on the value of ``ExternalInvitation\/sendToAllRecipients``:\n\n- If `true`, the relationship must be empty upon creation by the app. The backend will resolve all recipients and populate this relationship at the time the invitation is processed.\n- If `false`, the app must specify the individual recipients that are being invited or cancelled for the invitation.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1001,
      "ash" : {
        "includeInResource" : "Y"
      },
      "destination" : "ExternalInvitationConfig",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "externalInvitationConfigID",
          "sourceAttribute" : "externalInvitationConfigID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "externalInvitationConfig",
      "purpose" : "The external invitation configuration that is used for this invitation.\n\nThe app sets this relationship when the `ExternalInvitation` is originally created.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    }
  ],
  "supportsPermissions" : false,
  "syncs" : false,
  "uniqueIdentifier" : 200
}