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");
}