@startuml
skinparam {
    ClassBackgroundColor White
    ClassBorderColor Black
    shadowing true
    RoundCorner 0
    LineColor DarkRed
    ArrowColor DarkRed
    ArrowThickness 1
}


class ProductOffering_Common {

    id: string
    href: uri
    name: string
    description: string
    lastUpdate: date-time
    lifecycleStatus: ProductOfferingLifecycleStatusType
    agreement: string
    channel: string[]
    marketSegment: string[]
}

ProductOffering_Common *-->"*" Region : region
ProductOffering_Common *-->"*" ProductCategoryRef : category
ProductOffering_Common *--> ProductSpecificationRef : productSpecification



class ProductOffering {

    statusReason: string
}
ProductOffering_Common <|-- ProductOffering

ProductOffering *-->"*" ProductOfferingLifecycleStatusTransition : statusTransition
ProductOffering *-->"*" AttachmentValue : attachment
ProductOffering *--> RelatedContactInformation : relatedContactInformation
ProductOffering *-->"*" MEFItemTerm : productOfferingTerm
ProductOffering *-->"*" ProductMilestoneDefinition : milestone
ProductOffering *-->"*" Note : note
ProductOffering *--> SchemaRefOrValue : productOfferingSpecification
ProductOffering *-->"*" ProductOfferingContextualInfo : productOfferingContextualInfo
ProductOffering *-->"*" ProductRelationshipConstraint : productRelationship
ProductOffering *-->"*" PlaceRelationshipConstraint : placeRelationship


class ProductCategoryRef {
    id*: string
    href: string
}

class Region {

    locality: string
    stateOrProvince: string
    country*: string
}

class AttachmentValue {

    attachmentId: string
    author*: string
    content: string
    creationDate*: date-time
    description: string
    mimeType: string
    name*: string
    source*: MEFBuyerSellerType
    url: string
}
AttachmentValue *--> MEFByteSize : size

class MEFByteSize {

    amount*: float
    units*: DataSizeUnit
}

class ProductOfferingLifecycleStatusTransition {

    transitionDate*: date-time
    transitionLifecycleStatus*: ProductOfferingLifecycleStatusType
}

class RelatedContactInformation {

    emailAddress*: string
    name*: string
    number*: string
    numberExtension: string
    organization: string
    role*: string
}
class FieldedAddress {

    country*: string
    streetType: string
    postcodeExtension: string
    city*: string
    streetNr: string
    locality: string
    postcode: string
    streetNrLast: string
    streetNrSuffix: string
    streetName*: string
    stateOrProvince: string
    streetNrLastSuffix: string
    streetSuffix: string
}

RelatedContactInformation *--> FieldedAddress : postalAddress

class GeographicSubAddress {

    buildingName: string
    id: string
    levelNumber: string
    levelType: string
    privateStreetName: string
    privateStreetNumber: string
}
FieldedAddress *--> GeographicSubAddress : geographicSubAddress



class MEFSubUnit {

    subUnitNumber*: string
    subUnitType*: string
}
GeographicSubAddress *-->"*" MEFSubUnit : subUnit
class MEFItemTerm {

    name*: string
    description: string
    endOfTermAction*: MEFEndOfTermAction
}

MEFItemTerm *-->"1" Duration : duration
MEFItemTerm *--> Duration : rollInterval

class Duration {
    amount*: number
    units*: TimeUnit
}

class Note {

    author*: string
    date*: date-time
    id*: string
    source*: MEFBuyerSellerType
    text*: string
}

class ProductSpecificationRef {
    id*: string
    href: string
}

class ProductOfferingContextualInfo {

}

ProductOfferingContextualInfo *-->"1" SchemaRefOrValue : contextSchema
ProductOfferingContextualInfo *-->"1" Context : context


class Context {

    productAction: ProductActionMask
    businessFunction: BusinessFunctionMask
}

class SchemaRefOrValue {

    schema: string
    schemaLocation: uri
}

enum ProductActionMask {

    add
    modify
    all
}
enum BusinessFunctionMask {

    poq
    quote
    productOrder
    productInventory
    all
}

enum TimeUnit {

    calendarMonths
    calendarDays
    calendarHours
    calendarMinutes
    businessDays
    businessHours
    businessMinutes
}

enum MEFEndOfTermAction {

    roll
    autoDisconnect
    autoRenew
}

enum MEFBuyerSellerType {

    buyer
    seller
}

enum DataSizeUnit{
    BYTES
    KBYTES
    MBYTES
    GBYTES
    TBYTES
    PBYTES
    EBYTES
    ZBYTES
    YBYTES
}

enum ProductOfferingLifecycleStatusType {

    announced
    endOfSale
    endOfSupport
    inTest
    obsolete
    onHold
    orderable
    rejected
}

@enduml
