private void UpdateStaffEventSchedule(IEnumerable <StaffEventScheduleParsedDataViewModel> parsedRecords, long fileUploader, IEnumerable <StaffEventRole> staffEventRoles, IEnumerable <Pod> pods, List <StaffEventScheduleUploadLog> staffEventScheduleUploadLogCollection) { var eventDatePodPair = parsedRecords.GroupBy(x => new { x.EventDate, x.Pod }).Select(x => new OrderedPair <DateTime, string>() { FirstValue = x.Key.EventDate, SecondValue = x.Key.Pod }).ToArray(); foreach (var eventDatePod in eventDatePodPair) { try { var events = _eventRepository.GetEventByEventDateAndPod(eventDatePod.FirstValue, eventDatePod.SecondValue); if (!events.IsNullOrEmpty()) { var recordsForEventId = parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue).Select(x => x); var employeeIds = recordsForEventId.Select(x => x.EmployeeId.ToUpper()).ToList(); var employeeIdOruPair = _organizationRoleUserRepository.GetActiveOruIdEmployeeIdPairByEmployeeIdAndRole(employeeIds, (long)Roles.Technician); foreach (var @event in events) { var validRecords = new List <StaffEventScheduleParsedDataViewModel>(); var eventId = @event.Id; try { var eventPods = _eventPodRepository.GetByEventId(eventId); if (eventPods.IsNullOrEmpty()) { _logger.Info("No Event Pod found for EventId:" + eventId); parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue).ForEach(x => { x.IsSuccess = false; x.ErrorMessage = "No pod Exist for this EventId"; }); continue; } var podNamesInCsvForEvent = parsedRecords.Select(x => x.Pod); var validPodsForEventFromCsv = pods.Where(x => podNamesInCsvForEvent.Contains(x.Name) && eventPods.First().PodId == x.Id); if (validPodsForEventFromCsv.IsNullOrEmpty()) { _logger.Info("No valid Pod provided for EventId:" + eventId); parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue).ForEach(x => { x.IsSuccess = false; x.ErrorMessage = "Pod not attached to this Event"; }); continue; } var selectedPodId = validPodsForEventFromCsv.First().Id; var selectedPod = pods.First(x => x.Id == selectedPodId); foreach (var record in recordsForEventId) { var staff = employeeIdOruPair.FirstOrDefault(x => x.SecondValue.Trim().ToUpper() == record.EmployeeId.ToUpper()); if (staff == null) { parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue && x.EmployeeId == record.EmployeeId && x.Name == record.Name && x.Role == record.Role) .ForEach(x => { x.IsSuccess = false; x.ErrorMessage = "Provided Employee Id does not exist"; }); continue; } var role = staffEventRoles.FirstOrDefault(x => string.Compare(x.Name.Trim(), record.Role, StringComparison.InvariantCultureIgnoreCase) == 0); if (role == null) { parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue && x.EmployeeId == record.EmployeeId && x.Name == record.Name && x.Role == record.Role) .ForEach(x => { x.IsSuccess = false; x.ErrorMessage = "Provided role does not exist or Inactive"; }); continue; } var pod = pods.FirstOrDefault(x => x.Name.Trim().ToUpper() == record.Pod.ToUpper()); if (pod == null) { parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue && x.EmployeeId == record.EmployeeId && x.Name == record.Name && x.Role == record.Role) .ForEach(x => { x.IsSuccess = false; x.ErrorMessage = "Provided pod does not exist"; }); continue; } if (pod.Id != selectedPodId && eventPods.Select(x => x.PodId).Contains(pod.Id)) { parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue && x.EmployeeId == record.EmployeeId && x.Name == record.Name && x.Role == record.Role) .ForEach(x => { x.IsSuccess = false; x.ErrorMessage = "Record Discarded for :" + record.Pod.ToUpper() + ", Successfully attached :" + selectedPod.Name.ToUpper(); }); continue; } if (record.EventDate != @event.EventDate) { parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue && x.EmployeeId == record.EmployeeId && x.Name == record.Name && x.Role == record.Role) .ForEach(x => { x.IsSuccess = false; x.ErrorMessage = "Provided event date doesn't match with the eventId"; }); continue; } parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue && x.EmployeeId == record.EmployeeId && x.Name == record.Name && x.Role == record.Role) .ForEach(x => { x.IsSuccess = true; }); staffEventScheduleUploadLogCollection.Add(new StaffEventScheduleUploadLog { ErrorMessage = null, EventDate = record.EventDate.ToString("MM/dd/yyyy"), IsSuccessful = true, Pod = record.Pod, Role = record.Role, EmployeeId = record.EmployeeId.ToString(), StaffName = record.Name }); validRecords.Add(record); } if (!validRecords.IsNullOrEmpty()) { //parsed records eventStaffBasicInfoModelCollection var eventStaffBasicInfoModelCollection = GetEventStaffModel(validRecords, staffEventRoles, selectedPodId, employeeIdOruPair).ToList(); //Appending records from DB to our parsed records var alreadyAssignedStaffForEvent = (IReadOnlyCollection <EventStaffAssignment>)_eventStaffAssignmentRepository.GetForEvent(eventId); if (alreadyAssignedStaffForEvent.Any()) { eventStaffBasicInfoModelCollection.AddRange(MapEventStaffAssignmentToEventBasicInfoModel(alreadyAssignedStaffForEvent, selectedPodId)); } //now filtering only unique combination of ScheduledStaffOrgRoleUserId and EventRoleId //because one Staff can be assigned some role only once var uniqueEntriesInEventStaffBasicInfoModel = new List <EventStaffBasicInfoModel>(); foreach (var eventStaffBasicInfoModel in eventStaffBasicInfoModelCollection) { var data = eventStaffBasicInfoModel; if (uniqueEntriesInEventStaffBasicInfoModel.FirstOrDefault( x => x.ScheduledStaffOrgRoleUserId == eventStaffBasicInfoModel.ScheduledStaffOrgRoleUserId && x.EventRoleId == eventStaffBasicInfoModel.EventRoleId) == null) { uniqueEntriesInEventStaffBasicInfoModel.Add(data); } } _eventStaffAssignmentService.Save(@event.Id, selectedPodId, fileUploader, uniqueEntriesInEventStaffBasicInfoModel); } } catch (Exception ex) { _logger.Info("Exception Occurred while saving staff Assignment for EventId:" + eventId + "\nMarking all Records as Failed"); parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue) .ForEach(x => { x.IsSuccess = false; x.ErrorMessage = "Internal Error Occured"; }); _logger.Error("ExceptionMessage: " + ex.Message + "\n\tStackTrace: " + ex.StackTrace); continue; } } } else { parsedRecords.Where(x => x.EventDate == eventDatePod.FirstValue && x.Pod == eventDatePod.SecondValue) .ForEach(x => { x.IsSuccess = false; x.ErrorMessage = "Event Date and Pod pair does not exist"; }); continue; } } catch (Exception ex) { _logger.Error("ExceptionMessage: " + ex.Message + "\n\tStackTrace: " + ex.StackTrace); } } }