public ActionResult Edit(VacationRecord vacationRecord) { var currentUser = _userService.GetUserDataForVersion(); var currentUserEmployee = _userService.GetEmployeeForCurrentUser(); var tsHoursRecordByVacationList = _tsHoursRecordService.Get(x => x.Where(t => t.ParentVacationRecordID == vacationRecord.ID).ToList()); var originalItem = _vacationRecordService.Get(records => records.Where(x => x.ID == vacationRecord.ID).AsNoTracking().ToList()).FirstOrDefault(); if (vacationRecord.VacationBeginDate > vacationRecord.VacationEndDate) { ModelState.AddModelError("VacationBeginDate", "Дата начала не может быть больше даты конца."); } var reportingPeriodForBeginDate = _reportingPeriodService.GetAll(x => x.Month == vacationRecord.VacationBeginDate.Month && x.Year == vacationRecord.VacationBeginDate.Year).FirstOrDefault(); var reportingPeriodForEndDate = _reportingPeriodService.GetAll(x => x.Month == vacationRecord.VacationEndDate.Month && x.Year == vacationRecord.VacationEndDate.Year).FirstOrDefault(); //дату начала отпуска в закрытый перод менить нельзя if (reportingPeriodForBeginDate != null && reportingPeriodForBeginDate.NewTSRecordsAllowedUntilDate < DateTime.Now && originalItem.VacationBeginDate != vacationRecord.VacationBeginDate) { ModelState.AddModelError("VacationBeginDate", "Дату начала отпуска нельзя изменить, так как отчетный период закрыт."); } //дату окончания отпуска в закрытый перод менить нельзя if (reportingPeriodForEndDate != null && reportingPeriodForEndDate.NewTSRecordsAllowedUntilDate < DateTime.Now && originalItem.VacationEndDate != vacationRecord.VacationEndDate) { ModelState.AddModelError("VacationEndDate", "Дату окончания отпуска нельзя изменить, так как отчетный период закрыт."); } //невозможно изменить вид отпуска если запись в таймшите уже есть if (tsHoursRecordByVacationList != null && tsHoursRecordByVacationList.Count() != 0 && originalItem.VacationType != vacationRecord.VacationType) { ModelState.AddModelError("VacationType", "Невозможно изменить вид отпуска, так как созданы связанные записи ТШ."); } if (ModelState.IsValid) { _vacationRecordService.Update(vacationRecord); //TODO добавить //_taskTimesheetProcessing.ProcessVacationRecords(currentEmployee, vacationRecord); return(RedirectToAction("Index")); } SetViewBag(vacationRecord); ViewBag.EmployeeID = new SelectList(_employeeService.Get(x => x.Where(e => e.ID == originalItem.EmployeeID).ToList()), "ID", "FullName", originalItem?.EmployeeID ?? 1); return(View(vacationRecord)); }
private DataTable GetTSHoursUtilizationReportDataTable(DataTable dataTable, DateTime periodStart, DateTime periodEnd, List <int> departmentsIDs) { List <Employee> currentEmployeeList = _employeeService.GetCurrentEmployees(new DateTimeRange(periodStart, periodEnd)).ToList() .Where(e => e.Department != null) .OrderBy(e => e.Department.ShortName + (e.Department.DepartmentManagerID != e.ID).ToString() + e.FullName).ToList(); var tsHoursRecordForPeriodList = _tsHoursRecordService.Get(x => x.Where(r => r.RecordDate >= periodStart && r.RecordDate <= periodEnd && r.Project != null && r.Project.ProjectType != null).ToList()); int periodRowStartIndex = dataTable.Rows.Count; var projectTypeUtilizationList = _projectTypeService.Get(x => x.Where(pt => pt.Utilization == true).ToList()); var projectTypeNonUtilizationList = _projectTypeService.Get(x => x.Where(pt => pt.Utilization == false).ToList()); dataTable.Rows.Add(periodStart.ToString("MMMM").ToUpper()); dataTable.Rows[dataTable.Rows.Count - 1]["_ISGROUPROW_"] = true; double hoursPeriodTotal = 0; if (departmentsIDs != null) { foreach (int depID in departmentsIDs) { var employeeInDepartmentIDs = GetEmployeesByDepartmentID(depID, currentEmployeeList.ToList()).Select(e => e.ID); double hoursPeriodInDepartment = Math.Round(tsHoursRecordForPeriodList.Where(r => r.EmployeeID != null && employeeInDepartmentIDs.Contains(r.EmployeeID.Value)) .ToList() .Select(c => c.Hours ?? 0) .DefaultIfEmpty() .Sum(h => h), 2); dataTable.Rows[periodRowStartIndex]["Department_" + depID.ToString()] = hoursPeriodInDepartment; hoursPeriodTotal += hoursPeriodInDepartment; } } dataTable.Rows[periodRowStartIndex]["Total"] = hoursPeriodTotal; periodRowStartIndex = dataTable.Rows.Count - 1; foreach (var group in projectTypeUtilizationList.GroupBy(pt => pt.ActivityType)) { dataTable.Rows.Add("-" + group.FirstOrDefault().ActivityType.GetAttributeOfType <DisplayAttribute>().Name); dataTable.Rows[dataTable.Rows.Count - 1]["_ISGROUPROW_"] = false; foreach (var projectType in group.OrderBy(pt => pt.ShortName)) { dataTable.Rows.Add("--" + projectType.Title); dataTable.Rows[dataTable.Rows.Count - 1]["_ISGROUPROW_"] = false; } } dataTable.Rows.Add("ИТОГО Утилизировано"); dataTable.Rows[dataTable.Rows.Count - 1]["_ISGROUPROW_"] = true; int utilizationRowNum = dataTable.Rows.Count - 1; dataTable = FillDataTableHoursForProjectTypes(dataTable, departmentsIDs, currentEmployeeList, tsHoursRecordForPeriodList, projectTypeUtilizationList, periodRowStartIndex); periodRowStartIndex = dataTable.Rows.Count - 1; foreach (var group in projectTypeNonUtilizationList.GroupBy(pt => pt.ActivityType)) { dataTable.Rows.Add("-" + group.FirstOrDefault().ActivityType.GetAttributeOfType <DisplayAttribute>().Name); dataTable.Rows[dataTable.Rows.Count - 1]["_ISGROUPROW_"] = false; foreach (var projectType in group.OrderBy(pt => pt.ShortName)) { dataTable.Rows.Add("--" + projectType.Title); dataTable.Rows[dataTable.Rows.Count - 1]["_ISGROUPROW_"] = false; } } dataTable.Rows.Add("ИТОГО Не улитизировано"); dataTable.Rows[dataTable.Rows.Count - 1]["_ISGROUPROW_"] = true; int nonUtilizationRowNum = dataTable.Rows.Count - 1; dataTable = FillDataTableHoursForProjectTypes(dataTable, departmentsIDs, currentEmployeeList, tsHoursRecordForPeriodList, projectTypeNonUtilizationList, periodRowStartIndex); dataTable.Rows.Add("ИТОГО Утилизация"); dataTable.Rows[dataTable.Rows.Count - 1]["_ISGROUPROW_"] = true; if (departmentsIDs != null) { foreach (int depID in departmentsIDs) { double hoursUtilization = 0; double hoursNonUtilization = 0; if (dataTable.Rows[utilizationRowNum]["Department_" + depID.ToString()] != null || String.IsNullOrEmpty(dataTable.Rows[utilizationRowNum]["Department_" + depID.ToString()].ToString()) == false) { hoursUtilization = (double)dataTable.Rows[utilizationRowNum]["Department_" + depID.ToString()]; } if (dataTable.Rows[nonUtilizationRowNum]["Department_" + depID.ToString()] != null || String.IsNullOrEmpty(dataTable.Rows[nonUtilizationRowNum]["Department_" + depID.ToString()].ToString()) == false) { hoursNonUtilization = (double)dataTable.Rows[nonUtilizationRowNum]["Department_" + depID.ToString()]; } if ((hoursUtilization + hoursNonUtilization) != 0) { dataTable.Rows[dataTable.Rows.Count - 1]["Department_" + depID.ToString()] = Math.Round(hoursUtilization / (hoursUtilization + hoursNonUtilization), 2); } } } double hoursUtilizationTotal = 0; double hoursNonUtilizationTotal = 0; if (dataTable.Rows[utilizationRowNum]["Total"] != null || String.IsNullOrEmpty(dataTable.Rows[utilizationRowNum]["Total"].ToString()) == false) { hoursUtilizationTotal = (double)dataTable.Rows[utilizationRowNum]["Total"]; } if (dataTable.Rows[nonUtilizationRowNum]["Total"] != null || String.IsNullOrEmpty(dataTable.Rows[nonUtilizationRowNum]["Total"].ToString()) == false) { hoursNonUtilizationTotal = (double)dataTable.Rows[nonUtilizationRowNum]["Total"]; } if ((hoursUtilizationTotal + hoursNonUtilizationTotal) != 0) { dataTable.Rows[dataTable.Rows.Count - 1]["Total"] = Math.Round(hoursUtilizationTotal / (hoursUtilizationTotal + hoursNonUtilizationTotal), 2); } dataTable.Rows.Add(""); return(dataTable); }
public ActionResult DeleteConfirmed(int id) { var tsAutoHoursRecord = _tsAutoHoursRecordService.GetById(id); var user = _userService.GetUserDataForVersion(); var isDeleted = true; var errorOnParentTSHoursRecord = string.Empty; var errorOnTSAutoHoursRecord = string.Empty; if (tsAutoHoursRecord != null) { var reportingPeriodForBeginDate = _reportingPeriodService.GetAll(x => x.Month == tsAutoHoursRecord.BeginDate.Value.Month && x.Year == tsAutoHoursRecord.BeginDate.Value.Year).FirstOrDefault(); var reportingPeriodForEndDate = _reportingPeriodService.GetAll(x => x.Month == tsAutoHoursRecord.EndDate.Value.Month && x.Year == tsAutoHoursRecord.EndDate.Value.Year).FirstOrDefault(); if (reportingPeriodForBeginDate != null && reportingPeriodForEndDate != null && (reportingPeriodForEndDate.NewTSRecordsAllowedUntilDate > DateTime.Now && reportingPeriodForBeginDate.NewTSRecordsAllowedUntilDate > DateTime.Now)) { var parentHoursRecords = _tsHoursRecordService.Get(x => x.Where(t => t.ParentTSAutoHoursRecordID == id).ToList()); if (parentHoursRecords != null) { foreach (var hoursRecord in parentHoursRecords) { var recycleBinInDBRelationParentTSHoursRecord = _serviceService.HasRecycleBinInDBRelation(hoursRecord); if (recycleBinInDBRelationParentTSHoursRecord.hasRelated == false) { var recycleToRecycleBinParentTSHoursRecords = _tsAutoHoursRecordService.RecycleToRecycleBin(hoursRecord.ID, user.Item1, user.Item2); isDeleted = recycleToRecycleBinParentTSHoursRecords.toRecycleBin; errorOnParentTSHoursRecord = recycleToRecycleBinParentTSHoursRecords.toRecycleBin ? string.Empty : recycleToRecycleBinParentTSHoursRecords.relatedClassId; } else { errorOnParentTSHoursRecord = recycleBinInDBRelationParentTSHoursRecord.relatedInDBClassId; } } } var recycleBinInDBRelationTSAutoHoursRecord = _serviceService.HasRecycleBinInDBRelation(new TSAutoHoursRecord() { ID = id }); if (recycleBinInDBRelationTSAutoHoursRecord.hasRelated == false) { var recycleToRecycleBinTSAutoHoursRecords = _tsAutoHoursRecordService.RecycleToRecycleBin(id, user.Item1, user.Item2); isDeleted = recycleToRecycleBinTSAutoHoursRecords.toRecycleBin; errorOnTSAutoHoursRecord = recycleToRecycleBinTSAutoHoursRecords.toRecycleBin ? string.Empty : recycleToRecycleBinTSAutoHoursRecords.relatedClassId; } else { errorOnTSAutoHoursRecord = recycleBinInDBRelationTSAutoHoursRecord.relatedInDBClassId; } } } if (!isDeleted) { if (!string.IsNullOrEmpty(errorOnParentTSHoursRecord)) { ViewBag.RecycleBinError = "Невозможно удалить, так как на удаляемый элемент ссылаются другие элементы в системе." + $"Сначала необходимо удалить элементы, которые ссылаются на данный элемент. {errorOnParentTSHoursRecord}"; } else if (!string.IsNullOrEmpty(errorOnTSAutoHoursRecord)) { ViewBag.RecycleBinError = "Невозможно удалить, так как на удаляемый элемент ссылаются другие элементы в системе." + $"Сначала необходимо удалить элементы, которые ссылаются на данный элемент. {errorOnTSAutoHoursRecord}"; } return(View(tsAutoHoursRecord)); } return(RedirectToAction("Index")); }