@startuml
!define LIGHTBLUE
!includeurl https://raw.githubusercontent.com/Drakemor/RedDress-PlantUML/master/style.puml

'__Title
title <b>"Personal Finance Management"</b>\nSequence Diagram US007CreateGroupAccountControllerREST

hide footbox


participant ":HTTP Client"
participant "Tomcat(Web Server)"
participant ":US007CreateGroupAccountControllerREST"

ref over ":HTTP Client", "Tomcat(Web Server)", ":US007CreateGroupAccountControllerREST" : SD_Tomcat_Generic Processing Representation\n

":US007CreateGroupAccountControllerREST" -[hidden]-> ":US007CreateGroupAccountControllerREST"


activate ":US007CreateGroupAccountControllerREST" #34b7eb

participant "CreateGroupAccountDTOAssembler"

participant "us007CreateGroupAccountService : \nUS007CreateGroupAccountService"

":US007CreateGroupAccountControllerREST" [#blue]->  "CreateGroupAccountDTOAssembler" : createDTOFromPrimitiveTypes\n(personEmail, groupDenomination,\n accountDenomination, accountDescription)
activate "CreateGroupAccountDTOAssembler" #34b7eb
create "createGroupAccountDTO : \nCreateGroupAccountDTO"
"CreateGroupAccountDTOAssembler" [#blue]-->  "createGroupAccountDTO : \nCreateGroupAccountDTO" : create(personEmail, groupDenomination,\n accountDenomination, accountDescription)
return <b>createGroupAccountDTO</b>
deactivate "CreateGroupAccountDTOAssembler"


":US007CreateGroupAccountControllerREST" [#blue]->  "us007CreateGroupAccountService : \nUS007CreateGroupAccountService" : createAccountAsPeopleInCharge(createGroupAccountDTO)

participant "GroupID"

activate "us007CreateGroupAccountService : \nUS007CreateGroupAccountService" #34b7eb

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]->  "createGroupAccountDTO : \nCreateGroupAccountDTO" : getGroupDenomination()
activate "createGroupAccountDTO : \nCreateGroupAccountDTO" #34b7eb
return String <b>groupDenomination</b>
deactivate "createGroupAccountDTO : \nCreateGroupAccountDTO"

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]->  "createGroupAccountDTO : \nCreateGroupAccountDTO" : getAccountDenomination()
activate "createGroupAccountDTO : \nCreateGroupAccountDTO" #34b7eb
return String <b>accountDenomination</b>
deactivate "createGroupAccountDTO : \nCreateGroupAccountDTO"

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]->  "createGroupAccountDTO : \nCreateGroupAccountDTO" : getAccountDescription()
activate "createGroupAccountDTO : \nCreateGroupAccountDTO" #34b7eb
return String <b>accountDescription</b>
deactivate "createGroupAccountDTO : \nCreateGroupAccountDTO"

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]->  "createGroupAccountDTO : \nCreateGroupAccountDTO" : getPersonEmail()
activate "createGroupAccountDTO : \nCreateGroupAccountDTO" #34b7eb
return String <b>personEmail</b>
deactivate "createGroupAccountDTO : \nCreateGroupAccountDTO"

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]->  "GroupID" : createGroupID(groupDenomination)
activate "GroupID" #34b7eb
create "groupID : \nGroupID"
"GroupID" [#blue]-->  "groupID : \nGroupID" : create\n(groupDenomination)
return <b>groupID</b>
deactivate "groupID : \nGroupID"

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]->  "AccountID" : createAccountID(accountDenomination, groupID)
activate "AccountID" #34b7eb
create "accountID : \nAccountID"
"AccountID" [#blue]-->  "accountID : \nAccountID" : create\n(accountDenomination, ownerID)
return <b>accountID</b>
deactivate "accountID : \nAccountID"

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]->  "PersonID" : createPersonID(personEmail)
activate "PersonID" #34b7eb
create "personID : \nPersonID"
"PersonID" [#blue]-->  "personID : \nPersonID" : create\n(personEmail)
return <b>personID</b>
deactivate "personID : \nPersonID"

participant "groupRepo : \nGroupRepository"
participant "group : \nGroup"

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]-> "groupRepo : \nGroupRepository" : findGroupByID(groupID)
activate "groupRepo : \nGroupRepository" #34b7eb
return Group <b>group</b>
deactivate "groupRepo : \nGroupRepository"

participant "accountRepo : \nAccountRepository"

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]-> "accountRepo : \nAccountRepository" : accountExists(accountID)
activate "accountRepo : \nAccountRepository" #34b7eb
return boolean <b>accountExists</b>

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]-> "group : \nGroup" :  isPersonInCharge(personID)
activate "group : \nGroup" #34b7eb
return boolean <b>isPersonInCharge</b>

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]->  "Account" : createAccountGroup(accountDescription, accountDenomination, groupID)
activate "Account" #34b7eb
create "account : \nAccount"
"Account" [#blue]-->  "account : \nAccount" : create(accountDescription,\naccountDenomination,\n ownerID)
return <b>account</b>
deactivate "account : \nAccount"

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]-> "accountRepo : \nAccountRepository" : saveAccount(account)
activate "accountRepo : \nAccountRepository" #34b7eb
return boolean <b>saveResult</b>

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]-> "group : \nGroup" : addAccount(accountID)
activate "group : \nGroup" #34b7eb
return <b>true</b>

participant "GroupDTOAssembler"

"us007CreateGroupAccountService : \nUS007CreateGroupAccountService" [#blue]->  "GroupDTOAssembler" : createDTOFromDomainObject(groupDenomination, groupDescription, groupDateOfCreation)
activate "GroupDTOAssembler" #34b7eb
create "groupDTO : \nGroupDTO"
"GroupDTOAssembler" [#blue]-->  "groupDTO : \nGroupDTO" : create \n (groupDenomination, \n groupDescription, \n groupDateOfCreation)
return <b>groupDTO</b>
deactivate "groupDTO : \nGroupDTO"


":US007CreateGroupAccountControllerREST" <-- "us007CreateGroupAccountService : \nUS007CreateGroupAccountService": <b>groupDTO</b>
deactivate "us007CreateGroupAccountService : \nUS007CreateGroupAccountService"


deactivate ":US007CreateGroupAccountControllerREST"

ref over ":HTTP Client", "Tomcat(Web Server)", ":US007CreateGroupAccountControllerREST" : SD_Tomcat_Generic Processing Representation\n


@enduml