@startuml pmProvisioningOutsideServiceOrder
autonumber

actor "Buyer/Client" as B
box "Seller/Server"
collections "SOF:PerformanceMonitoring" as PM

entity Hub 

opt
B -> Hub : POST {{baseUrl}}/hub with {{callbackUrl}} 
end

B -> PM: GET {{baseUrl}}/performanceProfile request 
PM --> B: List of PerformanceProfile

B -> PM: POST {{baseUrl}}/performanceJob request with PerformanceProfile

create entity PerformanceJob as PJ
PM -> PJ: <<create>>
activate PJ
PM --> B: PerformanceJob with {{id}}

opt
PJ -> Hub: createEvent
Hub -> B: POST {{callbackUrl}}/listener/performanceJobCreateEvent
end

note right of PJ: On scheduled date
PJ -> PJ: state: inProgress

opt
PJ -> Hub: stateChangeEvent
Hub -> B: POST {{callbackUrl}}/listener/performanceJobStateChangeEvent
end

create entity PerformanceReport as PR

PJ -> PR: <<create>>

activate PR

opt
  PR -> Hub: createEvent
  Hub -> B: POST {{callbackUrl}}/listener/performanceReportCreateEvent
end 

PR -> PR: state: inProgress

opt
  PR -> Hub: stateChangeEvent
  Hub -> B: POST {{callbackUrl}}/listener/performanceReportStateChangeEvent
end

PJ -> PR: collectData

note right of PJ: reportingPeriod elapses

PR -> PR: state: completed
opt
PR -> Hub: stateChangeEvent
Hub -> B: POST {{callbackUrl}}/listener/performanceReportStateChangeEvent
end

PR --> PJ: (report completed)

opt
PJ -> Hub: reportReadyEvent
Hub -> B: POST {{callbackUrl}}/listener/performanceJobReportReadyEvent
end

note right of PJ: Schedule elapses

PJ -> PJ: state: completed|scheduled

opt
PJ -> Hub: stateChangeEvent
Hub -> B: POST {{callbackUrl}}/listener/performanceJobStateChangeEvent
end

B -> PM: GET {{baseUrl}}/performanceReport/{{id}} request
PM -> PR: <<retrieve>>
PM --> B: PerformanceReport with {{id}}

entity Hub
end box
@enduml