Introduction



Contents TOC \o "1-3" \h \z \u 1Introduction PAGEREF _Toc525047797 \h 21.1Interfaces PAGEREF _Toc525047798 \h 21.2The interface connectivity details are explained in detail below: PAGEREF _Toc525047799 \h 41.3Event Sequence Diagram PAGEREF _Toc525047800 \h 51.3.1Preview Contact PAGEREF _Toc525047801 \h 51.3.2Predictive contacts PAGEREF _Toc525047802 \h 61.3.3BlendToInbound and BlendToOutbound PAGEREF _Toc525047803 \h 71.4Architecture Diagram: PAGEREF _Toc525047804 \h 81.4.1CTI Server HA PAGEREF _Toc525047805 \h 81.4.2POM HA PAGEREF _Toc525047806 \h 91.5Application Programming Interface Details PAGEREF _Toc525047807 \h 91.5.1SecurityLogin: PAGEREF _Toc525047808 \h 91.5.2SecurityLogout: PAGEREF _Toc525047809 \h 91.5.3AgentLogin PAGEREF _Toc525047810 \h 101.5.4AgentLogout PAGEREF _Toc525047811 \h 111.5.5MonitorDevice PAGEREF _Toc525047812 \h 121.5.6UnMonitorDevice PAGEREF _Toc525047813 \h 121.5.7SetAgentStateToAux PAGEREF _Toc525047814 \h 121.5.8Hold PAGEREF _Toc525047815 \h 141.5.9HoldReconnect PAGEREF _Toc525047816 \h 141.5.10DisconnectCall/DisconnectStation PAGEREF _Toc525047817 \h 151.5.11SendGenericCTICommand: PAGEREF _Toc525047818 \h 161.6Call Events PAGEREF _Toc525047819 \h 161.6.1POM_OutboundCallEvent PAGEREF _Toc525047820 \h 161.6.2OnCallWrapUpDataEvent PAGEREF _Toc525047821 \h 18 1.7 Technical Details………………………………………………………………………………………………………………19 1.7.1High Availability………………………………………………………………………………………………………19 1.7.2OCM……………………………………………………………………………………………………………………….20 1.7.3Utilities…………………………………………………………………………………………………………………..20 1.7.4TMAC……………………………………………………………………………………………………………………..27IntroductionThis document presents the technical specifications of integration with Avaya Autodialer i.e. Proactive Outreach Manager (POM). TMAC (Tetherfi MultiMedia Agent Client) integrates with Avaya POM Server to support the dialer features (Preview/Predictive/Callback).InterfacesInterfaces involved for this integration:Avaya POMAvaya CMAvaya AESAvaya AAEP EPMSBCTMAC ServerCTI SeverTMAC ProxyTMAC Client UIOCMTelesales Agent launches TMAC Agent web client and enter LAN ID and extension in login page. TMAC Server receives login request TMAC Server will login to CC Elite through AES.Once ACD agent logged-in successfully, then agent will be in Not-Ready (Aux) mode.TMAC will perform agent login to POM server (whether Primary EPM or Auxiliary EPM) based on agent location preference in the user profile and active-standby mechanism for each organization. Once POM login success, screen displays login successful as OutboundAgent and status is in Not-Ready (Default) mode.Agent will change status manually in TMAC from Not-Ready to Ready (Available) modeTMAC Server passes Ready request to POM, then POM nail-ups the agent through Agent Selection Strategy and Blending rules to match the best agent to support the campaign. Then POM assigns Preview/Predictive/Callback contacts based on the campaigns assigned to agent.Based on the contact type TMAC will display the customer data in UI and provides call controlling buttons on UI for agent to assist customer..Once agent done with call/contact, then agent state moves to Wrapup mode and TMAC will display wrap up details for agent to choose and wrap the call.Once wrap up done, then agent will start receiving subsequent contacts from POM.High level interface diagram for inbound Telesales Agent launches TMAC Agent web client and enter LAN ID and extension in login page.TMAC Server receives login request. TMAC Server will login to CC Elite through AES.Once ACD agent logged-in successfully, then agent will be in Not-Ready (Aux) mode.TMAC will perform agent login to POM server (whether Primary EPM or Auxiliary EPM) based on agent location preference in the user profile and active-standby mechanism for each organization. Screen displays login successful and status is in Not-Ready (Default) mode.Once he/she ready, the agent will change status manually in TMAC from Not-Ready to Ready (Available) modeTMAC Server passes Ready request to POM, then POM nail-ups the agent through Agent Selection Strategy and Blending rules to match the best agent to support the campaign. Then POM assigns Preview/Predictive/Callback contacts based on the campaigns assigned to agent.Based on the contact type TMAC will display the customer data in UI and provides call controlling buttons on UI for agent to assist customer..If ACD call is in queue, then POM will send notification to TMAC Server “Agent blend to inbound”. Based on this notification TMAC Server will switch agent state from outbound to inbound and make available for ACD call to attend.Once ACD call is done, then if there are no ACD calls in queue then POM will send notification to TMACServer “Agent blend to outbound”. Based on this notification TMACServer will switch agent state from inbound to outbound and make available to POM calls to attend.The interface connectivity details are explained in detail below:(A)S/NDescriptionSourceDestinationNetwork ProtocolA1TMAC Client to Proxy TMAC ClientProxyhttpsA2TMAC Proxy to TMAC ServerTMAC ProxyTMAC ServerhttpA3TMAC Server to CTIServerTMAC ServerCTI ServerHttpA4TMAC Server to CTI ServerCTI ServerTMAC ServerTCPA5CTI Server to AES ServerCTI ServerAES ServerTCPA6CTI Server to POMServerCTIServerPOM ServerTCPA7TMAC Server to DatabaseTMACServerDBTCPEvent Sequence DiagramPreview ContactPredictive contacts BlendToInbound and BlendToOutboundArchitecture Diagram:CTI Server HAPOM HAWe have not yet implemented due to environmental issues.Application Programming Interface DetailsSecurityLogin:Boolean init (PAMSocketInfo[] pamAddresses, Boolean verifyCertificate) ---- This method must be run to initialize the library before using the library. Agent application desktop needs to set the flag verifyCertificate to enable/disable certificate verification. If it is set to true, then the certificate must be installed in agent desktop application windows machine. It is recommended to make this flag configurable on agent desktop application side..Parameters:pamAddress List of IP address and corresponding port of POM agent managers.verifyCertificate Flag to enable/disable certificate verification.ReturnValues:True – successFalse - failedNote: The init method return false in the first attempt if the connection between POM API SDK and POM server is not established and after that it always returns true whether the connection to POM server is established or not. So if the SDK init fails it is required to restart the agent desktop application.POMServer IPAddress and Port should be configurable in CTIServer config file.Positive Response to TMAC is: {"eventName":"SecurityLoginDone","extension":"44012","eventData":{"ErrorInfo":"","ResponseStatus":"0","Extension":"44012","InvokeID":"5","ErrorCode":"0"}}Negative Response to TMAC is: {"eventName":"SecurityLoginDone","extension":"44012","eventData":{"ErrorInfo":"<ErrorMessage>","ResponseStatus":"<ErrorCode>","Extension":"44012","InvokeID":"5","ErrorCode":"<errorCode>"}}SecurityLogout:deinit();The desktop developer must run this when the agent desktop application is shutting down to clean-up POM Desktop library’s resources used.Note: While doing deinit operation, there are some exceptions thrown in the log as the threads are interrupted at that time. However, there is no functionality impact because of these exceptions. If you want to logoff and login an agent again in the same instance of agent desktop application, then do not initiate deinit() function after logoff. deinit() function should be used when you are closing the agent desktop application to release the resources.Positive Response to TMAC is: {"eventName":"SecurityLogoutDone","extension":"44012","eventData":{"ErrorInfo":"","ResponseStatus":"0","Extension":"44012","InvokeID":"5","ErrorCode":"0"}}Negative Response to TMAC is: {"eventName":"SecurityLogoutDone","extension":"44012","eventData":{"ErrorInfo":"<ErrorMessage>","ResponseStatus":"<ErrorCode>","Extension":"44012","InvokeID":"5","ErrorCode":"<errorCode>"}}AgentLoginTMAC command : int AgentLogin(string extension, string agentID, string agentPassword, int invokeID)First we need to get POMAgentHandler for this agent before we call agent login method. This below method will be used to get POMAgent handler for this agent.POMAgent getPOMAgent(String id, POMAgentHandlerInterface handler)Description: The desktop developer must run this to get an agent object. The desktop developer uses this agent object to send commands for this agent. POM in turn can invoke the handler for asynchronous responses and notifications using callback thread. Desktop should free this callback thread as soon as possible so that this thread can process the responses of other commands. Ensure that it uses a valid POMAgent object before making any command request. Note: This method should be called before every login request (AGTLogon) to create a new POMAgent object.Parameters:id : - Agent IDhandler :- Callback handler objectThen We have to call AGTLogon method for agent login. Post successful call og AGTLogOn, application needs to wait for AGTLogonRESP event from POM before returning back to TMAC.int AGTLogon (String agentExt, String pwd, boolean isForce, String locale, String timeZone, String zoneName)Description: - The agent sends this command from the agent desktop application when the agent wants to login to POM. This logon API is used for CCElite agent desktop application. POM can then use this agent for a campaign when the agent becomes ready.Parameters: agentExt : station number pwd: agent PasswordisForce: - It should be true, when we wanted to do force login, but in our case it will be always false.Locale: Locale of agent (which we get from Avaya POM team)timeZone: - time zone of agent (which we get from Avaya POM team)zoneName: - this is name of the zone (which we get from avaya POM team).Note: - Locale, timeZone, zoneName parameters should be configurable in CTI Server.RESPONE: AGTLogonRESP(int result)Return Value :0 – means our login request to POM success, but we need to wait for AGTLogonRESPNot 0 – means our login request to POM failed with generic common error. Hence we need to show the same error response in UI.Asynchronous callback response for AGTLogon. We get response code in below format, but we need to change that to negative and send back to TMACServer.ErrorCodeError MessageError Description-2This agent is not registered with the systemPOM system does not recognize the logged in agent. You can force login again.-6Unable to verify passwordYou can see this message only in POM integration with CC Elite. POM cannot get the password from AES. Check the password of the agent and check the AES Web service.-7Agent is already logged inPOM displays the message if the agent has already logged in. You can force login again.-9Agent skills not foundCheck the agent ID. The agent ID must match the agent ID specified in Contact Center. If the error message persists, check the AES web services.-10Unable to change the state of the agentPOM cannot change the agent state. Login again to the POM system.-11Internal error. Unable to login agentThe agent cannot login to the POM system. Login again to the POM system.-12Login failure. Zone not foundThe agent cannot login because of zone error. Check the zone for which the agent logs in. The zone must match one of the zones specified in POM.-13Login failure. Invalid localeThe agent cannot login because of locale error. Check the locale of the agent. The locale must not be Null. If Null, specify a locale for the agent. Note: POM checks only Null value for locale values, and does not restrict any other string value-15Login failure. Invalid TimezoneThe agent cannot login because of time zone error. Check the time zone of the agent. The time zone must not be Null. If Null, specify time zone of the agent. Note:POM checks only Null value for time zone values, and does not restrict any other string value-16Login failure. Invalid Agent NameYou can see this message only if you have POM integration with AACC. The agent name cannot be Null. You must specify a value for agent name.-17Login failure. Authentication of agent failed.You see this message only if you have POM integration with CC Elite. Check the agent password. The agent password must match the agent password specified in the Contact Center.NOTE: - If AGTLogonResp event contains any of these error codes, then we have to pass the same error message to UI saying that Agentlogin failed with error message.After successful agent login, we need to maintain NailedStatus default as “NotNailedUp”. Once agent state changes to ready after immediate login, then we have to let POM that agent is ready for nail up. Based on the confirmation from POM, NailedStatus will change accordingly.Positive Response to TMAC is: {"eventName":"SetAgentStateDone","extension":"44012","eventData":{"ErrorInfo":"","ResponseStatus":"0","Extension":"44012","InvokeID":"5","ErrorCode":"0"}}Negative Response to TMAC is: {"eventName":"SetAgentStateDone","extension":"44012","eventData":{"ErrorInfo":"<ErrorMessage>","ResponseStatus":"<ErrorCode>","Extension":"44012","InvokeID":"5","ErrorCode":"<errorCode>"}}AgentLogoutTmac command : int AgentLogout(string sessionID, string agentID, int invokeID, string queue = "", int reasonCode = 0)POM Command: AGTLogoff()Description: The agent sends this command from the agent desktop application when it wants to logout from POM. An agent can send this command ONLY when the command is in “NotReady” state.RESPONE: AGTLogoffRESP(int result)Return Value: 0 – indicates success. But application needs to wait for AGTLogoffRESP541 - Unable to logoff. Please move to not ready state <0 – indicates our logout request to POM failed with generic common error. Hence we need to show the same error response in UI.Positive Response to TMAC is: {"eventName":"SetAgentStateDone","extension":"44012","eventData":{"ErrorInfo":"","ResponseStatus":"0","Extension":"44012","InvokeID":"5","ErrorCode":"0"}}Negative Response to TMAC is: {"eventName":"SetAgentStateDone","extension":"44012","eventData":{"ErrorInfo":"<ErrorMessage>","ResponseStatus":"<ErrorCode>","Extension":"44012","InvokeID":"5","ErrorCode":"<errorCode>"}}MonitorDeviceTmac command: int MonitorDevice(string sessionID, string extension, int invokeID)Since there is no need to monitor a device here in POM integration, application returns 0 which indicates this call is success.Positive Response to TMAC is: {"eventName":"MonitorDeviceDone","extension":"44012","eventData":{"ErrorInfo":"","ResponseStatus":"0","Extension":"44012","InvokeID":"5","ErrorCode":"0"}}Negative Response to TMAC is: {"eventName":"MonitorDeviceDone","extension":"44012","eventData":{"ErrorInfo":"<ErrorMessage>","ResponseStatus":"<ErrorCode>","Extension":"44012","InvokeID":"5","ErrorCode":"<errorCode>"}}UnMonitorDeviceTmac command: int UnMonitorDevice(string sessionID, int monitorHandle, int invokeID)Since there is no need to un-monitor a device here in POM integration, application returns 0 which indicates this call is success.Positive Response to TMAC is: {"eventName":"UnMonitorDeviceDone","extension":"44012","eventData":{"ErrorInfo":"","ResponseStatus":"0","Extension":"44012","InvokeID":"5","ErrorCode":"0"}}Negative Response to TMAC is: {"eventName":"UnMonitorDeviceDone","extension":"44012","eventData":{"ErrorInfo":"<ErrorMessage>","ResponseStatus":"<ErrorCode>","Extension":"44012","InvokeID":"5","ErrorCode":"<errorCode>"}}SetAgentStateToAuxTmac command: int SetAgentStateToAux(string sessionID, string agentID, int agentState, int invokeID, string queue, int reasonCode)SetAgentStateToPendingTmac command: int SetAgentStateToPending(string sessionID, string agentID, int agentState, int invokeID, string queue, int reasonCode)SetAgentStateToAutoIn/ SetAgentStateToManualInTmac command: int SetAgentStateToAutoIn(string sessionID, string agentID, int agentState, int invokeID, string queue)POM Command: int AGTStateChange(POMAgentState agentState, String reasonCode, String reasonName, Boolean hasWalkedAway)Params:agentState: An agent can specify the state to which the agent wants to transition to from the current state. The current agent states are:? Ready: The agent is ready to pick calls. ? NotReady: The agent wants to take a break ? PendingNotReady: The agent is in the middle of the call and has issued a request to go to NotReady state, but POM cannot send the agent to NotReady. reasonCode: reasonCode is AUX or reason code the agent selects from the agent desktop application while going to NotReady state.reasonName: reasonName is the AUX or reason code the agent selects from the agent desktop application while going to NotReady state.hasWalkedAway: Walked away flag is set to true if it considers the agent as walkaway agent. If an agent does not perform any actions for two consecutive calls, then the agent desktop application considers that the agent has walked away and changes the call state to NotReady, so that it does not send the next call to this agent. Except for a nontimed preview campaign an agent does not necessarily have to click buttons on the agent desktop application to handle a call, considering that the customer disconnects the calls and implements the autowrapup.Description:The agent sends this command when it wants to go Ready or NotReady. An agent goes to Ready state when it wants to accept calls from POM. Unless the agent is ready POM will not handover a call to the agent. If the agent is in NotReady state, POM will not pass on the outbound call to the agent. An agent can go to NotReady state from a Ready state only after the current call is done OR to put it in other words, the agent can go to NotReady state only if it is in Idle state. If the agent is in the middle of a call OR in wrap up state, the agent can issue a NotReady request. POM accepts this request and puts the agent in PendingNotReady state. Once the agent is done with disposing the existing call, POM will immediately put the agent in NotReady state and will not give it a new call until it goes back to Ready State. An important point to note is that if this agent has pending consults + pending callbacks, POM will not move the agent from PendingNotReady to NotReady until the pending consults + pending callbacks are completed. (Venky)ErrorCodes:ErrorCodeError MessageError Description63Agent already in same aux codeWhen the agent tries to change the agent state to NotReady with the same reason, POM returns this error. The agent must select other reason code to mention different reason for NotReady64Unable to change the current statePOM does not allow the agent to change the state to NotReady or Ready from the current state.Response Event:AGTStateChangeRESP(POMAgentState pomAgentState, int result)pomAgentState Agent state of type POMAgentState result 0 indicates success.Note: - For every error code, since we are getting positive number from POM, we need to append “-“ to error code (like example 63 = -63), and send back to TMAC along with error description.Below actions should be done when agent is changing to “Ready” mode, Immediate after login and in application if the NailedStatus status is “NotNailedUp”.If agent state changing to READY mode immediate after login, then application need to inform POM that agent is available for nailed call, by calling below POM methods.POM command : AGTAvailableForNailup()Description: Agent desktop application sends this command only when the agent gets Ready for the first time after logging in.RESPONSE: AGTAvailableForNailupRESP(int result)Result: 0 – indicates Success.NOTE: - POM nails the agent if a campaign is running which matches the skillset of agent. POM can nail the agent only after POM receives the above command. POM sends a sequence of notifications with flags indicating the next nailing action. If POM wants to nail an agent it first sends AGTNailupChange with flag PendingNailup. On processing this flag the agent desktop application must send AGTReadyForNailupApplication must listen for AGTNailupChange event for Nail status after calling AGTAvailableForNailup method. In AGTNailupChange(POMNailupStatus nailupStatus). If the nailupStatus is “PendingNailUp”, then application has to call “AGTReadyForNailup” method to get nailed call.POM Command: int AGTReadyForNailup()Description: The application sends this command when it has processed the AGTNailupChange-PendingNailup notification. The notification gives an agent enough time to prepare for the nailup. The notification also acts as an indication to the agent desktop application (with a softphone) making the next call as a nailing call which must be auto-answered and the call is not a generic inbound call.RESPONSE: AGTReadyForNailupRESP(int result).If the return value 0, then agent will receive Nailed-up call and customer will be connected immediately if the job has contacts.Positive Response to TMAC is: {"eventName":"SetAgentStateTo******Done","extension":"44012","eventData":{"ErrorInfo":"","ResponseStatus":"0","Extension":"44012","InvokeID":"5","ErrorCode":"0"}}Negative Response to TMAC is: {"eventName":"SetAgentStateTo****Done","extension":"44012","eventData":{"ErrorInfo":"<ErrorMessage>","ResponseStatus":"<ErrorCode>","Extension":"44012","InvokeID":"5","ErrorCode":"<errorCode>"}}HoldTmac command: int Hold(string sessionID, string connectionHandle, int invokeID)connectionHandle param value should be the POM SessionID which has been passed during OnPOMOutboundCallNotifyEventPOMCommand: int AGTHoldCall (String sessionID)Parameters: sessionID : Unique ID of the session for the entire contact processing duration. (ex. This session id we receive AGTCallNotifyEvent).Description: this command to put call on hold.RESPONSE: This is an event AGTHoldCallRESP(String sessionID, int result)sessionID : Unique ID of the call for the entire contact processing duration. Result : 0 indicates success.Non zero means failure. And send the error message corresponding to error code to TMAC Server.If result code is 0, then we need to send positive confirmation for hold request/command to TMACServer. Which is HoldCallDone event Example:{"eventName":"HoldCallDone","extension":"40709","eventData":{"ResponseStatus":"0","Extension":"40709","InvokeID":"361"}If result code is other than 0 (nonzero), then we need to send negative confirmation for hold request/command to TMAC Server saying that request is failed with proper error message. {"eventName":"CSTAUnviversalFailureEvent","extension":"40709","eventData":{"ResponseStatus":"-1",”ErrorCode”:-”<errorCode>”,”ErrorInfo”:”-<errorCode>”,"Extension":"40709","InvokeID":"361"} LINK Excel.Sheet.12 Book1 Sheet1!R2C3:R5C5 \a \f 4 \h \* MERGEFORMAT HoldReconnectTmac command: int HoldReconnect(string sessionID, string connectionHandle, int invokeID)connectionHandle param value should be the POM SessionID which has been passed during OnPOMOutboundCallNotifyEventPOMCommand: int AGTUnHoldCall (String sessionID)Parameters: sessionID: Unique ID of the call for the entire contact processing duration.RESPONSE: This is an event AGTUnHoldCallRESP(String sessionID, int result)sessionID : Unique ID of the call for the entire contact processing duration. Result : 0 indicates success.Non zero means failure. And send the error message corresponding to error code to TMAC Server.If result code is 0, then we need to send positive confirmation for holdReconnect request/command to TMACServer. Example: {"eventName":" HoldReconnectDone","extension":"40709","eventData":{"ResponseStatus":"0","Extension":"40709","InvokeID":"361"}If result code is other than 0 (nonzero), then we need to send negative confirmation for HoldReconnect request/command to TMAC Server saying that request is failed with proper error message. {"eventName":"CSTAUnviversalFailureEvent","extension":"40709","eventData":{"ResponseStatus":"-1",”ErrorCode”:-”<errorCode>”,”ErrorInfo”:”-<errorCode>”,"Extension":"40709","InvokeID":"361"}ErrorCodeError MessageError Description121Unable to unholdUnable to unhold call due to telephony errors.122Unable to unhold as call is disconnectedThis error comes when agent tries to unhold the call which is disconnected.123Unable to unhold as agent is not on callThis error comes when agent is not on call.DisconnectCall/DisconnectStationTmac command: int DisconnectCall(string sessionID, string connectionHandle, int invokeID, string UserUserInfo = "")Tmac command: int DisconnectStation(string sessionID, string connectionHandle, int invokeID, string userUserInfo= "")connectionHandle param value should be the POM SessionID which has been passed during OnPOMOutboundCallNotifyEventPOMCommand: int AGTReleaseLine(String sessionID)Parameters: sessionID: Unique ID of the call for the entire contact processing duration.RESPONSE: This is an event AGTReleaseLineRESP(String sessionID, int result)sessionID : Unique ID of the call for the entire contact processing duration. Result : 0 indicates success.Non zero means failure. And send the error message corresponding to error code to TMAC Server.If result code is 0, then we need to send positive confirmation for DisconnectCall/DisconnectStation request/command to TMACServer. {"eventName":" DisconnectCall Done","extension":"40709","eventData":{"ResponseStatus":"0","Extension":"40709","InvokeID":"361"}If result code is other than 0 (nonzero), then we need to send negative confirmation for DisconnectCall/DisconnectStation request/command to TMAC Server saying that request is failed with proper error message. {"eventName":"CSTAUnviversalFailureEvent","extension":"40709","eventData":{"ResponseStatus":"-1",”ErrorCode”:-”<errorCode>”,”ErrorInfo”:”-<errorCode>”,"Extension":"40709","InvokeID":"361"}SendGenericCTICommand:Param1: CommandNameParam2: jsonData DialPOMPreviewCall: This command should be used to call when agent want to dial out preview contact.jsonData: connectionHandle – callID of contact/CallnumberToDial – Customer number to dial out. This information will be shared in OnOutboundCallUUIData event.custName – name of the customer to dial out. This information will be available in OnOutboundCallUUIData event.CancelPOMPreviewCall:This command should be used to call when agent wants to cancel preview contact.JsonData:connectionHandle: CallID of call/Contact.WrapUpCallContact: This command should be used to call when agent wants to wrap up the contact.JsonData:connectionHandle: callID of call/pCode: call completion code. This information will be available in OnCallWrapUpDataEvent pValue: call completion string. This information will be available in OnCallWrapUpDataEvent event.GetConsultDestinationAgentsList: this command will be used to call to get the list of agents/external parties available for consultation either in transfer/conference.JsonData:connectionHandle: callID of call/contact.consultType : “Agent/External”Call Events POM_OutboundCallEventAGTCallNotify(POMContact contact, string sessionID)Description: POM sends notification for Predictive and Progressive campaigns when POM connects the outbound call to the customer with the agent. POM sends this notification to the selected agent, so that the agent gets to know the customer that got dialed. The agent desktop application must then run AGTGetCustomerDetails command to get more details about the customer.Parameters : contact : POMContact object containing the customer and job related information about the contact which is (preview campaign)/got (Predictive + Progressive campaign) dialed.sessionID: Unique ID of the call for the entire contact processing duration.Above list of information application receives in this event and same we need to convert to JSON format and send back to TMAC Server as below event:{"eventName":" OnOutboundCallInitiated” ","extension":"44012","eventData":{”ConnectionHandle”:”<callID>” “MonitorHandle”:”<monHandle>”,”CallID”:”<callID>”, “Device”:”<extension>”,"UCID":"<SessionID>","campaignType":"<type of campaign>","JSONData":"<jsonData"}}Example event:OnOutboundCallInitiated------------------------Start---------------------OnOutboundCallInitiated:ConnectionHandle:12057!141195!0OnOutboundCallInitiated:MonitorHandle:858047392OnOutboundCallInitiated:CallID:141195OnOutboundCallInitiated:Device:12057OnOutboundCallInitiated:UCID:141195OnOutboundCallInitiated:JsonData:{"CallbackNotes":"","CampaignName":"UOB1","CanCancel":true,"CanCancelSpecified":false,"CanEnterFreeFormNumber":true,"CanEnterFreeFormNumberSpecified":false,"ContactCapabilities":null,"ContactNumbers":[{"IsDefault":true,"Name":"Phone 1","Number":"12053","Timezone":"2018/06/14 20:01","State":"","Wireless":""}],"ContactType":0,"ContactTypeSpecified":false,"ScriptURL":"","ScriptFailoverURL":"","SkillsetName":"OUTCALL","DefaultNumber":"12053","Timed":false,"TimedSpecified":false,"Timeout":0,"TimeoutSpecified":false,"CanDial":true,"CanDialSpecified":false,"CanReschedule":true,"CanRescheduleSpecified":false,"ExpiryTime":"30","ContactID":15616,"SkillsetID":"15"}OnOutboundCallInitiated:CampaignType:PreviewApplication needs to call below POM command to get customer informationPOMCommand: int AGTGetCustomerDetails (String sessionID)Description: Agent can run this command if it wants complete details of a contact. Details include Title/ FirstName/LastName/Address/Phone/email fields and custom fields. Usually this command must run after receiving a new call notification, that is, AGTCallNotify. RESPONSE: it will be an eventAGTGetCustomerDetailsRESP(POMCustomerDetails customerDetails, String sessionID, int result)Return value Params:customerDetails : POMCustomerDetails object containing customer datasessionID : Unique ID of the call for the entire contact processing duration. Result: 0 indicates success. If nonzero is failureThis is the structure info where we get information. Application has to take all the values and convert to JSON and pass back to TMAC Server like below event. This event will be triggered as “OnGenericCTIEventWithData” with param event name as “OnUUIDataEvent”.{"eventName":" OnOutboundCallUUIData ","extension":"44012","eventData":{“Device”:”<extension>”,”ConnectionHandle”:”<callID>”,"UCID":"<SessionID>","campaignType":"<type of campaign>","JSONData":"<jsonData"}}Example event:OnOutboundCallUUIData:{"Title":{"key":"Title Predefined","value":"","attributeType":1},"ID":{"key":"ID","value":"16","attributeType":0},"Firstname":{"key":"First Name","value":"Avaya","attributeType":1},"Lastname":{"key":"Last Name","value":"","attributeType":1},"PhoneFields":[{"phoneNumber":{"key":"Phone 1","value":"12053","attributeType":1},"countryCode":{"key":"Phone 1 Country Code","value":"65","attributeType":1},"timezone":{"key":"Time Zone","value":"Singapore","attributeType":1},"state":{"key":"Phone 1 State","value":"","attributeType":1},"wireless":{"key":"Phone 1 Wireless","value":"","attributeType":1}}],"EmailFields":[{"key":"E-Mail","value":"","attributeType":1}],"AddressList":[{"Line1":{"key":"Address Line 1 Predefined","value":"","attributeType":1},"Line2":{"key":"Address Line 2 Predefined","value":"","attributeType":1},"Line3":{"key":"Address Line 3 Predefined","value":"","attributeType":1},"Line4":{"key":"Address Line 4 Predefined","value":"","attributeType":1},"Line5":{"key":"Address Line 5 Predefined","value":"","attributeType":1},"Country":{"key":"Country Predefined","value":"","attributeType":1},"ZipCode":{"key":"Zipcode Predefined","value":"","attributeType":1}}],"CustomFields":[{"key":"","value":"","attributeType":0}]}OnCallWrapUpDataEventThis event will be triggered with wrap up data information. After call end, application requests wrap up data from POM and will respond back to TMAC for user to take wrap up the call. This event will be triggered as “OnGenericCTIEventWithData” with first param as event name such as “OnCallWrapUpDataEvent” followed by jsonData as second parameter.OnCallWrapUpDataEvent:[{"codeID":"69","codeVaTechnical DetailsWhat’s the webserver & app services used & its technical details (Versions, patch details, hostname)A?Web server?is a program that uses?HTTP?(Hypertext Transfer Protocol) to serve the files that form?Web?pages to users, in response to their requests, which are forwarded by their computers'?HTTPclients.What and all services running and purpose of the same?TMAC Server – This is the main service running which handles all the TMAC related operations. All the events are commuted through this service and does the DB operations. If this service is stopped TMAC will not work.SMS API – This is wrapper around Avaya’s SMS API, basically used to get the skills.OCM Report Scheduler - This service is used for migrating data from tables, formatting the data and saving formatted data to OCM tables. So that while loading UI or exporting from OCM, data will be fetched from OCM tables directly without any formatting required later.OCM Export Scheduler - These reports can be scheduled for exporting on daily, weekly, monthly basis to excel or csv file from OCM Export Scheduler servicePOM CTI Server – Service to integrate with POM server to handle outbound contactsAES CTI Server – This service is required for handling the events and to communicate with Avaya’s application, Avaya Enablement Services.External Data Server – This service is TPOM Callback Dashboard – This service will get the scheduled callback from POM server to show in the UI (dashboard)TSessionManager – This service manages the session of each agent logged in to OCM for the configurable time, before the timeout the UI asks for the extension of session on click of that the session will be extended again.1.7.1 High AvailabilityPOM HA ArchitectureNot implementedHA Working principleNot implementedWhat will happen to agent in case of failover happens?When the AES failover happens, the agent should use hard phone to continue the call until AES is back. If POM is down, agent might not be able to change the status or get the call.OCMStored ProceduresHope to be shared by ShaarikaExplanation on each report (1 line)CollectionsOCM Account Not in Listing Report – This report will have the accounts which are not dialed by the POM. Data will be inserted by the pre-processing scriptOCM Agent Owned Recalls Report – This report contains the data of call back which is assigned to himselfOCM Call Attempt Report – This report will have the data of all the calls which are attempted by the POMOCM DNC List Report – This will have the data of DNC along with from where it has been done, Manual or Dialer Kill ListOCM Inbound Abandoned Report – This will have the data of abandoned call by the customerOCM List Accounts Not Attempted Report – This report will have the data which are not attempted by POM to dialOCM NSP List Report – This report will display record detail that agent dispose NSP as completion codeOCM NTC Report – This report will display record detail that agent dispose 'CM_NTC' as completion codeOCM Outbound Nuisance Report – This report will have data (predictive) where call has been dialed by POM but when it connects to agent, agent goes to AUX. Such call will be treated as Nuisance for the customer and can find here.OCM Predictive Agent Time Summary Report – This will have the agent summary data for the predictive calls mapping agent to teamOCM Predictive Job Performance Summary Report – This will have the job summary data for the predictive calls mapping job name to teamOCM Preview Agent Time Summary Report – – This will have the agent summary data for the preview calls mapping agent to teamOCM Preview Job Summary Report – This will have the job summary data for the preview calls mapping job name to teamOCM Secured Unsecured Performance Report - UtilitiesInterface Methods:GetAllContactListsSignature: public?List<ContactList>?GetAllContactLists (bool?onlyManualContacts?=?false)Pom api URL’s used:string?apiPath?=?baseurl?+?"/contactlists?searchBy=organizationName&searchOperator=like&searchValue="?+?organizationName; base URL and organizationName are taken from config file.Logic:Makes a POM API call.On success deserializes pom data to ContactList class object type.Filter is applied if onlyManualContacts is set to true, value is taken from config file key = ContactListFilterReturns List of ContactList items to caller.Model class:public?class?ContactList???{???????[JsonProperty("contactListName")]???????public?string?ContactListName?{?get;?set;?} ???????[JsonProperty("contactListId")]???????public?int?ContactListId?{?get;?set;?} ???????[JsonProperty("lastUpdateOn")]???????public?string?LastUpdatedOn?{?get;?set;?} ???????[JsonProperty("totalContacts")]???????public?int?TotalContacts?{?get;?set;?} ???????[JsonProperty("availableContacts")]???????public?int?AvailableContacts?{?get;?set;?} ???????[JsonProperty("totalExcludedContacts")]???????public?int?TotalExcludedContacts?{?get;?set;?} ???????[JsonProperty("organizationName")]???????public?string?OrganizationName?{?get;?set;?} ???????[JsonProperty("zoneName")]???????public?string?ZoneName?{?get;?set;?}???}PurgeContactSignature:public?string?PurgeContact (string?contactName,?int?contactListId,?string?attribute,?string?filter,?string?userName,?params?string[]?value)Pom api URL used:string?apiPath?=?isRawList??$"{url}/contactlists/{contact_list_id}/contacts/list?pageSize={pageSize}&pageNumber={pageNumber}"?:?$"{url}/contactlists/{contact_list_id}/contacts/list?searchBy={searchAttribute}&searchOperator={optr}&searchValue={searchValue}&sortBy=userContactId&sortDirection=DESC&pageSize={pageSize}&pageNumber={pageNumber}"; // to get contact batch itemsstring?apiPath?+=?string.Format("/contactlists/{0}/{1}/{2}/{3}",?contactListId,?"contacts",?userContactId,?"delete"); // for purging.Logic:Before purge, API call to get contact batch items is called keeping parameter value isRawList to true. This yields ContactBatchList.Get List of OutboundPurgeData before purge data by taking only “CAMP_ID” attributes from above ContactBatchList items.If input string attribute contains is “expiry” then input value passed in params is validated for Date Format.API call to get contact batch items is called again keeping isRawList to false.Read from config for purge type i.e. direct purge or normal purge. if input parameter attribute value matches the config key “DirectPurge” value, then perform purge operation and return data to caller. While performing direct purge below things are taken care,If input filter value is “not equal to”, then all usercontacts from above ContactBatchList items are purged except input attribute value which is userContactId.If attribute value doesn’t match direct purge value mentioned in config key, then purging is done for each userContactId present in above ContactBatchList items.If purge fails and if error message is “Cannot delete contact as the attempt is in progress”, then by default a max of 5 tries is made.After purging, API call to get Contact Batch Items (step 1 and step 2) are performed again to get counts after purging.Database interaction, a insert script is executed for table OutboundPurgeData considering before purge items and after purge items.Final result will be then binded to model PurgeResult class and sent to caller.Models used:public?class?ContactBatchList??{??????[JsonProperty("contactBatch")]??????public?List<ContactBatch>?ContactBatch?{?get;?set;?} ??????[JsonProperty("totalPage")]??????public?int?TotalPage?{?get;?set;?}??}public?class?OutboundPurgeData???{???????public?string?Mode?{?get;?set;?}???????public?string?ContactList?{?get;?set;?}???????public?string?CampaignID?{?get;?set;?}???????public?int?BeforePurging?{?get;?set;?}???????public?int?AfterPurging?{?get;?set;?}???????public?int?BuisnessParameter?{?get;?set;?}???????public?DateTime?CreatedDateTime?{?get;?set;?}???}public?class?PurgeFailureResponse:?PurgeResponse?{?????[JsonProperty("displayMessage")]?????public?string?DisplayMessage?{?get;?set;?} ?????[JsonProperty("errorMessage")]?????public?string?ErrorMessage?{?get;?set;?} ?????[JsonProperty("errorCode")]?????public?string?ErrorCode?{?get;?set;?}?}public?class?PurgeResponse???{???????[JsonProperty("isDeleted")]???????public?virtual?bool?IsDeleted?{?get;?set;?} ???????[JsonProperty("failedUserContactIds")]???????public?List<string>?FailedUserContactIds?{?get;?set;?}???}public?class?PurgeResult??{??????[JsonProperty("isDeleted")]??????public?bool?IsDeleted?{?get;?set;?} ??????[JsonProperty("failedUserContactId")]??????public?string?FailedUserContactId?{?get;?set;?} ??????[JsonProperty("errorMessage")]??????public?string?ErrorMessage?{?get;?set;?}??}DNCSignature:[1] public?DNCResponse?DNC(string?contactListName,?int?contactListId,?string?filePath,?string?userName)[2]public?DNCResponse?DNC(string?filePath)Pom api URL used:string?apiPath?=?baseurl; apiPath?+=?string.Format("/contactlists/{0}/{1}/{2}/",?contactListId,?"contacts",?"markuncallable"); [1]string?apiPath?=?url;???????????????apiPath?+=?string.Format("/dnclists"); [2]string?apiPath?=?url;?????????????apiPath?+=?string.Format("/dnclists/{0}/{1}",?dncListId,?"addresses");Logic:There are two overloaded methods for DNC as shown in signature.For the first overloaded method [1], logic flows as,Based on input values, application will first generate payload required for POST api call.Payload is nothing but list of usercontactId’s generated from a given/uploaded csv file.POM API call for markuncallable is made.Upon success or failure DNCResponse data is sent to caller.On success, Result field value of DNCResponse will be true and and FailedContactIdList property value will be null.On failure, Result field value of DNCResponse will be false and FailedContactIdList property will contain failed usercontactId’s along with valid ErrorInfo data.For the second overloaded method [2], logic flow as,Gets dnclists If no DNCList data obtained returns null to caller.Foreach dnclist items, Check and compare for Config key Organization Name value with DNCListName value in dnclist item.If match found then generate payload from uploaded/given csv file.Make a POST API call to pom to add addresses to DNC List.Upon success or failure DNCResponse data is sent to caller.On success, Result field value of DNCResponse will be true and and FailedContactIdList property value will be null.On failure, Result field value of DNCResponse will be false and FailedContactIdList property will contain failed usercontactId’s along with valid ErrorInfo data.Model:public?class?DNCResponse?:?PomResponse????{????????[JsonProperty("result")]????????public?bool?Result?{?get;?set;?} ????????[JsonProperty("failedContactIdList")]????????public?string[]?FailedContactIdList?{?get;?set;?}????}public?class?PomResponse????{????????public?virtual?bool?IsSuccess?{?get;?set;?}????????public?virtual?ErrorInfo?ErrorInfo?{?get;?set;?}????}public?class?ErrorInfo??{??????[JsonProperty("displayMessage")]??????public?string?DisplayMessage?{?get;?set;?} ??????[JsonProperty("errorMessage")]??????public?string?ErrorMessage?{?get;?set;?} ??????[JsonProperty("errorCode")]??????public?string?ErrorCode?{?get;?set;?}??}public?class?DNCList????{????????[JsonProperty("DNCListId")]????????public?int?DNCListId?{?get;?set;?}????????[JsonProperty("DNCListName")]????????public?string?DNCListName?{?get;?set;?}????????[JsonProperty("lastUpdated")]????????public?DateTime?LastUpdated?{?get;?set;?}????????[JsonProperty("totalAddresses")]????????public?int?TotalAddresses?{?get;?set;?}????????[JsonProperty("listType")]????????public?string?ListType?{?get;?set;?}????}Manual Upload:Signature:public?PomManualUploadResponse?ManualCheckerUpload(string?contactListId,?string?contactListName,?string?filePath,?string?type,?string?dbId)POM API urls:string?apiPath?=?url;??????????????apiPath?+=?string.Format("/datasources/schedule/runonce");Logic:Get single data source name of type = ‘append’ from json payload file having file name paylod.json.If no datasourcename found, return caller with proper error response.Verify SFTP for uploaded file using third party tool pscp.exe.On success, create a payload ‘Schedule’ class object having StartTime as DateTime.Now.AddMinutes(5) , datasource name is same as obtained as in first step and timezone as configured in config file.Make a datasource schedule runonce api call to POM.On success api call, update database table Outbound_ManualUploadUtility with new Uploadtime and upload id.Return caller with proper success or error message.Models used:public?class?PomManualUploadResponse?:?PomResponse???{???????public?override?bool?IsSuccess?{?get;?set;?}???????public?override?ErrorInfo?ErrorInfo?{?get;?set;?}???}public?class?PomResponse???{???????public?virtual?bool?IsSuccess?{?get;?set;?}???????public?virtual?ErrorInfo?ErrorInfo?{?get;?set;?}???}Run Campaign:Signature:public?PomCampaignResponse?StartCampaignJob(string?campaignName)POM API url used:string?apiPath?=?url;???????????????apiPath?+=?string.Format("/campaigns/{0}/{1}/{2}",?campaignId,?"job",?"start");Logic:Get campaign id for given campaign name.Make a POM api call, to start job.On success or failure, send PomCampaignResponse?to caller.IsSuccess property value is equal to isQueued of api object.Models used:public?class?PomCampaignResponse?:?PomResponse?{?????public?override?bool?IsSuccess?{?get;?set;?}?????public?override?ErrorInfo?ErrorInfo?{?get;?set;?}?}public?class?PomResponse???{???????public?virtual?bool?IsSuccess?{?get;?set;?}???????public?virtual?ErrorInfo?ErrorInfo?{?get;?set;?}???}TMACCampaign – Organization - Team - Contact list MappingBased on team name in TMAC, organization name in rest APIs and DB queriesWrap-up Codes handlingSpecial completion codes, update attributes using rest APIsSales Screens functionality and auto populate details/Contact list fields mappingThis is being used in Telesales, when agent disconnects the call the agent can select the sales screen from the dropdown and can open the same. Agent will fill up the details and submit which writes the record to the table which is used to show in the respective reportsWhen the call has arrived, the data will be inserted to the DB, based on that session ID we will get the required data and auto populate the required fieldsDashboard API usage and DB UsageDashboard using same APIs. For some we are using DB call back management ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download