Saturday, January 9, 2016

AX 2012 - How to retrieve meeting (appointment) status from Outlook

Microsoft Dynamics AX 2012 provides a very convenient way to synchronize outlook tasks, contacts and appointments back into AX. 

MSDN topics describe the integration in details.
https://technet.microsoft.com/en-us/library/aa498242.aspx
https://technet.microsoft.com/en-us/library/gg230659.aspx

Let's discuss the main motive of this post; How can you retrieve the meeting (appointment) status from outlook back to AX 2012.

Before I show you where and what code need to add or change, I will show the existing functionality how it works.

Go to Home > Periodic > Microsoft outlook synchronization > Synchronize


Here you can see, be default it tries to sync Contacts, Tasks and Appointments within provided date range. I will focus on Appointments for this post and sync Appointments only,



Let's assume I have following meeting (appointment) response in my outlook, remember it was a meeting invitation which I sent from AX and now I have their responses back into my outllook.

For below email the response is Accepted.



Upon Sync Appointments it creates Activities in AX and can be access from Home > Common > Activities > All activities.



The last (right most) column is showing the meeting response, AX default functionality (Sync process) does not bring this meeting response back into AX. Here is the code change which needs to plug in into existing class to achieve this function.

Class: SmmOutlookSync_Appointment
Method: synchronizeAppointmentsOutlookToAxapta()



This method is retreiving the meeting status;

// Faisal.F, read meeting response;
// Accepted = 3; Tentative = 2; Declined = 4 [based on macro smmMSOutlook2002ObjectModelConstants]
private str FCM_getMeetingResponse(COM  _outlookItem)
{
    COM     recip, recips;
    str     meetingStatus;

    if ( _outlookItem.Recipients() != null)
    {
        recips = outlookItem.Recipients();
        if (recips.Count() >= 1)
        {
            recip = recips.Item(1);

            switch(recip.MeetingResponseStatus())
            {
                case 2:
                    meetingStatus = "Tentative";
                    break;

                case 3:
                    meetingStatus = "Accepted";
                    break;

                case 4:
                    meetingStatus = "Declined";
                    break;

                default:
                    meetingStatus = "None";
                    break;
            }
        }
    }
    return meetingStatus;   
}