@startuml
skinparam monochrome false
skinparam packageStyle rectangle
skinparam shadowing false
'skinparam linetype ortho
'left to right direction
skinparam classAttributeIconSize 0
hide circle
hide methods

title Domain Model Real Estate USA


' Actor Region
abstract class Person{
    taxNumber
    citizensCardNumber
    name
    email
    phoneNumber
}


class Employee extends Person{
    position
    admitionDate
}

class Owner extends Person{
    sellProperty()
    rentProperty()
}

class UnregisteredUser {
}

class Client extends Person{
    requestVisit()
    sendOffer()
}

class Agent extends Employee{
    licenseNumber

    setCommission()
    registerAdvertisement()
    scheduleVisit()
    recordVisit()
    aprovedOffer()
    'rejectOffer()
}
class StoreManager extends Employee{
    monitorBranch()
    evaluateEmployees()
}
class SystemAdministrator extends Employee{
    registerEmployee()
    registerBranch()
    prepareSystem()
    createState()
    createState()
    createDistrict()
    createCity()
    assignDistrictToState()
    assignCityToDistrict()
'    specifyState()
'    specifyDistricts()
'    specifyCities()
}
class NetworkManager extends Employee{
    analyseBranches()
    analyseNetwork()
}

''' GOODS Regions
abstract  class Property{
    squareFeet
    location
    cityCenterDistance
    requestPrice
    description
    amenities[]
    photos[]
}
class Land extends Property{
    canConstruct
    constructionArea
}

abstract class  Building extends Property{
    numberBedroom
    numberBathroom
    numberParkingSpace
    yearBuilt
    equipments[]
}
class Apartment extends Building{
    hasCondominium
    condominiumValue
}
class House extends Building{
    basement
    loft
    sunExposure
}

'''ADDRESS REgion

class Address{
    street
    zipCode
}



class State {
    name
}

class District {
    name
}

class City {
    name
}
'class StatesList {
'    save()
'    findById()
'}
'
'class DistrictsList {
'    save()
'    findById()
'}
'
'class CitiesList {
'    save()
'    findById()
'}

''' Business Region
'class Contact{}

class Announcement{
    submitDatetime
'    requestOrigin
    approvedOffer
    approved
    requestPrice
}

class Visit{
    requestDatetime
    scheduleDatetime
    approved
    feedback

}

class Commission{
    IsFixed
    Value
}

enum DealType{
    RENT
    FOR_SALE
}

class Proposal{
    datetime
    Value
    isApproved
}

class Branch{}
''' Relations Region
SystemAdministrator "1" - "0.*" Branch : creates >
SystemAdministrator "1" -- "0.*" Employee : creates >
Branch "1" - "0.*" Agent : has >
StoreManager "1" - "1" Branch : manage >
NetworkManager "1" -- "1.*" Branch : manages a set of >


State "1" -- "0.*" District : contains >
District "1" -- "0.*" City : contains >
'StatesList "0.*" - "1" State : are store <
'DistrictsList "0.*" - "1" District : are store <
'CitiesList "0.*" - "1" City : are store <
Branch "1" - "1" Address : has >
Property "1" -- "1" Address : has >
'Address "1" -"1" State : contains >
'Address "1" -"1" District : contains >
Address "0.*" -- "1" City : contains <

'Owner "1" - "1" Contact : request property listing >

'Opção 1

'Announcement "1" -- "1" Property : from >
'Announcement "1" - "1" DealType : is of type >
'Visit "1" - "1" Property : to >
'Owner "1" - "1" Agent : request annoucement >
'Agent "1" - "0.*" Announcement : publish >
'Agent "1" - "0.*" Visit : schedule >
'Client "1" - "1" Agent : request visit >
''Agent "1" - "1" Comission : set >
'Announcement "1" -- "1" Comission : has >
'
'Client "1" - "1" Proposal : makes >
'Agent "1" - "0.*" Proposal : aproveds >
'Proposal "1" - "1" Announcement : to >

'Opção 2
'
Announcement "1" -- "1" Property : from >
Announcement "1" - "1" DealType : is of type >
Visit "1" -- "1" Announcement : to >
Owner "1" - "1" Announcement : submit order  >
Agent "1" - "0.*" Announcement : approve and publish order >
Agent "1" - "0.*" Visit : schedule >
Client "1" - "1" Visit : request  >
Agent "1" - "1" Commission : set >
Announcement "1" -- "1" Commission : has >
Agent "1" - "0.*" Visit : schedule >
Client "1" - "1" Proposal : makes >
Agent "1" -- "0.*" Proposal : approves >
Proposal "1" - "1" Announcement : to >
UnregisteredUser "1" - "0.*" Announcement: views
Person "0.*" - "1" Address : has a

@enduml