@startuml
'https://plantuml.com/sequence-diagram

title As Manager, I want to associate a user as Team Member of a project.

actor Manager as "Manager"
autonumber

Manager -> ": ResourceUI"++: Starts Team Member allocation process

": ResourceUI" -> "controller : ListUserAccountsController" **: create()
": ResourceUI" -> "controller : ListUserAccountsController" ++: findAccountsByProfileID(projectID))
ref over "controller : ListUserAccountsController"
UC12.1 - Get UserAccounts with UserProfile type of User
end ref
"controller : ListUserAccountsController" --> ": ResourceUI" --: userListDTO
": ResourceUI" --> Manager --: Shows userListDTO
Manager -> ": ResourceUI" ++: Selects user account
": ResourceUI" -> "controller : ProjectController" **: create()
": ResourceUI" -> "controller : ProjectController" ++: createResource \n(newResourceDTO)
participant ": ResourceServices" as Service
"controller : ProjectController" -> Service ++: createResource\n(email, role, projectID, duration, \n costHour, allocationPercentage)
participant ": SprintRepository" as SprintRepository
Service -> SprintRepository ++: sprintList = findSprintsFromProjects(projectID)
deactivate
participant ": ProjectRepository" as ProjectRepository
Service -> ProjectRepository ++: projects = findProjects()
deactivate ProjectRepository
Service -> ProjectRepository ++: project = findProject(projectID)
deactivate ProjectRepository
Service -> ": ResourceHandler" ++: isResourceStartDateValid\n(period, sprints)

participant ": Project" as Project
": ResourceHandler" -> ": ResourceHandler" : isAllocationValid\n(projects, email, period, percentage)
deactivate Project
": ResourceHandler" -> ": ResourceHandler" : isResourceEmailAndRoleValid\n(email,role, period, project)
deactivate Project
": ResourceHandler" -> ": ResourceHandler" : isResourceStartDateValid\n(role, period)
": ResourceHandler" --> Service --: true
deactivate ": ResourceHandler"
Service -> Project ++: saveResource(newResource)
deactivate Project
Service -> ": NewResourceAssembler" ++: toData(resource)
": NewResourceAssembler" -> "newResourceDTO: NewResourceDTO" **: create()
Service <- ": NewResourceAssembler" --: newResourceDTO
deactivate Project
Service --> "controller : ProjectController" --: newResourceDTO
"controller : ProjectController" --> ": ResourceUI" --: newResourceDTO, HttpStatus.CREATED
": ResourceUI" --> Manager: newResourceDTO

@enduml