@startuml
skinparam sequenceReferenceBackgroundColor white
skinparam sequenceMessageAlign center
autonumber

title US011 - As a manager, I want to associate a user as Team Member of a project

actor ":Manager" as Manager #white
participant ":AssociateTeamMemberUI" as UI #white
participant ":AssociateTeamMemberController" as Controller #white
participant ":Containers" as Containers #white

participant ":ResourceContainer" as ResourceContainer #white
participant ":AccountContainer" as AccountContainer #white
participant "account:\nAccount" as account #white
participant ":RoleContainer" as RoleContainer #white
participant "projectRole:\nProjectRole" as projectRole #white
participant ":ProjectContainer" as ProjectContainer #white
participant ":project:Project" as project #white

participant "newResource : \nResource" as newResource #white


Manager -> UI++: request account list
    ref#white over UI: List Accounts DTO
return list of accounts

Manager -> UI++ : request project list
        ref#white over UI: US015
return list of projects

Manager -> UI++ :fills in details (email, projectCode,\npercentageOfAllocation \nstartDate, endDate, costPerHour

UI -> Controller++: associateTeamMemberToProject(email,\nprojectCode, percentageOfAllocation,\nstartDate, endDate, costPerHour)

Controller -> Containers++: getAccountContainer()
return accountContainer

            Controller -> AccountContainer++: getAccount(email)
            ref#white over AccountContainer: Search Account
            create account
            AccountContainer -> account
            return account

Controller -> Containers++: getRoleContainer()
return roleContainer

            Controller -> RoleContainer++: getRole(role)
            ref#white over RoleContainer: Search Role
            create projectRole
            RoleContainer -> projectRole
            return projectRole

Controller -> Containers++ : getProjectContainer()
return projectContainer

            Controller -> ProjectContainer++: getProject(projectCode)
            ref#white over ProjectContainer: Search Project
            create project
            ProjectContainer -> project
            return project

            Controller -> ResourceContainer++: allocateRoleToProject(account, project,\n projectRole, percentageOfAllocation,\nstartDate, endDate, costPerHour)

            create newResource
            ResourceContainer -> newResource : create(account, project, projectRole, percentageOfAllocation, startDate, endDate, costPerHour)
            ResourceContainer -> ResourceContainer: addResource(newResource)

           return true/false
          return true/false

        return successful/unsuccessful



@enduml