@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 Employee {
    - name
    - email
    - position
    - phone
}

class Task {
    - String reference
    - String designation
    - String informalDescription
    - String technicalDescription
    - Integer duration
    - Double cost

    + Task(reference, designation,\ninformalDescription, technicalDescription,\nduration, cost, createdBy, taskCategory)
}

class TaskCategory {
    - String description

    + TaskCategory(description)
}

class Organization {
    - String name
    - String vatNumber
    - String website
    - String phone
    - String email

    - addTask(task)
    - validateTask(task)
    + anyEmployeeHasEmail(email)
    + Organization(name, vatNumber, webSite, phone, email, postalAddress, manager)
    + createTask(reference, designation, informalDesccription,\ntechnicalDescription, duration, cost, taskCategoryDescription)
    - getEmployeeByEmail(email)

'  +saveTask(task)
}

class TaskCategoryRepository {
    + getTaskCategoryByDescription(description)
}

class OrganizationRepository {
    + getOrganizationByEmployeeEmail(email)
}

class Repositories {
    - Repositories()
    + getInstance() : Repositories
    + getTaskCategoryRepository()
    + getOrganizationRepository()
}

class CreateTaskController {
    + CreateTaskController(organizationRepository, taskCategoryRepository)
    + getTaskCategories()
    + createTask(userEmail, reference, designation,\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 TaskCategoryRepository
    - used for displaying
    the category list
end note

class CreateTaskUI {
}

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

CreateTaskUI .> CreateTaskController

CreateTaskController .> Repositories : repositories

Repositories -> "1" TaskCategoryRepository

CreateTaskController ..> TaskCategory
CreateTaskController ..> OrganizationRepository : organizationRepository
CreateTaskController ..> TaskCategoryRepository : TaskCategoryRepository

Repositories --> "1" OrganizationRepository

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

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

Organization --> "*" Employee : employs

@enduml