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

skinparam classAttributeIconSize 0

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

class UserSession
{
    + getUserEmail()
}

class Employee {
    - name
    - email
    - position
    - phone
}

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

    + Task(reference, description,\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, description, informalDesccription,\ntechnicalDescription, duration, cost, taskCategoryDescription)
    - getEmployeeByEmail(email)
}

class TaskCategoryRepository {
    + getTaskCategoryByDescription(description)
}

class OrganizationRepository {
    + getOrganizationByEmployeeEmail(email)
}

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

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

note right of CreateTaskController
    - userEmail é obtido
    da sessão do usuário
    - categoryDescription
    é obtida a partir dos dados selecionados
end note

note bottom of TaskCategoryRepository
    - usado para exibir
    a lista de categorias
end note

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

CreateTaskUI .> CreateTaskController

CreateTaskController .> Repositories : repositories

Repositories -> "1" TaskCategory

@enduml
