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

actor IAM_QUEUE #Magenta

participant IAMEMSConsumer as IAMEMSConsumer
participant iamProvisioningProcessorUtil
participant iamProvisioningService
participant iamProvisioningManager
participant iamProvisioningDao
participant LdapService
participant IAM #DarkSeaGreen

skinparam sequenceGroupBorderColor blue 
group#Magenta <b><color:white> AutoRegister
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=autoregister

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 : autoregister(dspMessage, IAMProvisioningData)
   opt subscriberType exists in the request
         iamProvisioningService-> iamProvisioningService : updateSubscriberTypeForCustomer returns updated customer object    
   end
       alt try
        iamProvisioningService-> iamProvisioningService: partiallyRegisterCustomer(msisdn, msisdnToSendSMS, subscriberType, prefBillLang, autoRegMsgCode)
		alt msisdn and msisdnToSendSMS the same
		 iamProvisioningService-> iamProvisioningService: partiallyRegisterCustomerCommon(msisdn, msisdn, subscriberType, prefBillLang, autoRegMsgCode)
		else msisdn and msisdnToSendSMS are not the same and customerType is not Prepaid
		 iamProvisioningService-> iamProvisioningService: partiallyRegisterCustomerCommon(msisdn, msisdnToSendSMS, subscriberType, prefBillLang, autoRegMsgCode)
		 note left
		  validates msisdnToSendSMS and customerType
		  calls getBanMsisdnsWithStatus(msisdn)
		  validates status for msisdn and msisdnToSendSMS
		  checks both msisdns are with the same ban
		 endnote
		else msisdn and msisdnToSendSMS are not the same and customerType is Prepaid 
		  iamProvisioningService-> iamProvisioningService: throws InvalidRequestException
		end
		iamProvisioningService-> iamProvisioningService: generates temporary password \n and encryptes Pwd
		iamProvisioningService-> iamProvisioningService: set registration status to P for partial
        iamProvisioningService-> iamProvisioningManager: updateRegistrationStatus(msisdn, "P")
        iamProvisioningManager-> iamProvisioningDao: updateRegistrationStatus(msisdn, "P")
        iamProvisioningDao -> LdapService: searchLdap(msisdn, filterAttributes, \n null, 0, Thread.methodName, false)  
        LdapService-> IAM: searchLdap
        IAM-> LdapService: return searchResultList
        LdapService-> iamProvisioningDao: returns searchResultList
		iamProvisioningDao -> iamProvisioningDao: create ModificationItemWrapper 
        iamProvisioningDao->iamProvisioningDao: set tmregistrationstatus with multiCustType
        iamProvisioningDao->iamProvisioningDao: updateSubscriberObjectAttributes()
        iamProvisioningDao->LdapService: ldapUpdate(dn, ModificationItemWrapper)
        LdapService->IAM: ldapUpdate(dn, ModificationItemWrapper)
       else catch SubscriberNotFoundException
        note left
		 No retry is applicable
        endnote		
       else catch IAMException
        iamProvisioningDao -> iamProvisioningDao : set returnVals array with ErrorMessage for each customerId
        iamProvisioningDao -> iamProvisioningManager: throws iamException
        iamProvisioningManager -> iamProvisioningService : throws JMSRetryException()
		iamProvisioningService -> IAMEMSConsumer : throws DSPMWException
		IAMEMSConsumer -> IAM_QUEUE: throws DSPMWException
       end
     iamProvisioningDao -> iamProvisioningManager: returns void     
     iamProvisioningManager -> iamProvisioningService : returns void
    end
	end
 end
@enduml