private void Validate() { if (IsMessage(PluginMessage.Create, PluginMessage.Update) && IsStage(PluginStage.PostEvent)) { if (ConfigFieldChanging()) { //check valid fetch / query for rollup var target = XrmService.Retrieve(TargetType, TargetId); var config = CalculatedService.LoadCalculatedFieldConfig(target); if (target.GetOptionSetValue(Fields.jmcg_calculatedfield_.jmcg_type) == OptionSets.CalculatedField.Type.Rollup) { var rollup = CalculatedService.CreateRollup(config); var query = new QueryExpression(rollup.RecordTypeWithRollup); query.ColumnSet = new ColumnSet(rollup.RollupField); var link = query.AddLink(rollup.RecordTypeRolledup, XrmService.GetPrimaryKey(rollup.RecordTypeWithRollup), rollup.LookupName); link.Columns = new ColumnSet(rollup.FieldRolledup); if (rollup.Filter != null) { link.LinkCriteria = rollup.Filter; } try { XrmService.Execute(new QueryExpressionToFetchXmlRequest { Query = query }); } catch (Exception ex) { throw new InvalidPluginExecutionException("There was an error validating a query for the rollups configuration - " + ex.Message, ex); } } } } }
private void RefreshPluginRegistration() { if (IsMessage(PluginMessage.Create, PluginMessage.Update, PluginMessage.Delete) && IsStage(PluginStage.PostEvent) && IsMode(PluginMode.Synchronous)) { var refreshSdkMessageProcessingSteps = IsMessage(PluginMessage.Delete) || ConfigFieldChanging(); if (refreshSdkMessageProcessingSteps) { CalculatedService.RefreshPluginRegistrations(TargetId); } } }
public override XrmPlugin CreateEntityPlugin(string entityType, bool isRelationship, IServiceProvider serviceProvider) { lock (_lockObject) { if (!_loadedConfig) { var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); var xrmService = new XrmService(factory.CreateOrganizationService(context.UserId), new LogController()); var calculatedService = new CalculatedService(xrmService, new CalculatedSettings(xrmService), new LocalisationService(new LocalisationSettings(xrmService, context.InitiatingUserId))); var loadedToConfigs = calculatedService.DeserialiseEntities(_unsecureConfiguration) .Select(calculatedService.LoadCalculatedFieldConfig) .ToArray(); var ordered = new List <CalculatedFieldsConfig>(); foreach (var config in loadedToConfigs) { var i = 0; foreach (var added in ordered.ToArray()) { //ensure we add before this item if our target is one of its dependent fields var thisTargetField = config.CalculatedFieldEntity.GetStringField(Fields.jmcg_calculatedfield_.jmcg_field); var dependentFields = calculatedService.GetDependencyFields(added, entityType); if (dependentFields.Contains(thisTargetField)) { ordered.Insert(i, config); break; } i++; } if (!ordered.Contains(config)) { ordered.Add(config); } } Configs = ordered; _loadedConfig = true; } } return(new CalculateFieldsPlugin(Configs)); }
private bool DoRefresh() { var target = XrmService.Retrieve(TargetType, TargetId); var fieldsToSet = new List <string>(); if (!target.GetBoolean(Fields.jmcg_calculatedfield_.jmcg_isrecalculating)) { target.SetField(Fields.jmcg_calculatedfield_.jmcg_isrecalculating, true); fieldsToSet.Add(Fields.jmcg_calculatedfield_.jmcg_isrecalculating); } if (!string.IsNullOrWhiteSpace(target.GetStringField(Fields.jmcg_calculatedfield_.jmcg_errorrecalculating))) { target.SetField(Fields.jmcg_calculatedfield_.jmcg_errorrecalculating, null); fieldsToSet.Add(Fields.jmcg_calculatedfield_.jmcg_errorrecalculating); } if (fieldsToSet.Any()) { XrmService.Update(target, fieldsToSet.ToArray()); } var isFinished = false; var createDateThreshold = target.GetDateTimeField(Fields.jmcg_calculatedfield_.jmcg_lastrecalculationcreatedate) ?? new DateTime(1910, 1, 1); try { var config = CalculatedService.LoadCalculatedFieldConfig(target); var startedAt = DateTime.UtcNow; var fieldsToLoad = new List <string>(); var calculatedFieldFieldName = target.GetStringField(Fields.jmcg_calculatedfield_.jmcg_field); var calciulatedFieldEntityName = target.GetStringField(Fields.jmcg_calculatedfield_.jmcg_entitytype); fieldsToLoad.Add(calculatedFieldFieldName); fieldsToLoad.Add("createdon"); fieldsToLoad.AddRange(CalculatedService.GetDependencyFields(config, config.CalculatedFieldEntity.GetStringField(Fields.jmcg_calculatedfield_.jmcg_entitytype))); fieldsToLoad.AddRange(XrmEntity.GetFieldsInFilter(config.ApplyFilterExpression)); while (true) { if (IsSandboxIsolated && DateTime.UtcNow - startedAt > new TimeSpan(0, 0, MaxSandboxIsolationExecutionSeconds - 10)) { break; } else { var processSetQuery = new QueryExpression(calciulatedFieldEntityName); processSetQuery.ColumnSet = new ColumnSet(fieldsToLoad.Distinct().ToArray()); processSetQuery.AddOrder("createdon", OrderType.Ascending); processSetQuery.Criteria.AddCondition(new ConditionExpression("createdon", ConditionOperator.GreaterEqual, createDateThreshold)); var processSet = XrmService.RetrieveMultiple(processSetQuery).Entities.ToList(); var countThisSet = processSet.Count; if (countThisSet == 0) { isFinished = true; } else { var countProcessed = 0; ProcessWhileInSandboxLimit(startedAt, processSet.ToArray(), (entity) => { try { if (target.GetOptionSetValue(Fields.jmcg_calculatedfield_.jmcg_type) == OptionSets.CalculatedField.Type.Rollup) { var rollup = CalculatedService.CreateRollup(config); var rollupService = new CalculatedRollupService(XrmService, new [] { rollup }); rollupService.RefreshRollup(entity.Id, rollup); } else { if (XrmEntity.MeetsFilter(entity.GetField, config.ApplyFilterExpression)) { var oldValue = entity.GetField(calculatedFieldFieldName); var newValue = CalculatedService.GetNewValue(config, entity.GetField); if (!XrmEntity.FieldsEqual(oldValue, newValue)) { entity.SetField(calculatedFieldFieldName, newValue); XrmService.Update(entity, calculatedFieldFieldName); } } } createDateThreshold = entity.GetDateTimeField("createdon") ?? throw new InvalidPluginExecutionException("Error empty createdon " + entity.Id); processSet.Remove(entity); countProcessed++; } catch (Exception ex) { throw new InvalidPluginExecutionException($"Error refreshing ecountered for ID {entity.Id}. Refresh will be discontinued", ex); } }); if (countThisSet < 5000 && countProcessed == countThisSet) { isFinished = true; } } } if (isFinished) { break; } } } catch (Exception ex) { target.SetField(Fields.jmcg_calculatedfield_.jmcg_errorrecalculating, ex.XrmDisplayString().Left(10000)); target.SetField(Fields.jmcg_calculatedfield_.jmcg_lastrecalculationcreatedate, null); target.SetField(Fields.jmcg_calculatedfield_.jmcg_isrecalculating, false); XrmService.Update(target, Fields.jmcg_calculatedfield_.jmcg_errorrecalculating, Fields.jmcg_calculatedfield_.jmcg_lastrecalculationcreatedate, Fields.jmcg_calculatedfield_.jmcg_isrecalculating); throw ex; } if (isFinished) { target.SetField(Fields.jmcg_calculatedfield_.jmcg_lastrecalculationcreatedate, null); target.SetField(Fields.jmcg_calculatedfield_.jmcg_isrecalculating, false); XrmService.Update(target, Fields.jmcg_calculatedfield_.jmcg_lastrecalculationcreatedate, Fields.jmcg_calculatedfield_.jmcg_isrecalculating); } else { target.SetField(Fields.jmcg_calculatedfield_.jmcg_lastrecalculationcreatedate, createDateThreshold); XrmService.Update(target, Fields.jmcg_calculatedfield_.jmcg_lastrecalculationcreatedate); } return(isFinished); }
public override void GoExtention() { CalculatedService.ApplyCalculations(this, Configs); }
public void CalculatedServiceAddTimeTest() { var calendarId = ServiceCalendarId; //work days var wednesdayNoon1 = new DateTime(2020, 7, 29, 12, 0, 0, DateTimeKind.Unspecified); var thursdayNoon = new DateTime(2020, 7, 30, 12, 0, 0, DateTimeKind.Unspecified); var thursdayNoonUtc = LocalisationService.ConvertTargetToUtc(thursdayNoon); var fridayNoon = new DateTime(2020, 7, 31, 12, 0, 0, DateTimeKind.Unspecified); var fridayNoonUtc = LocalisationService.ConvertTargetToUtc(fridayNoon); var saturdayNoon = new DateTime(2020, 8, 1, 12, 0, 0, DateTimeKind.Unspecified); var saturdayNoonUtc = LocalisationService.ConvertTargetToUtc(saturdayNoon); var sundayNoon = new DateTime(2020, 8, 2, 12, 0, 0, DateTimeKind.Unspecified); var sundayNoonUtc = LocalisationService.ConvertTargetToUtc(sundayNoon); var mondayNoon = new DateTime(2020, 8, 3, 12, 0, 0, DateTimeKind.Unspecified); var mondayNoonUtc = LocalisationService.ConvertTargetToUtc(mondayNoon); var tuesdayNoon = new DateTime(2020, 8, 4, 12, 0, 0, DateTimeKind.Unspecified); var tuesdayNoonUtc = LocalisationService.ConvertTargetToUtc(tuesdayNoon); var wednesdayNoon2 = new DateTime(2020, 8, 5, 12, 0, 0, DateTimeKind.Unspecified); var thursdayAm = new DateTime(2020, 7, 30, 3, 0, 0, DateTimeKind.Unspecified); var thursdayAmUtc = LocalisationService.ConvertTargetToUtc(thursdayAm); var fridayAm = new DateTime(2020, 7, 31, 3, 0, 0, DateTimeKind.Unspecified); var fridayAmUtc = LocalisationService.ConvertTargetToUtc(fridayAm); var mondayAm = new DateTime(2020, 8, 3, 3, 0, 0, DateTimeKind.Unspecified); var mondayAmUtc = LocalisationService.ConvertTargetToUtc(mondayAm); var tuesdayAm = new DateTime(2020, 8, 4, 3, 0, 0, DateTimeKind.Unspecified); var tuesdayAmUtc = LocalisationService.ConvertTargetToUtc(tuesdayAm); var thursdayPm = new DateTime(2020, 7, 30, 21, 0, 0, DateTimeKind.Unspecified); var thursdayPmUtc = LocalisationService.ConvertTargetToUtc(thursdayPm); var fridayPm = new DateTime(2020, 7, 31, 21, 0, 0, DateTimeKind.Unspecified); var fridayPmUtc = LocalisationService.ConvertTargetToUtc(fridayPm); var mondayPm = new DateTime(2020, 8, 3, 21, 0, 0, DateTimeKind.Unspecified); var mondayPmUtc = LocalisationService.ConvertTargetToUtc(mondayPm); var tuesdayPm = new DateTime(2020, 8, 4, 21, 0, 0, DateTimeKind.Unspecified); var tuesdayPmUtc = LocalisationService.ConvertTargetToUtc(tuesdayPm); var wednesdayEnd = new DateTime(2020, 7, 29, 17, 0, 0, DateTimeKind.Unspecified); var thursdayStart = new DateTime(2020, 7, 30, 8, 30, 0, DateTimeKind.Unspecified); var thursdayEnd = new DateTime(2020, 7, 30, 17, 0, 0, DateTimeKind.Unspecified); var fridayStart = new DateTime(2020, 7, 31, 8, 30, 0, DateTimeKind.Unspecified); var fridayEnd = new DateTime(2020, 7, 31, 17, 0, 0, DateTimeKind.Unspecified); var fridayEndUtc = LocalisationService.ConvertTargetToUtc(fridayEnd); var mondayStart = new DateTime(2020, 8, 3, 8, 30, 0, DateTimeKind.Unspecified); var mondayStartUtc = LocalisationService.ConvertTargetToUtc(mondayStart); var mondayEnd = new DateTime(2020, 8, 3, 17, 0, 0, DateTimeKind.Unspecified); var tuesdayStart = new DateTime(2020, 8, 4, 8, 30, 0, DateTimeKind.Unspecified); var tuesdayEnd = new DateTime(2020, 8, 4, 17, 0, 0, DateTimeKind.Unspecified); var wednesdayStart = new DateTime(2020, 8, 5, 8, 30, 0, DateTimeKind.Unspecified); //basic noon to noon over weekend Assert.AreEqual(tuesdayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(fridayNoonUtc, OptionSets.CalculatedField.TimeType.WorkDays, 2, calendarId))); Assert.AreEqual(fridayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayNoonUtc, OptionSets.CalculatedField.TimeType.WorkDays, -2, calendarId))); Assert.AreEqual(mondayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayNoonUtc, OptionSets.CalculatedField.TimeType.WorkDays, 2, calendarId))); Assert.AreEqual(thursdayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(mondayNoonUtc, OptionSets.CalculatedField.TimeType.WorkDays, -2, calendarId))); Assert.AreEqual(tuesdayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayNoonUtc, OptionSets.CalculatedField.TimeType.WorkDays, 3, calendarId))); Assert.AreEqual(thursdayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayNoonUtc, OptionSets.CalculatedField.TimeType.WorkDays, -3, calendarId))); Assert.AreEqual(tuesdayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(saturdayNoonUtc, OptionSets.CalculatedField.TimeType.WorkDays, 2, calendarId))); Assert.AreEqual(wednesdayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(saturdayNoonUtc, OptionSets.CalculatedField.TimeType.WorkDays, 2, calendarId, moveLastDayEndToNextDay: true))); Assert.AreEqual(thursdayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(sundayNoonUtc, OptionSets.CalculatedField.TimeType.WorkDays, -2, calendarId))); Assert.AreEqual(wednesdayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(sundayNoonUtc, OptionSets.CalculatedField.TimeType.WorkDays, -2, calendarId, moveLastDayEndToNextDay: true))); //am to am over weekend Assert.AreEqual(mondayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(fridayAmUtc, OptionSets.CalculatedField.TimeType.WorkDays, 2, calendarId))); Assert.AreEqual(tuesdayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(fridayAmUtc, OptionSets.CalculatedField.TimeType.WorkDays, 2, calendarId, moveLastDayEndToNextDay: true))); Assert.AreEqual(fridayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayAmUtc, OptionSets.CalculatedField.TimeType.WorkDays, -2, calendarId))); Assert.AreEqual(thursdayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayAmUtc, OptionSets.CalculatedField.TimeType.WorkDays, -2, calendarId, moveLastDayEndToNextDay: true))); Assert.AreEqual(fridayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayAmUtc, OptionSets.CalculatedField.TimeType.WorkDays, 2, calendarId))); Assert.AreEqual(thursdayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(mondayAmUtc, OptionSets.CalculatedField.TimeType.WorkDays, -2, calendarId))); Assert.AreEqual(mondayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayAmUtc, OptionSets.CalculatedField.TimeType.WorkDays, 3, calendarId))); Assert.AreEqual(thursdayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayAmUtc, OptionSets.CalculatedField.TimeType.WorkDays, -3, calendarId))); //pm to pm over weekend Assert.AreEqual(tuesdayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(fridayPmUtc, OptionSets.CalculatedField.TimeType.WorkDays, 2, calendarId))); Assert.AreEqual(mondayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayPmUtc, OptionSets.CalculatedField.TimeType.WorkDays, -2, calendarId))); Assert.AreEqual(mondayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayPmUtc, OptionSets.CalculatedField.TimeType.WorkDays, 2, calendarId))); Assert.AreEqual(fridayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(mondayPmUtc, OptionSets.CalculatedField.TimeType.WorkDays, -2, calendarId))); Assert.AreEqual(tuesdayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayPmUtc, OptionSets.CalculatedField.TimeType.WorkDays, 3, calendarId))); Assert.AreEqual(fridayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayPmUtc, OptionSets.CalculatedField.TimeType.WorkDays, -3, calendarId))); //start date exclusive Assert.AreEqual(tuesdayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(fridayStart, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId, startDateExclusive: true, moveLastDayEndToNextDay: true))); Assert.AreEqual(tuesdayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(saturdayNoon, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId, startDateExclusive: true, moveLastDayEndToNextDay: true))); Assert.AreEqual(tuesdayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(sundayNoon, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId, startDateExclusive: true, moveLastDayEndToNextDay: true))); Assert.AreEqual(wednesdayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(mondayStart, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId, startDateExclusive: true, moveLastDayEndToNextDay: true))); //work hours //noon to noonish Assert.AreEqual(tuesdayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(fridayNoonUtc, OptionSets.CalculatedField.TimeType.WorkHours, 17, calendarId))); Assert.AreEqual(fridayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayNoonUtc, OptionSets.CalculatedField.TimeType.WorkHours, -17, calendarId))); Assert.AreEqual(mondayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayNoonUtc, OptionSets.CalculatedField.TimeType.WorkHours, 17, calendarId))); Assert.AreEqual(thursdayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(mondayNoonUtc, OptionSets.CalculatedField.TimeType.WorkHours, -17, calendarId))); Assert.AreEqual(tuesdayNoon.AddMinutes(30), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayNoonUtc, OptionSets.CalculatedField.TimeType.WorkHours, 26, calendarId))); Assert.AreEqual(thursdayNoon.AddMinutes(-30), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayNoonUtc, OptionSets.CalculatedField.TimeType.WorkHours, -26, calendarId))); //am Assert.AreEqual(mondayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(fridayAmUtc, OptionSets.CalculatedField.TimeType.WorkHours, 17, calendarId))); Assert.AreEqual(fridayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayAmUtc, OptionSets.CalculatedField.TimeType.WorkHours, -17, calendarId))); Assert.AreEqual(fridayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayAmUtc, OptionSets.CalculatedField.TimeType.WorkHours, 17, calendarId))); Assert.AreEqual(thursdayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(mondayAmUtc, OptionSets.CalculatedField.TimeType.WorkHours, -17, calendarId))); Assert.AreEqual(tuesdayStart.AddMinutes(30), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayAmUtc, OptionSets.CalculatedField.TimeType.WorkHours, 26, calendarId))); Assert.AreEqual(wednesdayEnd.AddMinutes(-30), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayAmUtc, OptionSets.CalculatedField.TimeType.WorkHours, -26, calendarId))); //pm Assert.AreEqual(tuesdayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(fridayPmUtc, OptionSets.CalculatedField.TimeType.WorkHours, 17, calendarId))); Assert.AreEqual(mondayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayPmUtc, OptionSets.CalculatedField.TimeType.WorkHours, -17, calendarId))); Assert.AreEqual(mondayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayPmUtc, OptionSets.CalculatedField.TimeType.WorkHours, 17, calendarId))); Assert.AreEqual(fridayStart, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(mondayPmUtc, OptionSets.CalculatedField.TimeType.WorkHours, -17, calendarId))); Assert.AreEqual(wednesdayStart.AddMinutes(30), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(thursdayPmUtc, OptionSets.CalculatedField.TimeType.WorkHours, 26, calendarId))); Assert.AreEqual(thursdayEnd.AddMinutes(-30), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(tuesdayPmUtc, OptionSets.CalculatedField.TimeType.WorkHours, -26, calendarId))); //work minutes Assert.AreEqual(mondayStart.AddMinutes(15), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(fridayEndUtc.AddMinutes(-15), OptionSets.CalculatedField.TimeType.WorkMinutes, 30, calendarId))); Assert.AreEqual(fridayEnd.AddMinutes(-15), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(mondayStartUtc.AddMinutes(15), OptionSets.CalculatedField.TimeType.WorkMinutes, -30, calendarId))); //public holidays //easter 2020 = 10/4 -> 13/4 var dayBeforeEasterNoon = new DateTime(2020, 4, 9, 12, 0, 0, DateTimeKind.Unspecified); var goodFridayNoon = dayBeforeEasterNoon.AddDays(1); var easterMondayNoon = goodFridayNoon.AddDays(3); var easterTuesdayNoon = easterMondayNoon.AddDays(1); var easterTuesdayNoonUtc = LocalisationService.ConvertTargetToUtc(easterTuesdayNoon); var easterTuesdayEnd = new DateTime(2020, 4, easterTuesdayNoon.Day, 17, 0, 0, DateTimeKind.Unspecified); var easterWednesdayNoon = easterTuesdayNoon.AddDays(1); var easterWednesdayNoonUtc = LocalisationService.ConvertTargetToUtc(easterWednesdayNoon); var easterWednesdayStart = new DateTime(2020, 4, easterWednesdayNoon.Day, 8, 30, 0, DateTimeKind.Unspecified); var easterWednesdayStartUtc = LocalisationService.ConvertTargetToUtc(easterWednesdayStart); //work days Assert.AreEqual(easterTuesdayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(dayBeforeEasterNoon, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId))); Assert.AreEqual(easterTuesdayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(goodFridayNoon, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId))); Assert.AreEqual(easterTuesdayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(easterMondayNoon, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId))); Assert.AreEqual(easterWednesdayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(easterTuesdayNoon, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId))); //work hours Assert.AreEqual(easterTuesdayNoon.AddMinutes(30), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(dayBeforeEasterNoon, OptionSets.CalculatedField.TimeType.WorkHours, 9, calendarId))); Assert.AreEqual(easterWednesdayStart.AddMinutes(30), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(goodFridayNoon, OptionSets.CalculatedField.TimeType.WorkHours, 9, calendarId))); Assert.AreEqual(easterWednesdayStart.AddMinutes(30), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(easterMondayNoon, OptionSets.CalculatedField.TimeType.WorkHours, 9, calendarId))); Assert.AreEqual(easterWednesdayNoon.AddMinutes(30), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(easterTuesdayNoon, OptionSets.CalculatedField.TimeType.WorkHours, 9, calendarId))); //work minutes Assert.AreEqual(easterTuesdayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(dayBeforeEasterNoon, OptionSets.CalculatedField.TimeType.WorkMinutes, 510, calendarId))); Assert.AreEqual(easterTuesdayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(goodFridayNoon, OptionSets.CalculatedField.TimeType.WorkMinutes, 510, calendarId))); Assert.AreEqual(easterTuesdayEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(easterMondayNoon, OptionSets.CalculatedField.TimeType.WorkMinutes, 510, calendarId))); Assert.AreEqual(easterWednesdayNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(easterTuesdayNoon, OptionSets.CalculatedField.TimeType.WorkMinutes, 510, calendarId))); //queens birthday = 8/6 var fridayBeforeQueensNoon = new DateTime(2020, 6, 5, 12, 0, 0, DateTimeKind.Unspecified); var dayBeforeQueensNoon = fridayBeforeQueensNoon.AddDays(2); var queensNoon = dayBeforeQueensNoon.AddDays(1); var dayAfterQueensNoon = queensNoon.AddDays(1); var dayAfterQueensEnd = new DateTime(queensNoon.Year, queensNoon.Month, queensNoon.Day + 1, 17, 0, 0, DateTimeKind.Unspecified); var dayAfterAfterQueensNoon = dayAfterQueensNoon.AddDays(1); Assert.AreEqual(dayAfterQueensNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(fridayBeforeQueensNoon, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId))); Assert.AreEqual(dayAfterQueensEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(dayBeforeQueensNoon, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId))); Assert.AreEqual(dayAfterQueensEnd, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(queensNoon, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId))); Assert.AreEqual(dayAfterAfterQueensNoon, LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(dayAfterQueensNoon, OptionSets.CalculatedField.TimeType.WorkDays, 1, calendarId))); //span over easter and queens birthday Assert.AreEqual(easterTuesdayNoon.AddDays(57), LocalisationService.ConvertToTargetTime(CalculatedService.AddTime(dayBeforeEasterNoon.AddDays(-28), OptionSets.CalculatedField.TimeType.WorkDays, 61, calendarId))); }
public void CalculatedServiceTimeTakenTest() { var calendarId = ServiceCalendarId; //work days var wednesdayNoon1 = new DateTime(2020, 7, 29, 12, 0, 0, DateTimeKind.Unspecified); var thursdayNoon = new DateTime(2020, 7, 30, 12, 0, 0, DateTimeKind.Unspecified); var thursdayNoonUtc = LocalisationService.ConvertTargetToUtc(thursdayNoon); var fridayNoon = new DateTime(2020, 7, 31, 12, 0, 0, DateTimeKind.Unspecified); var fridayNoonUtc = LocalisationService.ConvertTargetToUtc(fridayNoon); var saturdayNoon = new DateTime(2020, 8, 1, 12, 0, 0, DateTimeKind.Unspecified); var saturdayNoonUtc = LocalisationService.ConvertTargetToUtc(saturdayNoon); var sundayNoon = new DateTime(2020, 8, 2, 12, 0, 0, DateTimeKind.Unspecified); var sundayNoonUtc = LocalisationService.ConvertTargetToUtc(sundayNoon); var mondayNoon = new DateTime(2020, 8, 3, 12, 0, 0, DateTimeKind.Unspecified); var mondayNoonUtc = LocalisationService.ConvertTargetToUtc(mondayNoon); var tuesdayNoon = new DateTime(2020, 8, 4, 12, 0, 0, DateTimeKind.Unspecified); var tuesdayNoonUtc = LocalisationService.ConvertTargetToUtc(tuesdayNoon); var wednesdayNoon2 = new DateTime(2020, 8, 5, 12, 0, 0, DateTimeKind.Unspecified); var nextSaturdayNoon = new DateTime(2020, 8, 8, 12, 0, 0, DateTimeKind.Unspecified); var thursdayAm = new DateTime(2020, 7, 30, 3, 0, 0, DateTimeKind.Unspecified); var thursdayAmUtc = LocalisationService.ConvertTargetToUtc(thursdayAm); var fridayAm = new DateTime(2020, 7, 31, 3, 0, 0, DateTimeKind.Unspecified); var fridayAmUtc = LocalisationService.ConvertTargetToUtc(fridayAm); var mondayAm = new DateTime(2020, 8, 3, 3, 0, 0, DateTimeKind.Unspecified); var mondayAmUtc = LocalisationService.ConvertTargetToUtc(mondayAm); var tuesdayAm = new DateTime(2020, 8, 4, 3, 0, 0, DateTimeKind.Unspecified); var tuesdayAmUtc = LocalisationService.ConvertTargetToUtc(tuesdayAm); var thursdayPm = new DateTime(2020, 7, 30, 21, 0, 0, DateTimeKind.Unspecified); var thursdayPmUtc = LocalisationService.ConvertTargetToUtc(thursdayPm); var fridayPm = new DateTime(2020, 7, 31, 21, 0, 0, DateTimeKind.Unspecified); var fridayPmUtc = LocalisationService.ConvertTargetToUtc(fridayPm); var mondayPm = new DateTime(2020, 8, 3, 21, 0, 0, DateTimeKind.Unspecified); var mondayPmUtc = LocalisationService.ConvertTargetToUtc(mondayPm); var tuesdayPm = new DateTime(2020, 8, 4, 21, 0, 0, DateTimeKind.Unspecified); var tuesdayPmUtc = LocalisationService.ConvertTargetToUtc(tuesdayPm); var wednesdayEnd = new DateTime(2020, 7, 29, 17, 0, 0, DateTimeKind.Unspecified); var thursdayStart = new DateTime(2020, 7, 30, 8, 30, 0, DateTimeKind.Unspecified); var thursdayEnd = new DateTime(2020, 7, 30, 17, 0, 0, DateTimeKind.Unspecified); var fridayStart = new DateTime(2020, 7, 31, 8, 30, 0, DateTimeKind.Unspecified); var fridayEnd = new DateTime(2020, 7, 31, 17, 0, 0, DateTimeKind.Unspecified); var fridayEndUtc = LocalisationService.ConvertTargetToUtc(fridayEnd); var mondayStart = new DateTime(2020, 8, 3, 8, 30, 0, DateTimeKind.Unspecified); var mondayStartUtc = LocalisationService.ConvertTargetToUtc(mondayStart); var mondayEnd = new DateTime(2020, 8, 3, 17, 0, 0, DateTimeKind.Unspecified); var tuesdayStart = new DateTime(2020, 8, 4, 8, 30, 0, DateTimeKind.Unspecified); var tuesdayEnd = new DateTime(2020, 8, 4, 17, 0, 0, DateTimeKind.Unspecified); var wednesdayStart = new DateTime(2020, 8, 5, 8, 30, 0, DateTimeKind.Unspecified); //work days //saturday to saturday Assert.AreEqual(5, CalculatedService.GetTimeTaken(saturdayNoon, nextSaturdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); //thursday noon ++ Assert.AreEqual(0, CalculatedService.GetTimeTaken(thursdayNoon, thursdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(thursdayNoon, fridayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(thursdayNoon, saturdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(2, CalculatedService.GetTimeTaken(thursdayNoon, mondayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(3, CalculatedService.GetTimeTaken(thursdayNoon, tuesdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); //friday noon ++ Assert.AreEqual(0, CalculatedService.GetTimeTaken(fridayNoon, saturdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(fridayNoon, mondayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); //saturday noon ++ Assert.AreEqual(0, CalculatedService.GetTimeTaken(saturdayNoon, sundayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(0, CalculatedService.GetTimeTaken(saturdayNoon, mondayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(saturdayNoon, tuesdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); //thursday am ++ Assert.AreEqual(0, CalculatedService.GetTimeTaken(thursdayAm, thursdayAm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(thursdayAm, fridayAm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(thursdayAm, saturdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(2, CalculatedService.GetTimeTaken(thursdayAm, mondayAm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(3, CalculatedService.GetTimeTaken(thursdayAm, tuesdayAm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); //friday am ++ Assert.AreEqual(0, CalculatedService.GetTimeTaken(fridayAm, saturdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(fridayAm, mondayAm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); //saturday am ++ Assert.AreEqual(0, CalculatedService.GetTimeTaken(saturdayNoon, sundayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(0, CalculatedService.GetTimeTaken(saturdayNoon, mondayAm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(saturdayNoon, tuesdayAm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); //thursday pm ++ Assert.AreEqual(0, CalculatedService.GetTimeTaken(thursdayPm, thursdayPm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(thursdayPm, fridayPm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(thursdayPm, saturdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(2, CalculatedService.GetTimeTaken(thursdayPm, mondayPm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(3, CalculatedService.GetTimeTaken(thursdayPm, tuesdayPm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); //friday pm ++ Assert.AreEqual(0, CalculatedService.GetTimeTaken(fridayPm, saturdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(fridayPm, mondayPm, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, ServiceCalendarId)); //days Assert.AreEqual(0, CalculatedService.GetTimeTaken(thursdayPm, thursdayPm, OptionSets.CalculatedField.TimeTakenMeasure.Days, ServiceCalendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(thursdayPm, fridayPm, OptionSets.CalculatedField.TimeTakenMeasure.Days, ServiceCalendarId)); Assert.AreEqual(2, CalculatedService.GetTimeTaken(thursdayPm, saturdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.Days, ServiceCalendarId)); Assert.AreEqual(4, CalculatedService.GetTimeTaken(thursdayPm, mondayPm, OptionSets.CalculatedField.TimeTakenMeasure.Days, ServiceCalendarId)); Assert.AreEqual(5, CalculatedService.GetTimeTaken(thursdayPm, tuesdayPm, OptionSets.CalculatedField.TimeTakenMeasure.Days, ServiceCalendarId)); //work minutes Assert.AreEqual(30, CalculatedService.GetTimeTaken(fridayEndUtc.AddMinutes(-15), mondayStart.AddMinutes(15), OptionSets.CalculatedField.TimeTakenMeasure.WorkMinutes, calendarId)); //work hours Assert.AreEqual(1, CalculatedService.GetTimeTaken(fridayEndUtc.AddMinutes(-45), mondayStart.AddMinutes(45), OptionSets.CalculatedField.TimeTakenMeasure.WorkHours, calendarId)); //work minutes Assert.AreEqual(3840, CalculatedService.GetTimeTaken(fridayEndUtc.AddMinutes(-15), mondayStart.AddMinutes(15), OptionSets.CalculatedField.TimeTakenMeasure.Minutes, calendarId)); //work hours Assert.AreEqual(64, CalculatedService.GetTimeTaken(fridayEndUtc.AddMinutes(-30), mondayStart.AddMinutes(30), OptionSets.CalculatedField.TimeTakenMeasure.Hours, calendarId)); Assert.AreEqual(65, CalculatedService.GetTimeTaken(fridayEndUtc.AddMinutes(-45), mondayStart.AddMinutes(45), OptionSets.CalculatedField.TimeTakenMeasure.Hours, calendarId)); //public holidays //easter 2020 = 10/4 -> 13/4 var dayBeforeEasterNoon = new DateTime(2020, 4, 9, 12, 0, 0, DateTimeKind.Unspecified); var goodFridayNoon = dayBeforeEasterNoon.AddDays(1); var easterMondayNoon = goodFridayNoon.AddDays(3); var easterTuesdayNoon = easterMondayNoon.AddDays(1); var easterTuesdayNoonUtc = LocalisationService.ConvertTargetToUtc(easterTuesdayNoon); var easterTuesdayEnd = new DateTime(2020, 4, easterTuesdayNoon.Day, 17, 0, 0, DateTimeKind.Unspecified); var easterWednesdayNoon = easterTuesdayNoon.AddDays(1); var easterWednesdayNoonUtc = LocalisationService.ConvertTargetToUtc(easterWednesdayNoon); var easterWednesdayStart = new DateTime(2020, 4, easterWednesdayNoon.Day, 8, 30, 0, DateTimeKind.Unspecified); var easterWednesdayStartUtc = LocalisationService.ConvertTargetToUtc(easterWednesdayStart); //work days Assert.AreEqual(1, CalculatedService.GetTimeTaken(dayBeforeEasterNoon, easterTuesdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, calendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(goodFridayNoon, easterWednesdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, calendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(easterMondayNoon, easterWednesdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, calendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(easterTuesdayNoon, easterWednesdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, calendarId)); //work hours Assert.AreEqual(9, CalculatedService.GetTimeTaken(dayBeforeEasterNoon, easterTuesdayNoon.AddMinutes(30), OptionSets.CalculatedField.TimeTakenMeasure.WorkHours, calendarId)); Assert.AreEqual(9, CalculatedService.GetTimeTaken(goodFridayNoon, easterWednesdayStart.AddMinutes(30), OptionSets.CalculatedField.TimeTakenMeasure.WorkHours, calendarId)); Assert.AreEqual(9, CalculatedService.GetTimeTaken(easterMondayNoon, easterWednesdayStart.AddMinutes(30), OptionSets.CalculatedField.TimeTakenMeasure.WorkHours, calendarId)); Assert.AreEqual(9, CalculatedService.GetTimeTaken(easterTuesdayNoon, easterWednesdayNoon.AddMinutes(30), OptionSets.CalculatedField.TimeTakenMeasure.WorkHours, calendarId)); //work minutes Assert.AreEqual(510, CalculatedService.GetTimeTaken(dayBeforeEasterNoon, easterTuesdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkMinutes, calendarId)); Assert.AreEqual(510, CalculatedService.GetTimeTaken(goodFridayNoon, easterTuesdayEnd, OptionSets.CalculatedField.TimeTakenMeasure.WorkMinutes, calendarId)); Assert.AreEqual(510, CalculatedService.GetTimeTaken(easterMondayNoon, easterTuesdayEnd, OptionSets.CalculatedField.TimeTakenMeasure.WorkMinutes, calendarId)); Assert.AreEqual(510, CalculatedService.GetTimeTaken(easterTuesdayNoon, easterWednesdayNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkMinutes, calendarId)); //queens birthday = 8/6 var fridayBeforeQueensNoon = new DateTime(2020, 6, 5, 12, 0, 0, DateTimeKind.Unspecified); var dayBeforeQueensNoon = fridayBeforeQueensNoon.AddDays(2); var queensNoon = dayBeforeQueensNoon.AddDays(1); var dayAfterQueensNoon = queensNoon.AddDays(1); var dayAfterAfterQueensNoon = dayAfterQueensNoon.AddDays(1); Assert.AreEqual(1, CalculatedService.GetTimeTaken(fridayBeforeQueensNoon, dayAfterQueensNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, calendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(dayBeforeQueensNoon, dayAfterAfterQueensNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, calendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(queensNoon, dayAfterAfterQueensNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, calendarId)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(dayAfterQueensNoon, dayAfterAfterQueensNoon, OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, calendarId)); //span over easter and queens birthday Assert.AreEqual(61, CalculatedService.GetTimeTaken(dayBeforeEasterNoon.AddDays(-28), easterTuesdayNoon.AddDays(57), OptionSets.CalculatedField.TimeTakenMeasure.WorkDays, calendarId)); //weeks Assert.AreEqual(0, CalculatedService.GetTimeTaken(LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(0, CalculatedService.GetTimeTaken(LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 21, 0, 0, 0, DateTimeKind.Unspecified)), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 22, 0, 0, 0, DateTimeKind.Unspecified)), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 29, 0, 0, 0, DateTimeKind.Unspecified).AddSeconds(-1)), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(2, CalculatedService.GetTimeTaken(LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 29, 0, 0, 0, DateTimeKind.Unspecified)), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(0, CalculatedService.GetTimeTaken(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(0, CalculatedService.GetTimeTaken(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1980, 11, 21, 0, 0, 0, DateTimeKind.Unspecified), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1980, 11, 22, 0, 0, 0, DateTimeKind.Unspecified), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1980, 11, 29, 0, 0, 0, DateTimeKind.Unspecified).AddSeconds(-1), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(2, CalculatedService.GetTimeTaken(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1980, 11, 29, 0, 0, 0, DateTimeKind.Unspecified), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); //years Assert.AreEqual(0, CalculatedService.GetTimeTaken(LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), OptionSets.CalculatedField.TimeTakenMeasure.Years, null)); Assert.AreEqual(0, CalculatedService.GetTimeTaken(LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), LocalisationService.ConvertTargetToUtc(new DateTime(1981, 11, 14, 0, 0, 0, DateTimeKind.Unspecified)), OptionSets.CalculatedField.TimeTakenMeasure.Years, null)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), LocalisationService.ConvertTargetToUtc(new DateTime(1981, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), OptionSets.CalculatedField.TimeTakenMeasure.Years, null)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), LocalisationService.ConvertTargetToUtc(new DateTime(1982, 11, 15, 0, 0, 0, DateTimeKind.Unspecified).AddSeconds(-1)), OptionSets.CalculatedField.TimeTakenMeasure.Years, null)); Assert.AreEqual(2, CalculatedService.GetTimeTaken(LocalisationService.ConvertTargetToUtc(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), LocalisationService.ConvertTargetToUtc(new DateTime(1982, 11, 15, 0, 0, 0, DateTimeKind.Unspecified)), OptionSets.CalculatedField.TimeTakenMeasure.Years, null)); Assert.AreEqual(0, CalculatedService.GetTimeTaken(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(0, CalculatedService.GetTimeTaken(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1980, 11, 21, 0, 0, 0, DateTimeKind.Unspecified), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1980, 11, 22, 0, 0, 0, DateTimeKind.Unspecified), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(1, CalculatedService.GetTimeTaken(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1980, 11, 29, 0, 0, 0, DateTimeKind.Unspecified).AddSeconds(-1), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); Assert.AreEqual(2, CalculatedService.GetTimeTaken(new DateTime(1980, 11, 15, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1980, 11, 29, 0, 0, 0, DateTimeKind.Unspecified), OptionSets.CalculatedField.TimeTakenMeasure.Weeks, null)); }