@startuml
skinparam monochrome true
skinparam packageStyle rectangle
skinparam shadowing false

autonumber

'hide footbox
actor "Owner" as ADM
participant ":CreateAnnouncementRequestUI" as UI
participant ":CreateAnnouncementRequestController" as CTRL
participant ":Repositories" as RepositorySingleton
participant "repositories\n:Repositories" as PLAT
participant "typeOfPropertyRepository:\nTypeOfPropertyRepository" as TypeOfPropertyRepository
participant "StatesRepository\n:StatesRepository" as StatesRepository
participant ":ApplicationSession" as _APP
participant "appSession\n:ApplicationSession" as APP
participant "currentSession\n:UserSession" as SESSAO
participant "AvailableEquipment\n:AvailableEquipment" as AE
participant "photographyRepository\n:PhotographyRepository" as PHT
participant "organizationRepository:\nOrganizationRepository" as OrganizationRepository
participant "organization\n:Organization" as ORG
participant "announcementRequest\n:AnnouncementRequest" as AR


activate ADM

        ADM -> UI : asks to create a new announcement request

        activate UI

'            UI --> ADM : requests data (reference, description,  informal \n description, technical description, duration, cost)
            'create CTRL
            UI -> CTRL** : create

            UI -> CTRL : getTypeOfProperty()
            activate CTRL

                CTRL -> RepositorySingleton : getInstance()
                activate RepositorySingleton

                    RepositorySingleton --> CTRL: repositories
                deactivate RepositorySingleton

                CTRL -> PLAT : getTypeOfPropertyRepository()
                activate PLAT

                    PLAT --> CTRL: typeOfPropertyRepository
                deactivate PLAT

                CTRL -> TypeOfPropertyRepository : getTypeOfProperty()
                activate TypeOfPropertyRepository

                    TypeOfPropertyRepository --> CTRL : typeOfPropertyList
                deactivate TypeOfPropertyRepository

                CTRL --> UI : typeOfPropertyList
            deactivate CTRL

            UI --> ADM : shows the type of property list\n and asks to sleect one
        deactivate UI

    ADM -> UI : selects the type of property
    activate UI

        UI --> ADM : requests data
    deactivate UI

    ADM -> UI : types requested data (the area in m2, zip_code(opt), street(opt), district, state, city, \ndistance from the city centre and one or more photos)
    activate UI

        UI --> ADM : shows selected property and requested data
    deactivate UI

    ADM -> UI : submits data
    activate UI

        UI -> CTRL : createAnnouncementRequest(the area in m2, zip_code(opt), street(opt), district, state, city, distance from the city centre, one or more photos, \nbeginDate, status and endDate)
        activate CTRL

            CTRL -> CTRL : getTypeOfPropertyByDescription(propertyDescription)
            activate CTRL

                CTRL -> RepositorySingleton : getInstance()
                activate RepositorySingleton

                    RepositorySingleton --> CTRL: repositories
                deactivate RepositorySingleton

                CTRL -> PLAT : getTypeOfPropertyRepository()
                activate PLAT

                    PLAT -> CTRL : typeOfPropertyRepository
                deactivate PLAT

                CTRL -> TypeOfPropertyRepository : getTypeOfPropertyByDescription(propertyDescription)
                activate TypeOfPropertyRepository

                    TypeOfPropertyRepository --> CTRL : typeOfProperty
                deactivate TypeOfPropertyRepository
                CTRL --> CTRL : typeOfProperty

            deactivate CTRL

            |||
            CTRL -> CTRL : getState()
            activate CTRL

                CTRL -> RepositorySingleton : getInstance()
                activate RepositorySingleton

                    RepositorySingleton -> CTRL : repositories
                deactivate RepositorySingleton

                CTRL -> PLAT : getStatesRepository
                activate PLAT

                    PLAT -> CTRL : StatesRepository
                deactivate PLAT

                CTRL -> StatesRepository : getState()
                activate StatesRepository

                    StatesRepository -> CTRL : states
                deactivate StatesRepository

                CTRL --> CTRL : state

           deactivate CTRL

            |||
            CTRL -> CTRL : getAvailableEquipment()
            activate CTRL

                CTRL -> RepositorySingleton : getInstance()
                activate RepositorySingleton

                    RepositorySingleton -> CTRL : repositories
                deactivate RepositorySingleton

                CTRL -> PLAT : getAvailableEquipmentRepository
                activate PLAT

                    PLAT -> CTRL : AvailableEquipmentRepository
                deactivate PLAT

                CTRL -> AE : getAvailableEquipment()
                activate AE

                    AE -> CTRL : availableEquipment
                deactivate AE

                CTRL --> CTRL : availableEquipment

           deactivate CTRL

            |||
            CTRL -> CTRL : getPhotos()
            activate CTRL

                CTRL -> RepositorySingleton : getInstance()
                activate RepositorySingleton

                    RepositorySingleton -> CTRL : repositories
                deactivate RepositorySingleton

                CTRL -> PLAT: getPhotographyRepository()
                activate PLAT

                    PLAT -> CTRL : PhotographyRepository
                deactivate PLAT

                CTRL -> PHT : getPhotos()
                activate PHT

                    PHT -> CTRL: photos
                deactivate PHT

                CTRL --> CTRL : photos

            |||
            CTRL -> CTRL : getOrganization()
            activate CTRL

                CTRL -> _APP: getInstance()
                activate _APP
                    _APP -> CTRL: appSession
                deactivate _APP


                CTRL -> APP: getCurrentSession()
                activate APP

                    APP --> CTRL: currentSession
                deactivate APP

                CTRL -> SESSAO: email = getUserEmail()
                activate SESSAO

                    SESSAO --> CTRL: email
                deactivate SESSAO


                CTRL -> PLAT: getOrganizationRepository(email)
                activate PLAT

                    PLAT --> CTRL: organizationRepository
                deactivate PLAT

                CTRL -> OrganizationRepository: getOrganizationByEmployeeEmail(email)
                activate OrganizationRepository

                    loop [for each organization
                        OrganizationRepository -> ORG : anyEmployeeHasEmail(email)
                        activate ORG

                             ORG --> OrganizationRepository : true/false
                        deactivate ORG
                    end
                    OrganizationRepository --> CTRL : organization
                deactivate OrganizationRepository

                CTRL -> ORG: getEmployeeByEmail(email)
                activate ORG

                    ORG --> CTRL : employee
                deactivate ORG

                CTRL --> CTRL : employee
            deactivate CTRL

            |||
            CTRL -> ORG: createAnnouncementRequest(the area in m2, zip_code(opt), street(opt), district, state, city, distance from the city centre, one or more photos, \nbeginDate, status, endDate and employee)
            activate ORG

                ORG -> AR**: create(the area in m2, zip_code(opt), street(opt), district, state, city, \ndistance from the city centre, one or more photos, \nbeginDate, status, endDate and employee)
                ORG -> ORG: addAnnouncement (announcementRequest)


                activate ORG
                    ORG -> ORG: validateAnnouncementRequest(announcementRequest)
                    activate ORG
                        ORG --> ORG
                    deactivate ORG

                    ORG --> ORG
                deactivate ORG

                ORG --> CTRL : announcementRequest

            deactivate ORG

            CTRL --> UI: announcementRequest
            deactivate CTRL
            UI --> ADM: displays the approval or the rejection of the announcementRequest
    deactivate UI

deactivate ADM

@enduml