@startuml
skinparam class {
    BackgroundColor<<master-data>> LightSalmon
    BackgroundColor<<work-product-component>> Gold
    BackgroundColor<<abstract>> LightSteelBlue
    BackgroundColor<<reference-data>> Turquoise
    BackgroundColor<<error>> Red
    packageStyle rectangle
}
package "AbstractProject.1.0.0 Entity" <<rectangle>>
{
   abstract class "AbstractProject" <<abstract>>
   note top of "AbstractProject" : Class evaluated\nin this E-R diagram
   abstract class "AbstractAliasNames" <<abstract>>
   class "Organisation" <<master-data>>
   "AbstractAliasNames" --> "1" "Organisation" : "DefinitionOrganisationID"
   "Organisation" *-- "*" "AbstractAliasNames" : "OrganisationNameAlias"
   abstract class "AbstractSpatialLocation" <<abstract>>
   abstract class "AbstractCoordinates" <<abstract>>
   class "QuantitativeAccuracyBand" <<reference-data>>
   "AbstractSpatialLocation" --> "1" "QuantitativeAccuracyBand" : "QuantitativeAccuracyBandID"
   "AbstractSpatialLocation" *-- "*" "AbstractCoordinates" : "Coordinates"
   class "VerticalCRS" <<reference-data>>
   "AbstractSpatialLocation" --> "1" "VerticalCRS" : "VerticalCRSID"
   class "HorizontalCRS" <<reference-data>>
   "AbstractSpatialLocation" --> "1" "HorizontalCRS" : "HorizontalCRSID"
   class "UnitOfMeasure" <<reference-data>>
   "AbstractSpatialLocation" --> "1" "UnitOfMeasure" : "HeightAboveGroundLevelUOMID"
   class "UnitQuantity" <<reference-data>>
   "UnitOfMeasure" --> "1" "UnitQuantity" : "UnitQuantityID"
   abstract class "AbstractGeoContext" <<abstract>>
   abstract class "AbstractGeoPoliticalContext" <<abstract>>
   class "GeoPoliticalEntity" <<master-data>>
   "AbstractGeoPoliticalContext" --> "1" "GeoPoliticalEntity" : "GeoPoliticalEntityID"
   "GeoPoliticalEntity" *-- "*" "AbstractAliasNames" : "GeoPoliticalEntityNameAlias"
   "GeoPoliticalEntity" --> "1" "GeoPoliticalEntity" : "ParentGeoPoliticalEntityID"
   abstract class "AbstractGeoBasinContext" <<abstract>>
   class "Basin" <<master-data>>
   "AbstractGeoBasinContext" --> "1" "Basin" : "BasinID"
   "Basin" *-- "*" "AbstractAliasNames" : "BasinNameAlias"
   "Basin" --> "1" "Basin" : "ParentBasinID"
   abstract class "AbstractGeoFieldContext" <<abstract>>
   class "Field" <<master-data>>
   "AbstractGeoFieldContext" --> "1" "Field" : "FieldID"
   "Field" *-- "*" "AbstractAliasNames" : "FieldNameAlias"
   abstract class "AbstractGeoPlayContext" <<abstract>>
   class "Play" <<master-data>>
   "AbstractGeoPlayContext" --> "1" "Play" : "PlayID"
   "Play" *-- "*" "AbstractAliasNames" : "PlayNameAlias"
   abstract class "AbstractGeoProspectContext" <<abstract>>
   class "Prospect" <<master-data>>
   "AbstractGeoProspectContext" --> "1" "Prospect" : "ProspectID"
   "Prospect" *-- "*" "AbstractAliasNames" : "ProspectNameAlias"
   "AbstractGeoContext" *-- "1" "AbstractGeoPoliticalContext" : "oneOf"
   "AbstractGeoContext" *-- "1" "AbstractGeoBasinContext" : "oneOf"
   "AbstractGeoContext" *-- "1" "AbstractGeoFieldContext" : "oneOf"
   "AbstractGeoContext" *-- "1" "AbstractGeoPlayContext" : "oneOf"
   "AbstractGeoContext" *-- "1" "AbstractGeoProspectContext" : "oneOf"
   "AbstractProject" *-- "*" "AbstractAliasNames" : "ProjectNames"
   class "Currency" <<reference-data>>
   "AbstractProject" --> "*" "Currency" : "FundsAuthorization.CurrencyID"
   "AbstractProject" --> "*" "Organisation" : "Contractors.ContractorOrganisationID"
   "AbstractProject" --> "*" "Organisation" : "Personnel.CompanyOrganisationID"
   class "ProjectRole" <<reference-data>>
   "AbstractProject" --> "*" "ProjectRole" : "Personnel.ProjectRoleID"
   "AbstractProject" *-- "1" "AbstractSpatialLocation" : "SpatialLocation"
   "AbstractProject" *-- "*" "AbstractGeoContext" : "GeoContexts"
   "AbstractProject" --> "*" "UnitOfMeasure" : "ProjectSpecification.UnitOfMeasureID"
}
package "Legend"  <<rectangle>> #EEEEEE {
   class MasterDataEntity <<master-data>>
   class WorkProductComponent <<work-product-component>>
   abstract class AbstractEntity <<abstract>>
   MasterDataEntity *- "1" AbstractEntity : MasterDataEntity\nis composed of one\nAbstractEntity
   WorkProductComponent *- "*" AbstractEntity : WorkProductComponent\nis composed of many\nAbstractEntities
   MasterDataEntity "1" <-- WorkProductComponent : Relationship\nto one
   class UnspecifiedEntity <<any-group-type>>
   WorkProductComponent --> "*" UnspecifiedEntity: Named relationship\nto many
   class ReferenceEntity << reference-data >>
   WorkProductComponent --> "1" ReferenceEntity: Named relationship\nto one
}
@enduml