@startuml
skinparam defaultFontSize 16

skinparam sequence {
   ArrowColor blue
   LifeLineBorderColor blue
   ParticipantBorderColor blue
   ParticipantBackgroundColor transparent
   ParticipantFontSize 16
   ActorFontColor blue
   ActorFontSize 15
   ActorFontName blue }
hide footbox

title US006 - As a user, I want to create an account for me, assign to it a name and description, so that later it can be used in my movements.

autonumber

participant ":Test" as test
participant  ":CreateAccountForPersonController" as controller
participant "createAccountService: \nCreateAccountForPersonService" as service
participant "personRepo\n:PersonRepository" as personRepo
participant "account\n:Account" as account
participant "accountRepo \n:AccountRepository" as accountRepo
participant ":CreateAccountForPersonAssembler" as Assembler
participant "requestDTO: \nCreateAccountForPersonRequestDTO" as requestDTO
participant "createAccountForPersonDTO:\nCreateAccountForPersonDTO" as PDTO
participant "personID:\nPersonID" as personID
participant "person\n:Person" as person
participant "accountID\n:AccountID" as IDaccount
participant ":AccountsIDs" as accountsIDs


activate test
test -> personRepo *: ()
test -> accountRepo *: ()
test -> service *: (personRepo, accountRepo)
test -> controller *: (createAccountService)


==ACT==

test -> controller : createAccountForPerson ("accountID",\n "personID", "denomination",\n "description")
activate controller
controller -> Assembler : mapToRequestDTO ("accountID",\n "personID", "denomination",\n "description")
activate Assembler
Assembler -> requestDTO * : ("accountID","personID", \n "denomination", "description")
Assembler --> controller : requestDTO
deactivate Assembler
controller -> service : createAccountForPerson\n (requestDTO)
activate service
service -> requestDTO : "personID" = getPersonID ()
service -> personID* : (Long.parseLong("personID"))

service -> personRepo : validation1 = containsByID (personID)

opt validation1 == true

service -> personRepo : person = findByID (personID)
service -> requestDTO : "accountID" = getAccountID ()

service -> IDaccount *: (Long.parseLong("accountID"))
service -> accountRepo : validation2 = containsByID (accountID)
service -> person : validation3 = hasAccountID (accountID)


opt validation2 == false && validation3 == false


service -> requestDTO : "denomination" = getDenomination ()
service -> requestDTO : "description" = getDescription ()
service -> account*: (accountID, "denomination" , "description")
service -> accountRepo : add (account)
service -> accountsIDs : result = addAccount (accountID)

service -> Assembler : mapToDTO(person)
activate Assembler
Assembler -> PDTO* : ()
Assembler --> service : createAccountForPersonDTO
deactivate Assembler
end
end
service --> controller : createAccountForPersonDTO
deactivate service
controller --> test : createAccountForPersonDTO
deactivate controller
==ASSERT==
test -> test : assertEquals (expected, createAccountForPersonDTO)



@enduml