{
  "addedInModelVersion" : 1100,
  "ash" : {
    "generateResource" : "Y"
  },
  "attributes" : [
    {
      "addedInModelVersion" : 1100,
      "allowsNull" : "N",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "_rowid",
      "externalType" : "longlong",
      "isIndexed" : "Y",
      "name" : "timeblockVideoConferenceLocationID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1100,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "deletionUserID",
      "externalType" : "int",
      "isIndexed" : "Y",
      "name" : "deletionUserID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1100,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "deletionDate",
      "externalType" : "datetime",
      "isIndexed" : "Y",
      "name" : "deletionDate",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSDate"
    },
    {
      "addedInModelVersion" : 1100,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "deletionIdentifier",
      "externalType" : "char",
      "isIndexed" : "Y",
      "name" : "deletionIdentifier",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSString",
      "width" : 255
    },
    {
      "addedInModelVersion" : 1100,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "lifecycle",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "lifecycle",
      "purpose" : "The desired state of the timeblock's video conference location.\n\nThis attribute is only updated by the apps.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "EnumInteger",
      "valueEnum" : "TimeblockVideoConferenceLocationLifecycle"
    },
    {
      "addedInModelVersion" : 1100,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "state",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "state",
      "purpose" : "The actual state of the timeblock's video conference location.\n\nThis attribute is only updated by the backend.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "EnumInteger",
      "valueEnum" : "TimeblockVideoConferenceLocationState"
    },
    {
      "addedInModelVersion" : 1100,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "errorCode",
      "defaultValue" : "0",
      "externalType" : "int",
      "name" : "errorCode",
      "purpose" : "The error representing the reason for the `state` being `ScheduleFailed` or `UpdateFailed`.",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "EnumInteger",
      "valueEnum" : "TimeblockVideoConferenceLocationErrorCode"
    },
    {
      "addedInModelVersion" : 1100,
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "configID",
      "externalType" : "longlong",
      "name" : "configID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    },
    {
      "addedInModelVersion" : 1100,
      "allowsNull" : "Y",
      "ash" : {
        "includeInResource" : "Y"
      },
      "columnName" : "meetingID",
      "externalType" : "longlong",
      "name" : "meetingID",
      "record" : {
        "allowsRecord" : "Y",
        "isInternal" : "N",
        "isUpdatable" : "Y"
      },
      "valueClassName" : "NSNumber",
      "valueType" : "i"
    }
  ],
  "className" : "GWTimeblockVideoConferenceLocation",
  "classProperties" : [
    "timeblockVideoConferenceLocationID",
    "deletionUserID",
    "deletionDate",
    "deletionIdentifier",
    "lifecycle",
    "state",
    "errorCode",
    "configID",
    "meetingID",
    "config",
    "meeting"
  ],
  "domain" : "Events",
  "enums" : [
    {
      "addedInModelVersion" : 1100,
      "items" : [
        {
          "addedInModelVersion" : 1100,
          "name" : "Scheduled",
          "purpose" : "The app's desired state is to have a fulfilled video conference meeting.",
          "value" : 0
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "Deleted",
          "purpose" : "The app's desired state is to delete the video conference meeting.",
          "value" : 1
        }
      ],
      "name" : "TimeblockVideoConferenceLocationLifecycle",
      "purpose" : "The desired state of the timeblock's video conference location.",
      "type" : 1
    },
    {
      "addedInModelVersion" : 1100,
      "items" : [
        {
          "addedInModelVersion" : 1100,
          "name" : "SchedulePending",
          "purpose" : "Waiting for the backend to create the initial video conference meeting with the provider.",
          "value" : 0
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "UpdatePending",
          "purpose" : "The timeblock has changed, and the video conference meeting needs to be updated.",
          "value" : 4
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "Updated",
          "purpose" : "The latest request to schedule or update the video conference meeting was successful.",
          "value" : 1
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "UpdateFailed",
          "purpose" : "The video conference meeting was originally scheduled successfully, but the last attempt to update it was unsuccessful. Some ``meeting`` attributes are out of sync with the timeblock, but it's join url is still valid. See ``errorCode`` for the failure reason.",
          "value" : 2
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "ScheduleFailed",
          "purpose" : "An error occurred when initially creating the video conference meeting. See ``errorCode`` for the reason.",
          "value" : 3
        }
      ],
      "name" : "TimeblockVideoConferenceLocationState",
      "purpose" : "The actual state of the timeblock's video conference location.",
      "type" : 1
    },
    {
      "addedInModelVersion" : 1100,
      "items" : [
        {
          "addedInModelVersion" : 1100,
          "name" : "None",
          "purpose" : "No error.",
          "value" : 0
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "MissingData",
          "purpose" : "Required data was unavailable, e.g. the `VideoConferenceConfig`, or the `Timeblock`.",
          "value" : 1
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "FloatingTimeblockNotSupported",
          "purpose" : "The timeblock does not have a timezone, so a video conference meeting cannot be scheduled for it.",
          "value" : 2
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "RepeatingTimeblockNotSupported",
          "purpose" : "The timeblock is repeating, and the selected video conference provider does not support repeating meetings.",
          "value" : 3
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "ProviderUnknownError",
          "purpose" : "An unknown error from the video conference provider.",
          "value" : 4
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "ProviderNetworkFailure",
          "purpose" : "Network failure for the video conference provider.",
          "value" : 5
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "ProviderRateLimited",
          "purpose" : "Rate limited from the video conference provider.",
          "value" : 6
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "ProviderAuthenticationFailed",
          "purpose" : "Authentication failed for the video conference provider.",
          "value" : 7
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "ProviderInvalidRequest",
          "purpose" : "Invalid request for the video conference provider.",
          "value" : 8
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "ProviderForbidden",
          "purpose" : "Forbidden by the video conference provider.",
          "value" : 9
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "ProviderNotFound",
          "purpose" : "Not found by the video conference provider.",
          "value" : 10
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "ArchivedConfig",
          "purpose" : "The video conference config has been archived and cannot be used to create, update, or delete the meeting link.",
          "value" : 11
        },
        {
          "addedInModelVersion" : 1100,
          "name" : "TimeblockOriginNotSupported",
          "purpose" : "The timeblock origin is not supported for scheduling video conference meetings.",
          "value" : 12
        }
      ],
      "name" : "TimeblockVideoConferenceLocationErrorCode",
      "purpose" : "The error representing the reason for the `state` being `ScheduleFailed` or `UpdateFailed`.",
      "type" : 1
    }
  ],
  "externalName" : "TimeblockVideoConferenceLocation",
  "isDatabasePreference" : false,
  "isTrashable" : true,
  "moduleName" : "DLSubstrate",
  "name" : "TimeblockVideoConferenceLocation",
  "primaryKeyAttributes" : [
    "timeblockVideoConferenceLocationID"
  ],
  "purpose" : "A deferred video conferencing \/ meeting link location for a Timeblock.\n\nThis entity acts as a \"promise\" that the backend will fulfill by scheduling the meeting with the selected provider.\n\nThe app controls the desired state via the `lifetime` attribute, and the backend controls the actual state via the `state` attribute. These are \"one-shot\" objects that do not support reuse. This object tracks a _single_ video conference meeting across it's lifetime from it being scheduled to it being deleted. Any event that changes the identity of the meeting must also change the identity of the timeblock's `timeblockVideoConferernceLocation`.\n\nThe app creates this object, setting its ``lifetime`` value to `Scheduled`, which indicates to the backend that the desired state for this location is to have a fulfilled video conference meeting.\n\nThe backend will detect objects in this state and schedule the meeting using the selected provider configuration. Upon completion, it will set the `state` to `Updated` and the `meeting` to the new `VideoConferenceMeeting` object.\n\nThroughout the lifetime of the video conference location, it may transition from `InSync` to `UpdatePending` or `UpdateFailed` multiple times. The ``meeting`` is preserved during these transition, but it may be out of sync with the timeblock unless the state is `Updated`.\n\nWhen the app removes a video conference location from a timeblock, or a timeblock is deleted, it sets the `lifetime` to `deleted`, and nullifies it's relationship to the `timeblockVideoConferenceLocation`. It **does not** delete the `TimeblockVideoConferenceLocation` from the database. The backend will detect the `deleted` lifetime state and then delete the corresponding video conference meeting from the provider before finally deleting the `TimeblockVideoConferenceLocation` from the database, which cascades to delete the `VideoConferenceMeeting`.",
  "record" : {
    "allowsRecord" : "Y",
    "isDirectlyUpdatable" : "Y"
  },
  "relationships" : [
    {
      "addedInModelVersion" : 1100,
      "ash" : {
        "includeInResource" : "Y"
      },
      "destination" : "VideoConferenceConfig",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "videoConferenceConfigID",
          "sourceAttribute" : "configID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "config",
      "purpose" : "The video conference configuration that is used to schedule the meeting.\n\nThis must be set to a valid configuration at all times.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    },
    {
      "addedInModelVersion" : 1100,
      "ash" : {
        "includeInResource" : "Y"
      },
      "deleteRule" : "EODeleteRuleCascade",
      "destination" : "VideoConferenceMeeting",
      "isToMany" : "N",
      "joins" : [
        {
          "destinationAttribute" : "videoConferenceMeetingID",
          "sourceAttribute" : "meetingID"
        }
      ],
      "joinSemantic" : "EOInnerJoin",
      "name" : "meeting",
      "ownsDestination" : "Y",
      "purpose" : "The video conference meeting once it has been scheduled.\n\nThis relationship is null while `state` is `SchedulePending` or `ScheduleFailed`.",
      "record" : {
        "allowsRecord" : "Y",
        "isEmbedded" : "N",
        "isInternal" : "N",
        "propagatesUpdates" : "N"
      }
    }
  ],
  "supportsPermissions" : false,
  "uniqueIdentifier" : 218
}