@startuml
title ** __DSPA Provisioning PCF - IAM SuspendStatus flow __ **\n

actor IAM_QUEUE #Magenta

participant IAMEMSConsumer
participant iamProvisioningProcessorUtil
participant iamProvisioningService
participant iamProvisioningManager
participant iamProvisioningDao
participant ldapService
participant IAM #DarkSeaGreen

skinparam sequenceGroupBorderColor blue 
group#Magenta <b><color:white> SuspendStatus
IAM_QUEUE <- IAMEMSConsumer: iamProcessor\n (Message object from EMS)
note left
	ems/TMOBILE.<env>.DSPA.QUEUE.PUBLISH.IAM 
endnote

IAMEMSConsumer-> iamProvisioningProcessorUtil: getPublishDSPMessage with source=DSP, target=IAM \n and event=suspendStatusflow

iamProvisioningProcessorUtil--> IAMEMSConsumer: returns dspMessage object

alt try 

 IAMEMSConsumer-> iamProvisioningService: processMessage(dspMessage, msgDeliveryCount, msgRedeliveryLimit)

 iamProvisioningService-> iamProvisioningService : processMessage() process the customer events

 iamProvisioningService-> iamProvisioningService: processCustomerEvents()  process customer events
 note left
   extract customer object and loop thru the events
 endnote

 loop events
   iamProvisioningService-> iamProvisioningService : updateStatus (dspMessage, iamprovisioningData)
   opt subscriberType exists in the request
         iamProvisioningService-> iamProvisioningService : updateSubscriberTypeForCustomer returns updated customer object    
   end
     iamProvisioningService-> iamProvisioningManager: updateStatus(customerIds, status, reasonCode)
     iamProvisioningManager-> iamProvisioningDao: updateStatus(customerIds, status, reasonCode)
       alt try
        iamProvisioningDao -> ldapService: searchLdap(customerId, filterAttributes, \n null, 0, Thread.methodName, false) 
        ldapService->IAM: searchLdap
        IAM->ldapService: return searchResultList
        ldapService->iamProvisioningDao: return searchResultList
        iamProvisioningDao -> iamProvisioningDao: create ModificationItemWrapper and add tmaccountstatus with status value
        iamProvisioningDao->iamProvisioningDao: set tmauthorizationfields with reasonCode value
        opt status is "C" for cancelled
         iamProvisioningDao->iamProvisioningDao: set tmcancellationdate with current date value
        end
        iamProvisioningDao->iamProvisioningDao: updateSubscriberObjectAttributes()
        iamProvisioningDao->ldapService: ldapUpdate(dn, ModificationItemWrapper)
        ldapService->IAM: ldapUpdate(dn, ModificationItemWrapper)
       else catch SubscriberNotFoundException
        iamProvisioningService-> iamProvisioningService: set Resync as true in iamProvisioningData if status not cancelled
       else catch IAMException
        iamProvisioningDao -> iamProvisioningDao : set returnVals array with ErrorMessage for each customerId
        iamProvisioningDao -> iamProvisioningManager: throws iamException
        iamProvisioningManager -> iamProvisioningService : throws iamException
		iamProvisioningService -> IAMEMSConsumer : throws DSPMWException
		IAMEMSConsumer -> IAM_QUEUE : throws DSPMWException
       end
     iamProvisioningDao -> iamProvisioningManager: returns void     
     iamProvisioningManager -> iamProvisioningService : returns void
    end
	end
 end
@enduml