@startuml
'skinparam monochrome true
skinparam packageStyle rectangle
skinparam shadowing false
skinparam linetype polyline
'skinparam linetype orto

skinparam classAttributeIconSize 0

'left to right direction

class ApplicationSession
{
    + static getInstance()
    + getCurrentSession()
}

class UserSession
{
    + getUserEmail()
}

class Administrator {
    - name
    - email
    - ccNumber
    - taxNumber
    - phoneNumber
    - emailAddress
}


class Agency{
    - Integer id
    - String designation
    - String location
    - String phoneNumber
    - String emailAddress

    + Agency(id, designation, location, phoneNumber, emailAddress
}

class AgencyRepository {

    + createAgency(id, designation, location, phoneNumber, emailAddress,
    - addAgency(agency)
    - validateAgency(agency)
    + getAgencyByID(

}

class PropertyRepository {

    + createLand(type, area, location, distance)
    + createApartment(type, area, location, distanceFromCityCentre, \nnumberBedrooms, numberBathrooms, \nnumberParkingSpaces, centralHeating, airConditioning)
    + createHouse(type, area, location, distanceFromCityCentre, \nnumberBedrooms, numberBathrooms, \nnumberParkingSpaces, centralHeating, airConditioning, \nexistenceOfAnBasement, inhabitableLoft, sunExposure)
    - addProperty(property)
    - validateProperty(property)
    + getPropertyByLocation(location)

}

class OwnerRepository {
    + createOwner(name, ccNumber, taxNumber, emailAddress, phoneNumber)
    - addOwner(owner)
    - validateOwner(owner)
    + getOwnerByEmail(emailAddress)
}

class AgencyRepository {
    + createAgency(id, designation, location, emailAddress, phoneNumber)
    - addAgency(agency)
    - validateAgency(agency)
    + getAgencyByID(id)
}

class AnnouncementRepository {
    +createAnnouncement(request, price, dateOfRequest)
    -addAnnouncement(announcement)
    -validateAnnouncement(announcement)
}


class Repositories {
    - Repositories()
    + getInstance() : Repositories
    + getPropertyRepository()
    + getAnnouncementRepository()
    + getAgencyRepository()
    + getOwnerRepository()
}

class CreateTaskController {
    + CreateTaskController(organizationRepository, taskCategoryRepository)
    + getTaskCategories()
    + createTask(userEmail, reference, description,\ninformalDescription, technicalDescription,\nduration, cost, categoryDescription)
    - getTaskCategoryByDescription(taskCategoryDescription)
    - getEmployeeFromSession()
}

note right of CreateTaskController
    - userEmail is obtained
    from the user session
    - categoryDescription
    is retrieved from selected data
end note

note bottom of OwnerRepository
    - used for displaying
    the category list
end note

class CreateTaskUI {
}

Repositories -> Repositories : instance
ApplicationSession -> ApplicationSession : instance

CreateTaskUI .> CreateTaskController

CreateTaskController .> Repositories : repositories

Repositories -> "1" OwnerRepository

CreateTaskController ..> TaskCategory
CreateTaskController ..> OrganizationRepository : organizationRepository
CreateTaskController ..> OwnerRepository :OwnerRepository

Repositories --> "1" OrganizationRepository

OrganizationRepository --> "*" Organization
ApplicationSession --> "1" UserSession : userSession

CreateTaskController ..> "1" Organization : organization
CreateTaskController ..> ApplicationSession
CreateTaskController ..> UserSession
Task "*" --> "1" TaskCategory : taskCategory
OwnerRepository "1" --> "*" TaskCategory : taskCategory
Organization "1" --> "*" Task : tasks
Task --> Employee : createdBy

Organization --> "*" Employee : employs

@enduml