Saturday, 25 July 2015

Get Local Time From UTC in MSCRM

public static int GetUserTimeZoneCode(ITracingService tracing, IOrganizationService service, IPluginExecutionContext context)
{
tracing.Trace("In GetUserTimeZoneCode method");
            int timeZoneCode = 0;

            try
            {
                string fetchXmls = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
                <entity name='usersettings'>
                    <attribute name='timezonecode' />
                    <link-entity name='systemuser' from='systemuserid' to='systemuserid' alias='ad'>
                        <filter type='and'>
                            <condition attribute='systemuserid' operator='eq' uitype='systemuser' value='{0}' />
                        </filter>
                    </link-entity>
                </entity>
            </fetch>";

                EntityCollection userSettings = service.RetrieveMultiple(new FetchExpression(string.Format(fetchXmls, context.UserId)));

                if (userSettings.Entities.Count > 0)
                {
                    timeZoneCode = GetValueFromContextOrImage<int>(userSettings.Entities.FirstOrDefault(), "timezonecode");
                    tracing.Trace("TimeZoneCode: " + timeZoneCode);
                }
            }
            catch (Exception ex)
            {
                tracing.Trace("Error in GetUserTimeZoneCode method: " + ex.Message);
            }

            return timeZoneCode;
}

/// <summary>
/// Return the Local time for the time provided
/// </summary>
/// <param name="UTCTime">The DateTime of UTC Time</param>
/// <returns>The DateTime of local time</returns>
public static DateTime GetLocalTime(ITracingService tracing, IOrganizationService service, IPluginExecutionContext context, DateTime UTCTime)
{
tracing.Trace("In GetLocalTime method");
            LocalTimeFromUtcTimeResponse timeResp = new LocalTimeFromUtcTimeResponse();
            try
            {
                // If UTCTime is null the return UTCTime
                if (UTCTime.Equals(DateTime.MinValue))
                    return UTCTime;

                // Create LocalTimeFromUtcTimeRequest instance and set the UtcTime and TimeZoneCode
                LocalTimeFromUtcTimeRequest timeReq = new LocalTimeFromUtcTimeRequest();
                timeReq.UtcTime = UTCTime.ToUniversalTime();
                timeReq.TimeZoneCode = GetUserTimeZoneCode(tracing, service, context);

                // Execute the LocalTimeFromUtcTimeRequest
                timeResp = (LocalTimeFromUtcTimeResponse)service.Execute(timeReq);

            }
            catch (Exception ex)
            {
                tracing.Trace("Error in GetLocalTime method: "+ex.Message);
            }

return timeResp.LocalTime;
}

public static void SetValueToContextOrImage(Entity contextRecord, string fieldName, object value)
{
if (contextRecord != null)
{
if (contextRecord.Contains(fieldName))
contextRecord.Attributes[fieldName] = value;
else
contextRecord.Attributes.Add(fieldName, value);
}
else
{
throw new Exception("Record is null");
}
}

/// <summary>
/// A generic method to check if a field exist in the context record and return its value. Otherwise will use the image record instead.
/// </summary>
/// <typeparam name="T">The type of the attribute</typeparam>
/// <param name="contextRecord">The current record in context or a retrieved record (must not be null)</param>
/// <param name="fieldName">The field name</param>
/// <param name="image">Optional. PreImage or PostImage record to get the value from if the context record doesn't have it</param>
/// <returns></returns>
public static T GetValueFromContextOrImage<T>(Entity contextRecord, string fieldName, Entity image = null)
{
if (contextRecord != null && contextRecord.Contains(fieldName))
{
return contextRecord.GetAttributeValue<T>(fieldName);
}
else if (image != null && image.Contains(fieldName))
{
return image.GetAttributeValue<T>(fieldName);
}

return new Entity().GetAttributeValue<T>("dummyValue");
}



No comments:

Post a Comment