public KeyValuePair <long, bool> UpdateSchedule(user_schedule model, bool isAllDay) { model.uss_time_from = ParseScheduleTime(model.uss_time_from_calc.Value.ToString("HH:mm")); model.uss_time_to = ParseScheduleTime(model.uss_time_to_calc.Value.ToString("HH:mm")); if (model.uss_time_to_calc.Value.TimeOfDay < model.uss_time_from_calc.Value.TimeOfDay) { model.uss_time_to_calc = model.uss_date.AddDays(1).Date.Add(model.uss_time_to_calc.Value.TimeOfDay); model.uss_time_to = model.uss_time_to + TimeSpan.TicksPerDay; } else if (model.uss_time_to_calc.Value.TimeOfDay > model.uss_time_from_calc.Value.TimeOfDay && isAllDay) { // Set the same date in both field model.uss_time_to_calc = new DateTime(model.uss_time_from_calc.Value.Year, model.uss_time_from_calc.Value.Month, model.uss_time_from_calc.Value.Day, model.uss_time_to_calc.Value.Hour, model.uss_time_to_calc.Value.Minute, model.uss_time_to_calc.Value.Second, model.uss_time_to_calc.Value.Millisecond); } else if (model.uss_time_to_calc.Value.Date > model.uss_time_from_calc.Value.Date) { model.uss_time_to = model.uss_time_to + TimeSpan.TicksPerDay; } model.uss_time_to_calc_num = Convert.ToInt64(model.uss_time_to_calc.Value.Year.ToString() + model.uss_time_to_calc.Value.DayOfYear.ToString("000") + model.uss_time_to_calc.Value.TimeOfDay.ToString().Replace(":", "").Substring(0, 4).Trim()); var existingSchdule = _unitOfWork.ScheduleRepository.Query() .Where(m => m.uss_time_from_calc < model.uss_time_to_calc && model.uss_time_from_calc < m.uss_time_to_calc && m.uss_user_id == model.uss_user_id && m.uss_key != model.uss_key) .ToList(); if (existingSchdule != null && existingSchdule.Count > 0) { return(new KeyValuePair <long, bool>(0, false)); } _unitOfWork.ScheduleRepository.Update(model); _unitOfWork.Save(); _unitOfWork.Commit(); return(new KeyValuePair <long, bool>(model.uss_key, true)); }
private SchedulerResponseViewModel ImportSchedule(DataTable tableSchedules, string loggedinUserId, string loggedinUserName, bool SkipErrors, string impType) { var listColumns = new List <string>(); SchedulerResponseViewModel response = new SchedulerResponseViewModel(); // generate columns list foreach (DataColumn col in tableSchedules.Columns) { if (!listColumns.Contains(col.ColumnName) && col.ColumnName.ToLower() != "date") { listColumns.Add(col.ColumnName); } } // if there are column to import if (listColumns.Count() == 0) { return(response); } // get user's info based on initials in CSV var listUsers = _unitOfWork.ApplicationUsers .Where(x => listColumns.Contains(x.UserInitial)) .Select(x => new { x.UserInitial, x.Id, x.FirstName, x.LastName, x.IsStrokeAlert, x.NHAlert, x.AspNetUserRoles.Where(y => y.UserId == y.AspNetUser.Id).FirstOrDefault().AspNetRole.Name }) .ToList(); var distinctScheduleUserIds = listUsers.Select(x => x.Id).ToList(); // temp schedules var listSchedule = new List <user_schedule>(); var currentTime = DateTime.Now.ToEST(); // process all columns int rowCount = 2; // first row is header that's why initializing it from 2 int colCount = 1; foreach (DataRow row in tableSchedules.Rows) { colCount = 1; DateTime schDate = new DateTime(); bool hasValidDate = true; if (string.IsNullOrEmpty(row["Date"].ToString())) { continue; } try { schDate = Convert.ToDateTime(row["Date"]); } catch { hasValidDate = false; } if (hasValidDate) { foreach (string currentColumn in listColumns) { string columnData = Convert.ToString(row[currentColumn]); if (!string.IsNullOrEmpty(currentColumn) && !string.IsNullOrEmpty(columnData)) { var splitShift = columnData.Split('|'); foreach (string schItem in splitShift) { string[] times = null; string userId = null; try { try { if (!string.IsNullOrEmpty(schItem.Trim())) { times = schItem.Trim().Split('-').Where(m => !string.IsNullOrEmpty(m)).ToArray(); } } catch { response.ParseErrors.Add($"Invalid Time {schItem} on Row {rowCount} and Column {colCount}"); } if (userId == null) { try { userId = listUsers.Where(x => x.UserInitial.ToLower() == currentColumn.ToLower()).FirstOrDefault()?.Id; } catch { response.ParseErrors.Add($"Invalid Initial {currentColumn} on Row {rowCount} and Column {colCount}"); } } if (userId != null && times != null) { if (times.Length == 2) { var schEntry = new user_schedule { uss_date = schDate, uss_user_id = userId, uss_time_from = ParseScheduleTime(times[0]), //TimeSpan.Parse(times[0]).Ticks, uss_time_to = ParseScheduleTime(times[1]), //TimeSpan.Parse(times[1]).Ticks, uss_is_active = true, uss_created_by = loggedinUserId, uss_created_by_name = loggedinUserName, uss_created_date = currentTime, uss_is_publish = (listUsers.Where(x => x.UserInitial.ToLower() == currentColumn.ToLower()).FirstOrDefault().Name == "AOC") ? true : (listUsers.Where(x => x.UserInitial.ToLower() == currentColumn.ToLower()).FirstOrDefault().NHAlert) ? true : impType == "aoc" ? true : false }; // next day's time check if (schEntry.uss_time_to < schEntry.uss_time_from) { schEntry.uss_time_to = schEntry.uss_time_to + TimeSpan.TicksPerDay; } schEntry.uss_time_from_calc = schEntry.uss_date.Date.AddTicks(schEntry.uss_time_from); schEntry.uss_time_to_calc = schEntry.uss_date.Date.AddTicks(schEntry.uss_time_to); DateTime TimeFrom = schEntry.uss_date.Date.AddTicks(schEntry.uss_time_from); DateTime TimeTo = schEntry.uss_date.Date.AddTicks(schEntry.uss_time_to); schEntry.uss_date_num = Convert.ToInt64(schDate.Year.ToString() + schDate.DayOfYear.ToString("000")); schEntry.uss_time_from_calc_num = Convert.ToInt64(TimeFrom.Year.ToString() + TimeFrom.DayOfYear.ToString("000") + TimeFrom.TimeOfDay.ToString().Replace(":", "").Substring(0, 4).Trim()); schEntry.uss_time_to_calc_num = Convert.ToInt64(TimeTo.Year.ToString() + TimeTo.DayOfYear.ToString("000") + TimeTo.TimeOfDay.ToString().Replace(":", "").Substring(0, 4).Trim()); listSchedule.Add(schEntry); } else { response.ParseErrors.Add($"Invalid Time {schItem} on Row {rowCount} and Column {colCount}"); response.Success = false; } } } catch { response.ParseErrors.Add($"Parse Data issue on Row {rowCount} and Column {colCount}"); } } } colCount++; } } else { response.Success = false; response.ParseErrors.Add($"Invalid Date {row["Date"].ToString()} on Row {rowCount} and Column {colCount}"); } rowCount++; } if (listSchedule != null && listSchedule.Count() > 0 && response.Success || (listSchedule != null && listSchedule.Count() > 0 && SkipErrors)) { try { var distinctDates = listSchedule.Select(x => x.uss_date).Distinct().ToList(); var oldEntries = _unitOfWork.ScheduleRepository.Query().Where(x => distinctDates.Any(y => y == x.uss_date)).ToList(); #region Get Only Required Physician PhysicianDictionary physicianDictionary = new PhysicianDictionary(); var ids = physicianDictionary.GetRecordAsList(impType); var foundIds = _adminService.GetAllUsersIds(ids); HashSet <string> resIds = new HashSet <string>(oldEntries.Select(s => s.uss_user_id.ToString())); var matchIds = resIds.Intersect(foundIds).ToList(); //var _oldEntries = oldEntries.Where(x => matchIds.Contains(x.uss_user_id)).ToList(); var _oldEntries = oldEntries.Where(x => matchIds.Contains(x.uss_user_id)).Where(x => distinctScheduleUserIds.Contains(x.uss_user_id)).ToList(); #endregion _unitOfWork.BeginTransaction(); // remove old entries if (_oldEntries != null && _oldEntries.Count() > 0) { _unitOfWork.ScheduleRepository.DeleteRange(_oldEntries); _unitOfWork.Save(); } // add schedule entries if (listSchedule.Count() > 0) { _unitOfWork.ScheduleRepository.InsertRange(listSchedule); _unitOfWork.Save(); } _unitOfWork.Commit(); //return new SchedulerResponseViewModel { Message = "Schedule is updated.", Success = true }; return(new SchedulerResponseViewModel { Message = impType == "aoc" ? "Schedule saved." : (listSchedule.Any(x => x.uss_is_publish == false)) ? "Schedule saved. Publish from Schedule page." : "Schedule saved.", Success = true }); } catch (Exception ex) { try { _unitOfWork.Rollback(); } catch { throw ex; } } finally { listSchedule = null; } } return(response); }