@startuml

hide empty fields
hide empty methods
legend
|= |= line |
|<back:black>   </back>| inheritance |
|<back:green>   </back>| property reference |
|<back:blue>   </back>| discriminated class |
endlegend
interface ProductReference [[ProductReference.svg]] extends Reference {
    typeId: [[ReferenceTypeId.svg ReferenceTypeId]]
    id: String
    obj: [[Product.svg Product]]
}
interface Reference [[Reference.svg]]  {
    typeId: [[ReferenceTypeId.svg ReferenceTypeId]]
    id: String
}


interface Review [[Review.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    key: String
    uniquenessValue: String
    locale: String
    authorName: String
    title: String
    text: String
    target: [[Object.svg Object]]
    includedInStatistics: Boolean
    rating: Integer
    state: [[StateReference.svg StateReference]]
    customer: [[CustomerReference.svg CustomerReference]]
    custom: [[CustomFields.svg CustomFields]]
}
interface CartDiscountValueGiftLineItem [[CartDiscountValueGiftLineItem.svg]]  {
    type: String
    product: [[ProductReference.svg ProductReference]]
    variantId: Long
    supplyChannel: [[ChannelReference.svg ChannelReference]]
    distributionChannel: [[ChannelReference.svg ChannelReference]]
}
interface ProductAssignmentMissingError [[ProductAssignmentMissingError.svg]]  {
    code: String
    message: String
    product: [[ProductReference.svg ProductReference]]
}
interface ProductPresentWithDifferentVariantSelectionError [[ProductPresentWithDifferentVariantSelectionError.svg]]  {
    code: String
    message: String
    product: [[ProductReference.svg ProductReference]]
    existingVariantSelection: [[ProductVariantSelection.svg ProductVariantSelection]]
}
interface GraphQLProductAssignmentMissingError [[GraphQLProductAssignmentMissingError.svg]]  {
    code: String
    product: [[ProductReference.svg ProductReference]]
}
interface GraphQLProductPresentWithDifferentVariantSelectionError [[GraphQLProductPresentWithDifferentVariantSelectionError.svg]]  {
    code: String
    product: [[ProductReference.svg ProductReference]]
    existingVariantSelection: [[ProductVariantSelection.svg ProductVariantSelection]]
}
interface ProductSelectionProductAddedMessage [[ProductSelectionProductAddedMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    product: [[ProductReference.svg ProductReference]]
    variantSelection: [[ProductVariantSelection.svg ProductVariantSelection]]
}
interface ProductSelectionProductExcludedMessage [[ProductSelectionProductExcludedMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    product: [[ProductReference.svg ProductReference]]
    variantExclusion: [[ProductVariantExclusion.svg ProductVariantExclusion]]
}
interface ProductSelectionProductRemovedMessage [[ProductSelectionProductRemovedMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    product: [[ProductReference.svg ProductReference]]
}
interface ProductSelectionVariantExclusionChangedMessage [[ProductSelectionVariantExclusionChangedMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    product: [[ProductReference.svg ProductReference]]
    oldVariantExclusion: [[ProductVariantExclusion.svg ProductVariantExclusion]]
    newVariantExclusion: [[ProductVariantExclusion.svg ProductVariantExclusion]]
}
interface ProductSelectionVariantSelectionChangedMessage [[ProductSelectionVariantSelectionChangedMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    product: [[ProductReference.svg ProductReference]]
    oldVariantSelection: [[ProductVariantSelection.svg ProductVariantSelection]]
    newVariantSelection: [[ProductVariantSelection.svg ProductVariantSelection]]
}
interface ProductTailoringCreatedMessage [[ProductTailoringCreatedMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    key: String
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
    description: [[LocalizedString.svg LocalizedString]]
    name: [[LocalizedString.svg LocalizedString]]
    slug: [[LocalizedString.svg LocalizedString]]
    published: Boolean
}
interface ProductTailoringDeletedMessage [[ProductTailoringDeletedMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
}
interface ProductTailoringDescriptionSetMessage [[ProductTailoringDescriptionSetMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
    description: [[LocalizedString.svg LocalizedString]]
    oldDescription: [[LocalizedString.svg LocalizedString]]
}
interface ProductTailoringNameSetMessage [[ProductTailoringNameSetMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
    name: [[LocalizedString.svg LocalizedString]]
    oldName: [[LocalizedString.svg LocalizedString]]
}
interface ProductTailoringPublishedMessage [[ProductTailoringPublishedMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
}
interface ProductTailoringSlugSetMessage [[ProductTailoringSlugSetMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
    slug: [[LocalizedString.svg LocalizedString]]
    oldSlug: [[LocalizedString.svg LocalizedString]]
}
interface ProductTailoringUnpublishedMessage [[ProductTailoringUnpublishedMessage.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    sequenceNumber: Long
    resource: [[Reference.svg Reference]]
    resourceVersion: Long
    type: String
    resourceUserProvidedIdentifiers: [[UserProvidedIdentifiers.svg UserProvidedIdentifiers]]
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
}
interface ProductSelectionProductAddedMessagePayload [[ProductSelectionProductAddedMessagePayload.svg]]  {
    type: String
    product: [[ProductReference.svg ProductReference]]
    variantSelection: [[ProductVariantSelection.svg ProductVariantSelection]]
}
interface ProductSelectionProductExcludedMessagePayload [[ProductSelectionProductExcludedMessagePayload.svg]]  {
    type: String
    product: [[ProductReference.svg ProductReference]]
    variantExclusion: [[ProductVariantExclusion.svg ProductVariantExclusion]]
}
interface ProductSelectionProductRemovedMessagePayload [[ProductSelectionProductRemovedMessagePayload.svg]]  {
    type: String
    product: [[ProductReference.svg ProductReference]]
}
interface ProductSelectionVariantExclusionChangedMessagePayload [[ProductSelectionVariantExclusionChangedMessagePayload.svg]]  {
    type: String
    product: [[ProductReference.svg ProductReference]]
    oldVariantExclusion: [[ProductVariantExclusion.svg ProductVariantExclusion]]
    newVariantExclusion: [[ProductVariantExclusion.svg ProductVariantExclusion]]
}
interface ProductSelectionVariantSelectionChangedMessagePayload [[ProductSelectionVariantSelectionChangedMessagePayload.svg]]  {
    type: String
    product: [[ProductReference.svg ProductReference]]
    oldVariantSelection: [[ProductVariantSelection.svg ProductVariantSelection]]
    newVariantSelection: [[ProductVariantSelection.svg ProductVariantSelection]]
}
interface ProductTailoringCreatedMessagePayload [[ProductTailoringCreatedMessagePayload.svg]]  {
    type: String
    key: String
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
    description: [[LocalizedString.svg LocalizedString]]
    name: [[LocalizedString.svg LocalizedString]]
    slug: [[LocalizedString.svg LocalizedString]]
    published: Boolean
}
interface ProductTailoringDeletedMessagePayload [[ProductTailoringDeletedMessagePayload.svg]]  {
    type: String
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
}
interface ProductTailoringDescriptionSetMessagePayload [[ProductTailoringDescriptionSetMessagePayload.svg]]  {
    type: String
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
    description: [[LocalizedString.svg LocalizedString]]
    oldDescription: [[LocalizedString.svg LocalizedString]]
}
interface ProductTailoringNameSetMessagePayload [[ProductTailoringNameSetMessagePayload.svg]]  {
    type: String
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
    name: [[LocalizedString.svg LocalizedString]]
    oldName: [[LocalizedString.svg LocalizedString]]
}
interface ProductTailoringPublishedMessagePayload [[ProductTailoringPublishedMessagePayload.svg]]  {
    type: String
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
}
interface ProductTailoringSlugSetMessagePayload [[ProductTailoringSlugSetMessagePayload.svg]]  {
    type: String
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
    slug: [[LocalizedString.svg LocalizedString]]
    oldSlug: [[LocalizedString.svg LocalizedString]]
}
interface ProductTailoringUnpublishedMessagePayload [[ProductTailoringUnpublishedMessagePayload.svg]]  {
    type: String
    store: [[StoreKeyReference.svg StoreKeyReference]]
    productKey: String
    product: [[ProductReference.svg ProductReference]]
}
interface AssignedProductReference [[AssignedProductReference.svg]]  {
    product: [[ProductReference.svg ProductReference]]
    variantSelection: [[ProductVariantSelection.svg ProductVariantSelection]]
    variantExclusion: [[ProductVariantExclusion.svg ProductVariantExclusion]]
}
interface ProductSelectionAssignment [[ProductSelectionAssignment.svg]]  {
    product: [[ProductReference.svg ProductReference]]
    productSelection: [[ProductSelectionReference.svg ProductSelectionReference]]
    variantSelection: [[ProductVariantSelection.svg ProductVariantSelection]]
    variantExclusion: [[ProductVariantExclusion.svg ProductVariantExclusion]]
}
interface ProductTailoring [[ProductTailoring.svg]]  {
    id: String
    version: Long
    createdAt: DateTime
    lastModifiedAt: DateTime
    lastModifiedBy: [[LastModifiedBy.svg LastModifiedBy]]
    createdBy: [[CreatedBy.svg CreatedBy]]
    key: String
    store: [[StoreKeyReference.svg StoreKeyReference]]
    product: [[ProductReference.svg ProductReference]]
    published: Boolean
    current: [[ProductTailoringData.svg ProductTailoringData]]
    staged: [[ProductTailoringData.svg ProductTailoringData]]
    hasStagedChanges: Boolean
}

ProductReference --> Review #green;text:green : "target"
ProductReference --> CartDiscountValueGiftLineItem #green;text:green : "product"
ProductReference --> ProductAssignmentMissingError #green;text:green : "product"
ProductReference --> ProductPresentWithDifferentVariantSelectionError #green;text:green : "product"
ProductReference --> GraphQLProductAssignmentMissingError #green;text:green : "product"
ProductReference --> GraphQLProductPresentWithDifferentVariantSelectionError #green;text:green : "product"
ProductReference --> ProductSelectionProductAddedMessage #green;text:green : "product"
ProductReference --> ProductSelectionProductExcludedMessage #green;text:green : "product"
ProductReference --> ProductSelectionProductRemovedMessage #green;text:green : "product"
ProductReference --> ProductSelectionVariantExclusionChangedMessage #green;text:green : "product"
ProductReference --> ProductSelectionVariantSelectionChangedMessage #green;text:green : "product"
ProductReference --> ProductTailoringCreatedMessage #green;text:green : "product"
ProductReference --> ProductTailoringDeletedMessage #green;text:green : "product"
ProductReference --> ProductTailoringDescriptionSetMessage #green;text:green : "product"
ProductReference --> ProductTailoringNameSetMessage #green;text:green : "product"
ProductReference --> ProductTailoringPublishedMessage #green;text:green : "product"
ProductReference --> ProductTailoringSlugSetMessage #green;text:green : "product"
ProductReference --> ProductTailoringUnpublishedMessage #green;text:green : "product"
ProductReference --> ProductSelectionProductAddedMessagePayload #green;text:green : "product"
ProductReference --> ProductSelectionProductExcludedMessagePayload #green;text:green : "product"
ProductReference --> ProductSelectionProductRemovedMessagePayload #green;text:green : "product"
ProductReference --> ProductSelectionVariantExclusionChangedMessagePayload #green;text:green : "product"
ProductReference --> ProductSelectionVariantSelectionChangedMessagePayload #green;text:green : "product"
ProductReference --> ProductTailoringCreatedMessagePayload #green;text:green : "product"
ProductReference --> ProductTailoringDeletedMessagePayload #green;text:green : "product"
ProductReference --> ProductTailoringDescriptionSetMessagePayload #green;text:green : "product"
ProductReference --> ProductTailoringNameSetMessagePayload #green;text:green : "product"
ProductReference --> ProductTailoringPublishedMessagePayload #green;text:green : "product"
ProductReference --> ProductTailoringSlugSetMessagePayload #green;text:green : "product"
ProductReference --> ProductTailoringUnpublishedMessagePayload #green;text:green : "product"
ProductReference --> AssignedProductReference #green;text:green : "product"
ProductReference --> ProductSelectionAssignment #green;text:green : "product"
ProductReference --> ProductTailoring #green;text:green : "product"
@enduml
