@startuml
note "US020 - As Product Owner, I want to refine a broad user story of the ProductBacklog into more focused user stories." as N

class US020RefineBroadUserStoryUI{}

class US020RefineBroadUserStoryController {
+refineUserStory(String projectCode, int userStoryCode, int newUserStoryQuantity, String[]description)
}

class Company {
+getProjectStore()
}

class ProjectStore {
+returnProjectByCode(code)
}

class Project {
-code : String
+getProductBacklog()
}

class ProductBacklog {
+refineUserStory(int parentUserStoryCode, int newUserStoryQuantity, String[]description)
+createUserStoryAndAddToList(String description)
}

class UserStory {
- isActive : String
+returnUserStoryByCode(int parentUserStoryCode)
+checkIfIsActive()
+changeUStoInactive()
+changeParentUserStory(int parentUserStoryCode)
}

US020RefineBroadUserStoryUI " " ..> " " US020RefineBroadUserStoryController
US020RefineBroadUserStoryController " " ..> " " Company
Company " " o--> "0*  " ProjectStore
ProjectStore " " *--> "1*  " Project
Project " " o--> "1  " ProductBacklog
ProductBacklog " " *--> "1*  " UserStory
@enduml


@startuml
skinparam sequenceArrowThickness 2
skinparam roundcorner 20
skinparam maxmessagesize 60
skinparam sequenceParticipant underline

actor ProductOwner
participant ": US020RefineBroadUserStoryUI" as A
participant ": US020RefineBroadUserStoryController" as B
participant "comp : Company" as C
participant "ps : ProjectStore" as D
participant "proj : Project" as E
participant "pb : ProductBacklog" as F
participant "us : UserStory" as G

ProductOwner -> A: Types requested data
activate A

A -> B : refineUserStory(String projectCode, int parentUserStoryCode, int newUserStoryQuantity, String[]description)
activate B

B --> C : getProjectStore
activate C
C --> B : ps
deactivate C

B -> D : returnProjectByCode(code)
activate D
D --> B : proj
deactivate D

B -> E : getProductBacklog()
activate E
E --> B : pb
deactivate E

B -> F : refineUserStory(int parentUserStoryCode, int newUserStoryQuantity, String[]description)
activate F


F -> F : returnUserStoryByCode(int parentUserStoryCode)

F -> G : checkIfIsActive()
activate G
G --> F
deactivate G

F -> G : changeUStoInactive()
activate G
G --> F
deactivate G

F -> F : createUserStoryAndAddToList(String description)

F -> G : new UserStory
activate G

G -> G : isValidUserStoryCode
G -> G : isValidUserStoryDescription
G --> F
deactivate G

F -> F : addUserStoryToList

F -> G : changeParentUserStory
activate G
G --> F
deactivate G

F --> B : Creates child user stories
deactivate F

B --> A : Informs operation success
deactivate B

A --> ProductOwner : Informs operation success
@enduml