protected void FindTimes_Click(object sender, EventArgs args) { var startTimeInMinutesFromMidnight = int.Parse(StartTime.SelectedValue); var startDate = StartDate.SelectedDate.AddMinutes(startTimeInMinutesFromMidnight); var endTimeInMinutesFromMidnight = int.Parse(EndTime.SelectedValue); var endDate = EndDate.SelectedDate.AddMinutes(endTimeInMinutesFromMidnight); if (!SelectedDatesAndTimesAreValid(startDate, endDate, startTimeInMinutesFromMidnight, endTimeInMinutesFromMidnight)) { return; } // Add the timezone selected to the CRM Contact for next time. var contact = XrmContext.CreateQuery("contact").FirstOrDefault(c => c.GetAttributeValue <Guid>("contactid") == Contact.Id); if (contact == null) { throw new ApplicationException(string.Format("Could not find user contact where contactid equals '{0}'", Contact.Id)); } contact.SetAttributeValue("adx_timezone", int.Parse(TimeZoneSelection.SelectedValue)); XrmContext.UpdateObject(contact); XrmContext.SaveChanges(); var usersMinutesFromGmt = GetUsersMinutesFromGmt(contact.GetAttributeValue <int?>("adx_timezone"), XrmContext); var appointmentRequest = new AppointmentRequest { AnchorOffset = Service.GetAttributeValue <int?>("anchoroffset").GetValueOrDefault(), Direction = SearchDirection.Forward, Duration = Service.GetAttributeValue <int?>("duration").GetValueOrDefault(60), NumberOfResults = 10, RecurrenceDuration = endTimeInMinutesFromMidnight - startTimeInMinutesFromMidnight, RecurrenceTimeZoneCode = contact.GetAttributeValue <int?>("adx_timezone").GetValueOrDefault(), SearchRecurrenceRule = "FREQ=DAILY;INTERVAL=1", SearchRecurrenceStart = new DateTime(startDate.AddMinutes(usersMinutesFromGmt * -1).Ticks, DateTimeKind.Utc), SearchWindowEnd = new DateTime(endDate.AddMinutes(usersMinutesFromGmt * -1).Ticks, DateTimeKind.Utc), ServiceId = Service.GetAttributeValue <Guid>("serviceid") }; var service = XrmContext; var searchRequest = new OrganizationRequest("Search"); searchRequest.Parameters["AppointmentRequest"] = appointmentRequest; var searchResults = (SearchResults)service.Execute(searchRequest).Results["SearchResults"]; var schedules = searchResults.Proposals.Select(proposal => new { ScheduledStart = proposal.Start.GetValueOrDefault().ToUniversalTime().AddMinutes(usersMinutesFromGmt), ScheduledStartUniversalTime = proposal.Start.GetValueOrDefault().ToUniversalTime(), ScheduledEnd = proposal.End.GetValueOrDefault().ToUniversalTime().AddMinutes(usersMinutesFromGmt), ScheduledEndUniversalTime = proposal.End.GetValueOrDefault().ToUniversalTime(), AvailableResource = proposal.ProposalParties.First().ResourceId }).Where(proposal => proposal.ScheduledStartUniversalTime >= DateTime.UtcNow); if (!schedules.Any()) { SearchPanel.Visible = true; NoTimesMessage.Visible = true; ResultsDisplay.Visible = false; return; } AvailableTimes.DataSource = schedules; AvailableTimes.DataBind(); SearchPanel.Visible = false; ResultsDisplay.Visible = true; ScheduleServiceButton.Enabled = false; }
protected void FindTimes_Click(object sender, EventArgs args) { var startTimeInMinutesFromMidnight = int.Parse(StartTime.SelectedValue); var startDate = StartDate.SelectedDate.AddMinutes(startTimeInMinutesFromMidnight); var endTimeInMinutesFromMidnight = int.Parse(EndTime.SelectedValue); var endDate = EndDate.SelectedDate.AddMinutes(endTimeInMinutesFromMidnight); if (!SelectedDatesAndTimesAreValid(startDate, endDate, startTimeInMinutesFromMidnight, endTimeInMinutesFromMidnight)) { return; } // Add the timezone selected to the CRM Contact for next time. var contact = XrmContext.ContactSet.FirstOrDefault(c => c.ContactId == Contact.Id); contact.Adx_TimeZone = int.Parse(TimeZoneSelection.SelectedValue); XrmContext.UpdateObject(contact); XrmContext.SaveChanges(); var usersMinutesFromGmt = GetUsersMinutesFromGmt(contact.Adx_TimeZone, XrmContext); var appointmentRequest = new AppointmentRequest { AnchorOffset = Service.AnchorOffset.GetValueOrDefault(), Direction = SearchDirection.Forward, Duration = Service.Duration.GetValueOrDefault(60), NumberOfResults = 10, RecurrenceDuration = endTimeInMinutesFromMidnight - startTimeInMinutesFromMidnight, RecurrenceTimeZoneCode = contact.Adx_TimeZone.GetValueOrDefault(), SearchRecurrenceRule = "FREQ=DAILY;INTERVAL=1", SearchRecurrenceStart = new DateTime(startDate.AddMinutes(usersMinutesFromGmt * -1).Ticks, DateTimeKind.Utc), SearchWindowEnd = new DateTime(endDate.AddMinutes(usersMinutesFromGmt * -1).Ticks, DateTimeKind.Utc), ServiceId = Service.ServiceId.GetValueOrDefault() }; var service = XrmContext; var searchRequest = new OrganizationRequest("Search"); searchRequest.Parameters["AppointmentRequest"] = appointmentRequest; var searchResults = (SearchResults)service.Execute(searchRequest).Results["SearchResults"]; var schedules = searchResults.Proposals.Select(proposal => new { ScheduledStart = proposal.Start.GetValueOrDefault().ToUniversalTime().AddMinutes(usersMinutesFromGmt), ScheduledStartUniversalTime = proposal.Start.GetValueOrDefault().ToUniversalTime(), ScheduledEnd = proposal.End.GetValueOrDefault().ToUniversalTime().AddMinutes(usersMinutesFromGmt), ScheduledEndUniversalTime = proposal.End.GetValueOrDefault().ToUniversalTime(), AvailableResource = proposal.ProposalParties.First().ResourceId }); AvailableTimes.DataSource = schedules; AvailableTimes.DataBind(); SearchPanel.Visible = false; ResultsDisplay.Visible = true; ScheduleServiceButton.Enabled = false; }