Explorar o código

Написание комментариев к коду

Данилов Денис hai 1 ano
pai
achega
3fa90df388

+ 16 - 15
esoft/Class/ActualContext.cs

@@ -9,9 +9,7 @@ using System.Windows.Documents;
 
 namespace esoft.Class
 {
-    /// <summary>
-    /// Получение контекста таблиц БД
-    /// </summary>
+    // Класс ActualContext предоставляет актуальные данные о пользователях, исполнителях, менеджерах и задачах.
     public class ActualContext
     {
         readonly List<User> users;
@@ -21,40 +19,43 @@ namespace esoft.Class
 
         public List<User> Users
         {
-            get { return users; }         
+            get { return users; }
         }
-        public List<Executor> Executor 
+
+        public List<Executor> Executor
         {
-            get {  return executor; } 
+            get { return executor; }
         }
-        public List <Manager> Manager
+
+        public List<Manager> Manager
         {
             get { return manager; }
         }
+
         public List<esoft.Entities.Task> Tasks
         {
+            // Получение задач из контекста данных
             get { return esoftEntities.GetContext().Task.ToList(); }
         }
 
-        /// <summary>
-        /// Заполнение контекстом полей
-        /// </summary>
+        // Конструктор класса ActualContext
         public ActualContext()
         {
             try
             {
+                // Инициализация списков данными из контекста данных
                 users = esoftEntities.GetContext().User.ToList();
                 executor = esoftEntities.GetContext().Executor.ToList();
                 manager = esoftEntities.GetContext().Manager.ToList();
             }
             catch
             {
-                MessageBox.Show("Ошибка подключчения",
-                    "Проверте подключение к интернету", 
-                    MessageBoxButton.OK, 
+                // В случае ошибки подключения выводится сообщение об ошибке
+                MessageBox.Show("Ошибка подключения",
+                    "Проверьте подключение к интернету",
+                    MessageBoxButton.OK,
                     MessageBoxImage.Error);
             }
         }
-
     }
-}
+}

+ 8 - 4
esoft/Class/CoefficientFill.cs

@@ -7,21 +7,25 @@ using System.Windows;
 
 namespace esoft.Class
 {
-    /// <summary>
-    /// Класс для заполнения коэффицентов
-    /// </summary>
+    // Класс CoefficientFill наследуется от класса Manager и предоставляет метод для заполнения коэффициентов по идентификатору менеджера.
     public class CoefficientFill : Manager
     {
+        // Метод CoefficientFills заполняет коэффициенты на основе данных менеджера с указанным идентификатором.
         public static CoefficientFill CoefficientFills(int managerId)
         {
             try
             {
+                // Создание экземпляра ActualContext для получения актуальных данных
                 ActualContext actualContext = new ActualContext();
+
+                // Получение менеджера из контекста данных
                 var manager = esoftEntities.GetContext().Manager
                     .FirstOrDefault(m => m.ID == managerId);
 
+                // Проверка наличия менеджера
                 if (manager != null)
                 {
+                    // Создание нового экземпляра CoefficientFill и заполнение его данными менеджера
                     return new CoefficientFill
                     {
                         ID = manager.ID,
@@ -34,12 +38,12 @@ namespace esoft.Class
                         TimeCoefficient = manager.TimeCoefficient,
                         DifficultyCoefficient = manager.DifficultyCoefficient,
                         ToMoneyCoefficient = manager.ToMoneyCoefficient,
-                        // Добавьте остальные свойства, если необходимо
                     };
                 }
             }
             catch
             {
+                // В случае ошибки выводится сообщение об ошибке
                 MessageBox.Show("Ошибка при заполнении коэффициентов",
                     "Ошибка",
                     MessageBoxButton.OK,

+ 35 - 18
esoft/Class/ExecuterFill.cs

@@ -9,79 +9,89 @@ using System.Windows;
 
 namespace esoft.Class
 {
-    /// <summary>
-    /// Класс для заполнения и работы с Исполнителями
-    /// </summary>
+    // Класс ExecuterFill наследуется от класса User и предоставляет методы для заполнения данных исполнителей и получения статистики по задачам.
     public class ExecuterFill : User
     {
-        string grade;          //Уровень Менеджера
-        int managerID;        //Менеджер которому подчиняется Исполнитель
-        string fioUser;      //ФИО Исполнителя
-        string fioManager;  //ФИО Менеджера
+        string grade;          // Уровень Менеджера
+        int managerID;        // Менеджер, которому подчиняется Исполнитель
+        string fioUser;      // ФИО Исполнителя
+        string fioManager;  // ФИО Менеджера
 
-        int numberTasks_Plan;         //Количество задач запланирована
-        int numberTasks_Executed;    //Количество задач исполняется
-        int numberTasks_Done;       //Количество задач выполнена
-        int numberTasks_Сancelled; //Количество задач отменена
+        int numberTasks_Plan;         // Количество задач, запланированных
+        int numberTasks_Executed;    // Количество задач, исполняемых
+        int numberTasks_Done;       // Количество выполненных задач
+        int numberTasks_Сancelled; // Количество отмененных задач
 
         public string Grade
         {
             get { return grade; }
             set { grade = value; }
         }
+
         public int ManagerID
         {
             get { return managerID; }
             set { managerID = value; }
         }
+
         public string FioUser
         {
             get { return fioUser; }
             set { fioUser = value; }
         }
+
         public string FioManager
         {
             get { return fioManager; }
             set { fioManager = value; }
         }
+
         public int NumberTask_Plan
         {
             get { return numberTasks_Plan; }
             set { numberTasks_Plan = value; }
         }
+
         public int NumberTask_Executed
         {
             get { return numberTasks_Executed; }
             set { numberTasks_Executed = value; }
         }
+
         public int NumberTask_Done
         {
             get { return numberTasks_Done; }
             set { numberTasks_Done = value; }
         }
+
         public int NumberTask_Сancelled
         {
             get { return numberTasks_Сancelled; }
             set { numberTasks_Сancelled = value; }
         }
-        /// <summary>
-        /// Метод формирующий удоный для работы список Исполнителей
-        /// </summary>
-        /// <returns>Список исполнителей</returns>
+
+        // Метод Fill заполняет список ExecuterFill данными о пользователях и исполнителях.
         public static List<ExecuterFill> Fill()
         {
             List<ExecuterFill> executerFills = new List<ExecuterFill>();
             try
             {
+                // Создание экземпляра ActualContext для получения актуальных данных
                 ActualContext actualContext = new ActualContext();
+
+                // Получение списка исполнителей и пользователей из контекста данных
                 List<esoft.Entities.Executor> executors = esoftEntities.GetContext().Executor.ToList();
                 List<User> users = esoftEntities.GetContext().User.ToList();
+
+                // Проход по каждому пользователю и исполнителю
                 foreach (var user in users)
                 {
                     foreach (var executer in executors)
                     {
+                        // Проверка соответствия пользователя и исполнителя
                         if (user.ID == executer.ID)
                         {
+                            // Добавление нового экземпляра ExecuterFill в список, заполненного данными пользователя и исполнителя
                             executerFills.Add(new ExecuterFill
                             {
                                 ID = user.ID,
@@ -95,9 +105,9 @@ namespace esoft.Class
                                 Grade = executer.Grade,
                                 managerID = executer.ManagerID,
                                 FioManager = UserInFIO.SoloUser(
-                                actualContext.Users.FirstOrDefault(
-                                    x => x.ID == actualContext.Executor.FirstOrDefault(
-                                        z => z.ID == executer.ID).ManagerID)),
+                                    actualContext.Users.FirstOrDefault(
+                                        x => x.ID == actualContext.Executor.FirstOrDefault(
+                                            z => z.ID == executer.ID).ManagerID)),
                                 NumberTask_Plan = GetPlanTaskCountForExecutor(executer.ID),
                                 NumberTask_Executed = GetExecutedTaskCountForExecutor(executer.ID),
                                 NumberTask_Done = GetDoneTaskCountForExecutor(executer.ID),
@@ -109,14 +119,18 @@ namespace esoft.Class
             }
             catch
             {
+                // В случае ошибки выводится сообщение об ошибке
                 MessageBox.Show("Ошибка заполнения списка Исполнителей",
                     "Ошибка",
                     MessageBoxButton.OK,
                     MessageBoxImage.Error);
             }
+
+            // Возвращается список заполненных ExecuterFill или пустой список в случае ошибки
             return executerFills;
         }
 
+        // Метод GetPlanTaskCountForExecutor возвращает количество запланированных задач для указанного исполнителя.
         private static int GetPlanTaskCountForExecutor(int executorID)
         {
             ActualContext actualContext = new ActualContext();
@@ -125,6 +139,7 @@ namespace esoft.Class
             }
         }
 
+        // Метод GetExecutedTaskCountForExecutor возвращает количество исполняемых задач для указанного исполнителя.
         private static int GetExecutedTaskCountForExecutor(int executorID)
         {
             ActualContext actualContext = new ActualContext();
@@ -133,6 +148,7 @@ namespace esoft.Class
             }
         }
 
+        // Метод GetDoneTaskCountForExecutor возвращает количество выполненных задач для указанного исполнителя.
         private static int GetDoneTaskCountForExecutor(int executorID)
         {
             ActualContext actualContext = new ActualContext();
@@ -141,6 +157,7 @@ namespace esoft.Class
             }
         }
 
+        // Метод GetCancelledTaskCountForExecutor возвращает количество отмененных задач для указанного исполнителя.
         private static int GetCancelledTaskCountForExecutor(int executorID)
         {
             ActualContext actualContext = new ActualContext();

+ 2 - 1
esoft/Class/GetCurrentUser.cs

@@ -9,6 +9,7 @@ namespace esoft.Class
 {
     public class GetCurrent : esoft.Entities.User
     {
+        // Статическое свойство CurrentUser, представляющее текущего пользователя.
         public static User CurrentUser { get; set; }
     }
-}
+}

+ 2 - 0
esoft/Class/GetGrade.cs

@@ -7,6 +7,7 @@ using System.Windows.Media.Animation;
 
 namespace esoft.Class
 {
+    // Класс GetGrade предоставляет функциональность для работы с уровнями исполнителей.
     internal class GetGrade
     {
         string name;
@@ -17,6 +18,7 @@ namespace esoft.Class
             set { name = value; }
         }
 
+        // Метод FillGrade возвращает список объектов GetGrade, представляющих уровни исполнителей (junior, middle, senior).
         public static List<GetGrade> FillGrade()
         {
             List<GetGrade> list = new List<GetGrade>

+ 3 - 5
esoft/Class/StatusTask.cs

@@ -16,10 +16,8 @@ namespace esoft.Class
             get { return name; }
             set { name = value; }
         }
-        /// <summary>
-        /// Инцилизация Статусов
-        /// </summary>
-        /// <returns>Клекцию статусов</returns>
+
+        // Метод FillStatus возвращает список объектов StatusTask, представляющих статусы задач (запланирована, исполняется, выполнена, отменена).
         public static List<StatusTask> FillStatus()
         {
             List<StatusTask> list = new List<StatusTask>
@@ -32,4 +30,4 @@ namespace esoft.Class
             return list;
         }
     }
-}
+}

+ 32 - 24
esoft/Class/TaskFill.cs

@@ -7,40 +7,39 @@ using System.Windows;
 
 namespace esoft.Class
 {
-    /// <summary>
-    /// Составления списка для отображения пользователю в зависимости от роли
-    /// </summary>
     public class TaskFill : esoft.Entities.Task
-    {        
+    {
         string fioManager;
         string fioUser;
 
         public string FioManager
         {
-            get { return fioManager; } 
+            get { return fioManager; }
             private set { fioManager = value; }
         }
+
         public string FioUser
         {
             get { return fioUser; }
             private set { fioUser = value; }
         }
 
-        /// <summary>
-        /// Собирает коллекцию для вывода задач пользователя
-        /// </summary>
-        /// <param name="actualContext">Контекст базы даных</param>
-        /// <param name="user">Пользователь</param>
-        /// <returns>Список отобранный для пользователя</returns>
+        // Метод TaskFills заполняет список TaskFill данными о задачах для указанного пользователя.
         public static List<TaskFill> TaskFills(User user)
         {
             try
             {
+                // Создание экземпляра ActualContext для получения актуальных данных
                 ActualContext actualContext = new ActualContext();
+
+                // Получение списка задач из контекста данных
                 List<Task> tasks = esoftEntities.GetContext().Task.ToList();
                 List<TaskFill> taskFills = new List<TaskFill>();
+
+                // Проход по каждой задаче
                 for (int i = 0; i < tasks.Count; i++)
                 {
+                    // Добавление нового экземпляра TaskFill в список, заполненного данными о задаче
                     taskFills.Add(new TaskFill
                     {
                         ID = tasks[i].ID,
@@ -62,10 +61,12 @@ namespace esoft.Class
                         FioManager = UserInFIO.SoloUser(
                             actualContext.Users.FirstOrDefault(
                                 x => x.ID == actualContext.Executor.FirstOrDefault(
-                                    z => z.ID == tasks[i].ExecutorID).ManagerID))           
+                                    z => z.ID == tasks[i].ExecutorID).ManagerID))
                     });
                 }
-                if (actualContext.Manager.FirstOrDefault(x => x.ID == user.ID) == null) 
+
+                // Фильтрация задач по роли пользователя и сортировка по дате создания в порядке убывания
+                if (actualContext.Manager.FirstOrDefault(x => x.ID == user.ID) == null)
                 {
                     return taskFills.OrderByDescending(
                     x => x.CreateDateTime).Where(x => x.FioUser == UserInFIO.SoloUser(user)).ToList();
@@ -75,31 +76,35 @@ namespace esoft.Class
                     return taskFills.OrderByDescending(
                     x => x.CreateDateTime).Where(x => x.FioManager == UserInFIO.SoloUser(user)).ToList();
                 }
-                
+
             }
             catch
             {
-                MessageBox.Show("Ошибка подключчения",
-                    "Проверте подключение к интернету",
+                // В случае ошибки выводится сообщение об ошибке
+                MessageBox.Show("Ошибка подключения",
+                    "Проверьте подключение к интернету",
                     MessageBoxButton.OK,
                     MessageBoxImage.Error);
                 return null;
             }
         }
-        /// <summary>
-        /// Вывод всех задач (без удалённых)
-        /// </summary>
-        /// <param name="actualContext">Контекст базы данных</param>
-        /// <returns>Возвращает список</returns>
+
+        // Метод TaskFills заполняет список TaskFill данными о всех задачах.
         public static List<TaskFill> TaskFills()
         {
             try
             {
+                // Создание экземпляра ActualContext для получения актуальных данных
                 ActualContext actualContext = new ActualContext();
+
+                // Получение списка задач из контекста данных, исключая удаленные задачи
                 List<Task> tasks = esoftEntities.GetContext().Task.ToList().Where(x => x.IsDeleted == false).ToList();
                 List<TaskFill> taskFills = new List<TaskFill>();
+
+                // Проход по каждой задаче
                 for (int i = 0; i < tasks.Count; i++)
                 {
+                    // Добавление нового экземпляра TaskFill в список, заполненного данными о задаче
                     taskFills.Add(new TaskFill
                     {
                         ID = tasks[i].ID,
@@ -124,16 +129,19 @@ namespace esoft.Class
                                     z => z.ID == tasks[i].ExecutorID).ManagerID))
                     });
                 }
+
+                // Возвращается список заполненных TaskFill или пустой список в случае ошибки
                 return taskFills;
             }
             catch
             {
-                MessageBox.Show("Ошибка подключчения",
-                    "Проверте подключение к интернету",
+                // В случае ошибки выводится сообщение об ошибке
+                MessageBox.Show("Ошибка подключения",
+                    "Проверьте подключение к интернету",
                     MessageBoxButton.OK,
                     MessageBoxImage.Error);
                 return null;
             }
         }
     }
-}
+}

+ 15 - 25
esoft/Class/UserInFIO.cs

@@ -8,51 +8,41 @@ using System.Windows;
 
 namespace esoft.Class
 {
-    /// <summary>
-    /// Класс для преобразования из имени пользователя его ФИО
-    /// </summary>
     internal static class UserInFIO
     {
-        /// <summary>
-        /// Метод для формирования ФИО одного пользоватлея
-        /// </summary>
-        /// <param name="user">Пользователь которму нужно получить ФИО</param>
-        /// <returns>Строка ФИО</returns>
-        public static string SoloUser(User user) 
+        // Метод SoloUser формирует ФИО пользователя в формате "Фамилия Имя[0]. Отчество[0].".
+        public static string SoloUser(User user)
         {
             return $"{user.MiddleName} {user.FirstName[0]}. {user.LastName[0]}.";
         }
-        /// <summary>
-        /// Метод для формирования ФИО группы пользоватлей
-        /// </summary>
-        /// <param name="user">Список пользователей</param>
-        /// <returns>Строкавая коллекция ФИО</returns>
-        public static List<string> GroupUser(List<User> user)
+
+        // Метод GroupUser формирует список ФИО пользователей в формате "Фамилия Имя[0]. Отчество[0]." из списка объектов типа User.
+        public static List<string> GroupUser(List<User> users)
         {
             List<string> userFIO = new List<string>();
-            foreach (var item in user)
+            foreach (var user in users)
             {
-                userFIO.Add($"{item.MiddleName} {item.FirstName[0]}. {item.LastName[0]}.");
+                userFIO.Add($"{user.MiddleName} {user.FirstName[0]}. {user.LastName[0]}.");
             }
             return userFIO;
         }
-        /// <summary>
-        /// Метод для формирования строки на форму для Исполнителя
-        /// </summary>
-        /// <param name="user">Активный пользователь</param>
-        /// <returns>Сформированная строка</returns>
+
+        // Метод ExecuterOnForm формирует информацию о пользователе и исполнителе в формате "Фамилия Имя[0]. Отчество[0].\nЛогин - Логин, Уровень - Уровень.".
         public static string ExecuterOnForm(User user)
         {
             string answer = null;
             try
             {
-                Executor executer = esoftEntities.GetContext().Executor.FirstOrDefault(x => x.ID == user.ID);
+                // Получение объекта исполнителя для указанного пользователя
+                Executor executor = esoftEntities.GetContext().Executor.FirstOrDefault(x => x.ID == user.ID);
+
+                // Формирование строки с ФИО, логином и уровнем исполнителя
                 answer = $"{user.MiddleName} {user.FirstName[0]}. {user.LastName[0]}.";
-                answer += $"\nЛогин - {user.Login}, Уровень - {executer.Grade}.";
-                
+                answer += $"\nЛогин - {user.Login}, Уровень - {executor.Grade}.";
             }
             catch
             {
+                // В случае ошибки выводится сообщение об ошибке
                 MessageBox.Show("Ошибка получения уровня пользователя",
                     "Ошибка",
                     MessageBoxButton.OK,

+ 0 - 3
esoft/MainWindow.xaml.cs

@@ -15,9 +15,6 @@ using System.Windows.Shapes;
 
 namespace esoft
 {
-    /// <summary>
-    /// Логика взаимодействия для MainWindow.xaml
-    /// </summary>
     public partial class MainWindow : Window
     {
         public MainWindow()

+ 2 - 0
esoft/Models/Respounce/RespounceUser.cs

@@ -6,8 +6,10 @@ using System.Threading.Tasks;
 
 namespace esoft.Models.Respounce
 {
+    // Класс RespounceUser представляет модель данных для ответа с информацией о пользователе.
     internal class RespounceUser
     {
+
         public int ID { get; set; }
         public string Password { get; set; }
         public string FirstName { get; set; }

+ 46 - 4
esoft/Pages/AddEditServicePage.xaml.cs

@@ -9,39 +9,60 @@ using System.Windows.Navigation;
 
 namespace esoft.Pages
 {
+    // Класс AddEditServicePage представляет страницу для добавления или редактирования задачи.
     public partial class AddEditServicePage : Page
     {
+        // Создание экземпляра ActualContext для доступа к актуальным данным.
         ActualContext actualContext = new ActualContext();
+
+        // Список задач, используемых в форме.
         List<TaskFill> taskContext = new List<TaskFill>();
+
+        // Выбранная задача для редактирования.
         private TaskFill selectedTask;
+
+        // Флаг редактирования задачи.
         private bool isEditing = false;
 
+        // Конструктор класса принимает выбранную задачу для редактирования.
         public AddEditServicePage(TaskFill task)
         {
             InitializeComponent();
             selectedTask = task;
+
+            // Устанавливаем флаг редактирования, если задача уже существует.
             if (selectedTask.Title != null)
             {
                 isEditing = true;
             }
+
+            // Заполняем форму данными.
             FillForm();
+
+            // Загружаем правила пользователя.
             LoadUserRule();
         }
 
+        // Метод FillForm заполняет форму данными о задаче.
         private void FillForm()
         {
+            // Заполнение выпадающего списка статусов задач.
             cbStatus.ItemsSource = StatusTask.FillStatus();
             DPickerDateCreate.SelectedDate = DateTime.Today;
 
+            // Если задача редактируется, заполняем форму данными.
             if (isEditing && selectedTask != null)
             {
                 TBoxTitle.Text = selectedTask.Title;
                 cbExecutor.SelectedItem = selectedTask.FioUser;
                 cbManager.SelectedItem = selectedTask.FioManager;
+
+                // Устанавливаем выбранный статус.
                 if (cbStatus.ItemsSource is IEnumerable<StatusTask> statusList)
                 {
                     cbStatus.SelectedItem = statusList.FirstOrDefault(status => status.Name == selectedTask.Status);
                 }
+
                 IUDComplexityTask.Value = (int)selectedTask.Difficulty;
                 IUDTimeTask.Value = selectedTask.Time;
                 cbNatureTask.Text = selectedTask.WorkType;
@@ -51,6 +72,7 @@ namespace esoft.Pages
                 DPickerDateCompleted.SelectedDate = selectedTask.CompletedDateTime;
             }
 
+            // Получаем список исполнителей и менеджеров для заполнения выпадающих списков.
             var usersExecutor = actualContext.Users.Where(user => actualContext.Executor.Any(ex => ex.ID == user.ID)).ToList();
             cbExecutor.ItemsSource = UserInFIO.GroupUser(usersExecutor);
 
@@ -58,14 +80,16 @@ namespace esoft.Pages
             cbManager.ItemsSource = UserInFIO.GroupUser(usersManager);
         }
 
+        // Метод LoadUserRule загружает правила пользователя в зависимости от его роли.
         private void LoadUserRule()
         {
-            taskContext = Class.TaskFill.TaskFills();
+            // Получаем текущего пользователя.
+            var currentUser = GetCurrent.CurrentUser;
 
-            var currentUser = GetCurrent.CurrentUser; // Получаем текущего пользователя
+            // Проверяем, является ли пользователь менеджером.
             var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);
 
-            // Проверка роли пользователя
+            // Устанавливаем доступность элементов формы в зависимости от роли пользователя.
             if (isManager)
             {
                 cbExecutor.IsEnabled = true;
@@ -78,8 +102,10 @@ namespace esoft.Pages
             }
         }
 
+        // Обработчик события нажатия кнопки сохранения задачи.
         private void BtnSaveTask_Click(object sender, RoutedEventArgs e)
         {
+            // Получаем значения полей из формы.
             string title = TBoxTitle.Text;
             string executorName = cbExecutor.SelectedItem?.ToString();
             string managerName = cbManager.SelectedItem?.ToString();
@@ -91,6 +117,7 @@ namespace esoft.Pages
             DateTime createDate = DPickerDateCreate.SelectedDate ?? DateTime.Now;
             DateTime deadline = DPickerDateDeadLine.SelectedDate ?? DateTime.Now;
 
+            // Проверка заполнения обязательных полей.
             if (string.IsNullOrWhiteSpace(title) || string.IsNullOrWhiteSpace(executorName) || string.IsNullOrWhiteSpace(managerName) || string.IsNullOrWhiteSpace(status))
             {
                 MessageBox.Show("Пожалуйста, заполните все обязательные поля!", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
@@ -99,22 +126,28 @@ namespace esoft.Pages
 
             try
             {
+                // Получаем контекст данных.
                 var context = esoftEntities.GetContext();
+
+                // Получаем идентификатор исполнителя и менеджера из контекста данных.
                 var executorID = actualContext.Users.FirstOrDefault(u => UserInFIO.SoloUser(u) == executorName)?.ID;
                 var managerID = actualContext.Users.FirstOrDefault(u => UserInFIO.SoloUser(u) == managerName)?.ID;
 
+                // Проверяем, найдены ли исполнитель и менеджер.
                 if (executorID == null || managerID == null)
                 {
                     MessageBox.Show("Исполнитель или менеджер не найден!", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                     return;
                 }
 
+                // Если редактирование, обновляем существующую задачу.
                 if (isEditing)
                 {
                     var existingTask = context.Task.FirstOrDefault(t => t.ID == selectedTask.ID);
 
                     if (existingTask != null)
                     {
+                        // Обновляем данные задачи.
                         existingTask.Title = title;
                         existingTask.ExecutorID = executorID.Value;
                         existingTask.Status = status;
@@ -125,6 +158,7 @@ namespace esoft.Pages
                         existingTask.CreateDateTime = createDate;
                         existingTask.Deadline = deadline.Date;
 
+                        // Устанавливаем дату выполнения, если статус "выполнена".
                         if (status == "выполнена")
                         {
                             existingTask.CompletedDateTime = DateTime.Today;
@@ -134,16 +168,20 @@ namespace esoft.Pages
                             existingTask.CompletedDateTime = null;
                         }
 
+                        // Сохраняем изменения.
                         context.SaveChanges();
 
+                        // Выводим сообщение об успешном изменении задачи.
                         MessageBoxResult result = MessageBox.Show("Задача успешно изменена!", "Успех", MessageBoxButton.OK, MessageBoxImage.Information);
+
+                        // Переходим на предыдущую страницу после подтверждения.
                         if (result == MessageBoxResult.OK)
                         {
                             NavigationService.GoBack();
                         }
                     }
                 }
-                else // Добавление новой задачи
+                else // Если создание новой задачи, добавляем ее в базу данных.
                 {
                     esoft.Entities.Task newTask = new esoft.Entities.Task
                     {
@@ -161,7 +199,10 @@ namespace esoft.Pages
                     context.Task.Add(newTask);
                     context.SaveChanges();
 
+                    // Выводим сообщение об успешном добавлении задачи.
                     MessageBoxResult result = MessageBox.Show("Задача успешно добавлена!", "Успех", MessageBoxButton.OK, MessageBoxImage.Information);
+
+                    // Переходим на предыдущую страницу после подтверждения.
                     if (result == MessageBoxResult.OK)
                     {
                         NavigationService.GoBack();
@@ -170,6 +211,7 @@ namespace esoft.Pages
             }
             catch (Exception ex)
             {
+                // Выводим сообщение об ошибке при обработке задачи.
                 MessageBox.Show($"Ошибка при обработке задачи: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
             }
         }

+ 65 - 26
esoft/Pages/AddExecutorPage.xaml.cs

@@ -19,39 +19,61 @@ using System.Windows.Shapes;
 
 namespace esoft.Pages
 {
-    /// <summary>
-    /// Логика взаимодействия для AddExecutorPage.xaml
-    /// </summary>
+    // Класс AddExecutorPage представляет страницу для добавления или редактирования исполнителя.
     public partial class AddExecutorPage : Page
     {
-        ActualContext actualContext = new ActualContext();   // Контекст таблиц
+        // Создание экземпляра ActualContext для доступа к актуальным данным.
+        ActualContext actualContext = new ActualContext();
+
+        // Список задач, используемых в форме.
         List<TaskFill> taskContext = new List<TaskFill>();
+
+        // Выбранный исполнитель для редактирования.
         private ExecuterFill selectedExecutor;
+
+        // Флаг редактирования исполнителя.
         private bool isEditing = false;
 
+        // Конструктор класса принимает выбранного исполнителя для редактирования.
         public AddExecutorPage(ExecuterFill executor)
         {
             InitializeComponent();
+
+            // Заполнение списка задач для отображения.
             LViewTask.ItemsSource = Class.TaskFill.TaskFills();
+
             selectedExecutor = executor;
+
+            // Устанавливаем флаг редактирования, если исполнитель уже существует.
             if (selectedExecutor.FioUser != null)
             {
                 isEditing = true;
             }
+
+            // Заполняем форму данными.
             FillForm();
+
+            // Загружаем и сортируем задачи.
             LoadAndSortTasks();
+
+            // Загружаем правила пользователя.
             LoadUserRule(selectedExecutor);
         }
 
+        // Метод FillForm заполняет форму данными об исполнителе.
         private void FillForm()
         {
+            // Заполнение выпадающего списка уровней исполнителей.
             cbGrade.ItemsSource = GetGrade.FillGrade();
 
+            // Если исполнитель редактируется, заполняем форму данными.
             if (isEditing && selectedExecutor != null)
             {
                 TBoxSurname.Text = selectedExecutor.MiddleName;
                 TBoxName.Text = selectedExecutor.Name;
                 TBoxLastName.Text = selectedExecutor.LastName;
+
+                // Устанавливаем выбранный уровень исполнителя.
                 if (cbGrade.ItemsSource is IEnumerable<GetGrade> gradeList)
                 {
                     cbGrade.SelectedItem = gradeList.FirstOrDefault(executor => executor.Name == selectedExecutor.Grade);
@@ -59,21 +81,21 @@ namespace esoft.Pages
             }
         }
 
+        // Метод LoadUserRule загружает правила пользователя в зависимости от его роли.
         private void LoadUserRule(ExecuterFill selectedExecutor)
         {
-
             // Получение актуальных данных задач из базы или контекста приложения
             taskContext = Class.TaskFill.TaskFills();
 
             var currentUser = GetCurrent.CurrentUser;
             var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);
-            
+
             if (isManager)
             {
                 TBoxSurname.IsReadOnly = false;
                 TBoxName.IsReadOnly = false;
                 TBoxLastName.IsReadOnly = false;
-                
+
                 cbGrade.IsEnabled = true;
             }
             else // Если текущий пользователь - исполнитель
@@ -100,10 +122,12 @@ namespace esoft.Pages
             }
             else
             {
-                LViewTask.ItemsSource = taskContext; // Если исполнитель не выбран, отображаем все задачи
+                // Если исполнитель не выбран, отображаем все задачи
+                LViewTask.ItemsSource = taskContext;
             }
         }
 
+        // Метод LoadAndSortTasks загружает и сортирует задачи.
         private void LoadAndSortTasks()
         {
             // Сортируем задачи по убыванию даты создания
@@ -112,24 +136,29 @@ namespace esoft.Pages
             LViewTask.ItemsSource = taskContext;
         }
 
+        // Обработчик события нажатия кнопки сохранения исполнителя.
         private void BtnSaveExecutor_Click(object sender, RoutedEventArgs e)
         {
             try
             {
+                // Получаем значения полей из формы.
                 string firstName = TBoxName.Text;
                 string middleName = TBoxSurname.Text;
                 string lastName = TBoxLastName.Text;
                 string login = TBoxLogin.Text;
                 string password = TBoxPassword.Text;
 
+                // Проверка заполнения обязательных полей.
                 if (string.IsNullOrWhiteSpace(firstName) || string.IsNullOrWhiteSpace(lastName) || string.IsNullOrWhiteSpace(login) || string.IsNullOrWhiteSpace(password))
                 {
                     MessageBox.Show("Пожалуйста, заполните все обязательные поля!", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                     return;
                 }
 
+                // Получаем контекст данных.
                 var context = esoftEntities.GetContext();
 
+                // Если редактирование, обновляем существующего пользователя.
                 if (isEditing && selectedExecutor != null)
                 {
                     var existingUser = context.User.FirstOrDefault(u => u.ID == selectedExecutor.ID);
@@ -145,17 +174,19 @@ namespace esoft.Pages
                         context.SaveChanges();
 
                         MessageBoxResult result = MessageBox.Show("Информация о пользователе успешно обновлена!", "Успех", MessageBoxButton.OK, MessageBoxImage.Information);
+
+                        // Переходим на предыдущую страницу после подтверждения.
                         if (result == MessageBoxResult.OK)
                         {
                             if (isEditing)
                             {
-                                // Получите соответствующего исполнителя для редактируемого пользователя
+                                // Получаем соответствующего исполнителя для редактируемого пользователя.
                                 var executor = context.Executor.FirstOrDefault(exec => exec.ID == existingUser.ID);
 
                                 if (executor != null)
                                 {
-                                    executor.Grade = cbGrade.Text;   // Обновите Grade исполнителя
-                                    context.SaveChanges();          // Сохраните изменения в исполнителе
+                                    executor.Grade = cbGrade.Text;   // Обновляем уровень исполнителя.
+                                    context.SaveChanges();          // Сохраняем изменения в исполнителе.
                                 }
                             }
 
@@ -163,7 +194,7 @@ namespace esoft.Pages
                         }
                     }
                 }
-                else // Добавление нового пользователя
+                else // Если создание нового пользователя.
                 {
                     User newUser = new User
                     {
@@ -178,6 +209,8 @@ namespace esoft.Pages
                     context.SaveChanges();
 
                     MessageBoxResult result = MessageBox.Show("Пользователь успешно добавлен!", "Успех", MessageBoxButton.OK, MessageBoxImage.Information);
+
+                    // Переходим на предыдущую страницу после подтверждения.
                     if (result == MessageBoxResult.OK)
                     {
                         CreateExecutorForNewUser(newUser, cbGrade.Text);
@@ -190,30 +223,31 @@ namespace esoft.Pages
                 MessageBox.Show($"Ошибка при обработке пользователя: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
             }
         }
-        
-        // Функция для получения ID менеджера
+
+        // Метод для получения ID менеджера.
         private int GetManagerID()
         {
-            // Получение ID менеджера текущего пользователя
+            // Получение ID менеджера текущего пользователя.
             var currentUser = GetCurrent.CurrentUser;
 
-            // Предполагается, что ManagerID указывает на ID менеджера
+            // Предполагается, что ManagerID указывает на ID менеджера.
             return currentUser?.ID ?? 0;
         }
 
+        // Метод для создания исполнителя для нового пользователя.
         public void CreateExecutorForNewUser(User newUser, string grade)
         {
             try
             {
                 var context = esoftEntities.GetContext();
-                 
+
                 esoft.Entities.Executor newExecutor = new esoft.Entities.Executor
                 {
-                    ManagerID = GetManagerID(),     // Получаем ID менеджера текущего пользователя
+                    ManagerID = GetManagerID(),     // Получаем ID менеджера текущего пользователя.
                     Grade = grade,                 //
-                    ID = newUser.ID               // Используем ID только что добавленного пользователя
+                    ID = newUser.ID               // Используем ID только что добавленного пользователя.
                 };
-                
+
                 context.Executor.Add(newExecutor);
                 context.SaveChanges();
             }
@@ -223,15 +257,16 @@ namespace esoft.Pages
             }
         }
 
+        // Обработчик события двойного щелчка по задаче в списке.
         private void LViewTask_MouseDoubleClick(object sender, MouseButtonEventArgs e)
         {
             if (LViewTask.SelectedItem is TaskFill selectedTask)
             {
-                // Проверяем, не является ли статус задачи "выполнена" или "отменена"
+                // Проверяем, не является ли статус задачи "выполнена" или "отменена".
                 if (selectedTask.Status != "выполнена" && selectedTask.Status != "отменена")
                 {
-                    AddEditServicePage editPage = new AddEditServicePage(selectedTask);  // Передаем выбранную задачу в окно редактирования
-                    NavigationService.Navigate(editPage);                               // Открываем окно редактирования
+                    AddEditServicePage editPage = new AddEditServicePage(selectedTask);  // Передаем выбранную задачу в окно редактирования.
+                    NavigationService.Navigate(editPage);                               // Открываем окно редактирования.
                 }
                 else
                 {
@@ -244,18 +279,21 @@ namespace esoft.Pages
             }
         }
 
+        // Обработчик события изменения состояния флажков статусов задач.
         private void FilterExecuter(object sender, RoutedEventArgs e)
         {
             FilterTasks();
         }
 
+        // Метод для фильтрации задач в соответствии со статусами и исполнителем.
         private void FilterTasks()
         {
-            // Получение актуальных данных задач из базы или контекста приложения
+            // Получение актуальных данных задач из базы или контекста приложения.
             taskContext = Class.TaskFill.TaskFills();
 
             List<string> selectedStatuses = new List<string>();
 
+            // Определение выбранных статусов задач.
             if (ckbPlan.IsChecked == true)
             {
                 selectedStatuses.Add("запланирована");
@@ -273,9 +311,10 @@ namespace esoft.Pages
                 selectedStatuses.Add("отменена");
             }
 
+            // Фильтрация задач по выбранному исполнителю и статусам.
             if (selectedExecutor != null || selectedStatuses.Any())
             {
-                // Фильтрация задач по выбранному исполнителю и статусам
+                // Фильтрация задач по выбранным статусам и исполнителю.
                 var filteredTasks = taskContext.Where(task =>
                     (selectedExecutor == null || task.FioUser == selectedExecutor.FioUser) &&
                     (selectedStatuses.Count == 0 || selectedStatuses.Contains(task.Status))).ToList();
@@ -284,7 +323,7 @@ namespace esoft.Pages
             }
             else
             {
-                // Если исполнитель не выбран и не выбрано ни одного статуса, показать все задачи
+                // Если исполнитель не выбран и не выбрано ни одного статуса, показать все задачи.
                 LViewTask.ItemsSource = taskContext;
             }
         }

+ 31 - 8
esoft/Pages/EditPriceCoefficient.xaml.cs

@@ -19,31 +19,42 @@ using System.Windows.Shapes;
 
 namespace esoft.Pages
 {
-    /// <summary>
-    /// Логика взаимодействия для EditPriceCoefficient.xaml
-    /// </summary>
     public partial class EditPriceCoefficient : Page
     {
+        // Создаем экземпляр контекста данных
         ActualContext actualContext = new ActualContext();
+
+        // Создаем список для хранения коэффициентов
         List<CoefficientFill> coefficientContext = new List<CoefficientFill>();
         private CoefficientFill selectedCoefficient;
         private ExecuterFill selectedExecuter;
         private bool isEditing = false;
 
+        // Конструктор страницы для редактирования коэффициентов заработной платы
         public EditPriceCoefficient(ExecuterFill executer)
         {
             InitializeComponent();
+
+            // Инициализируем выбранного исполнителя
             selectedExecuter = executer;
-            if (selectedExecuter.ManagerID != 0)  // Используйте 0, если ID имеет тип int
+
+            // Проверяем, является ли редактирование (если ID менеджера не равен 0)
+            if (selectedExecuter.ManagerID != 0)
             {
                 isEditing = true;
             }
+
+            // Заполняем форму данными
             FillForm();
+
+            // Загружаем правила пользователя
             LoadUserRule(selectedExecuter);
         }
 
+        // Метод для заполнения формы данными из базы данных
         private void FillForm()
         {
+            // Получаем коэффициент по выбранному менеджеру
             selectedCoefficient = CoefficientFill.CoefficientFills(selectedExecuter.ManagerID);
 
             if (isEditing && selectedCoefficient != null)
@@ -53,11 +64,14 @@ namespace esoft.Pages
                     // Получаем всех пользователей, которых связывает ID
                     var usersManager = actualContext.Users.Where(user => actualContext.Manager
                         .Any(manager => selectedCoefficient.ID == user.ID)).ToList();
+
+                    // Заполняем выпадающий список пользователями
                     cbManager.ItemsSource = UserInFIO.GroupUser(usersManager);
+
+                    // Выбираем текущего пользователя
                     cbManager.SelectedItem = UserInFIO.SoloUser(usersManager
                         .FirstOrDefault(u => u.ID == selectedCoefficient.ID));
 
-
                     // Заполняем остальные поля формы
                     IUDJuniorMin.Value = selectedCoefficient.JuniorMinimum;
                     IUDMiddleMin.Value = selectedCoefficient.MiddleMinimum;
@@ -69,6 +83,7 @@ namespace esoft.Pages
                     TBoxDifficultyCoefficient.Text = selectedCoefficient.DifficultyCoefficient.ToString();
                     TBoxToMoneyCoefficient.Text = selectedCoefficient.ToMoneyCoefficient.ToString();
 
+                    // Определяем уровень исполнителя и устанавливаем соответствующую зарплату
                     if (selectedExecuter.Grade == "junior")
                     {
                         TBlockTotalSalary.Text = selectedCoefficient.JuniorMinimum.ToString();
@@ -84,6 +99,7 @@ namespace esoft.Pages
                 }
                 catch (Exception ex)
                 {
+                    // Выводим сообщение об ошибке, если что-то пошло не так при заполнении формы
                     MessageBox.Show($"Ошибка при заполнении формы: {ex.Message}",
                                     "Ошибка",
                                     MessageBoxButton.OK,
@@ -92,14 +108,15 @@ namespace esoft.Pages
             }
         }
 
+        // Метод для загрузки правил пользователя (менеджер или исполнитель)
         private void LoadUserRule(ExecuterFill selectedExecutor)
         {
-
             var currentUser = GetCurrent.CurrentUser;
             var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);
 
             if (isManager)
             {
+                // Если текущий пользователь - менеджер
                 IUDJuniorMin.IsReadOnly = false;
                 IUDMiddleMin.IsReadOnly = false;
                 IUDSeniorMin.IsReadOnly = false;
@@ -115,8 +132,9 @@ namespace esoft.Pages
 
                 BtnSaveSalaryCoeff.IsEnabled = true;
             }
-            else // Если текущий пользователь - исполнитель
+            else
             {
+                // Если текущий пользователь - исполнитель
                 IUDJuniorMin.IsReadOnly = true;
                 IUDMiddleMin.IsReadOnly = true;
                 IUDSeniorMin.IsReadOnly = true;
@@ -134,6 +152,7 @@ namespace esoft.Pages
             }
         }
 
+        // Обработчик события сохранения изменений в коэффициентах заработной платы
         private void BtnSaveSalaryCoeff_Click(object sender, RoutedEventArgs e)
         {
             try
@@ -153,6 +172,7 @@ namespace esoft.Pages
                 double difficultyCoefficient = double.Parse(TBoxDifficultyCoefficient.Text);
                 double toMoneyCoefficient = double.Parse(TBoxToMoneyCoefficient.Text);
 
+                // Находим существующий коэффициент в базе данных
                 var existingCoefficient = context.Manager.FirstOrDefault(t => t.ID == selectedCoefficient.ID);
 
                 // Присваиваем свойствам объекта значения из элементов управления
@@ -166,19 +186,22 @@ namespace esoft.Pages
                 existingCoefficient.DifficultyCoefficient = difficultyCoefficient;
                 existingCoefficient.ToMoneyCoefficient = toMoneyCoefficient;
 
+                // Сохраняем изменения в базе данных
                 context.SaveChanges();
 
+                // Выводим уведомление об успешном изменении коэффициентов
                 MessageBoxResult result = MessageBox.Show("Коэффициенты успешно изменены!", "Успех", MessageBoxButton.OK, MessageBoxImage.Information);
                 if (result == MessageBoxResult.OK)
                 {
+                    // Переходим на предыдущую страницу
                     NavigationService.GoBack();
                 }
             }
             catch (Exception ex)
             {
+                // Выводим сообщение об ошибке, если что-то пошло не так при сохранении данных
                 MessageBox.Show($"Ошибка при сохранении данных: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
             }
         }
-
     }
 }

+ 60 - 42
esoft/Pages/ExecutorsListPage.xaml.cs

@@ -18,22 +18,28 @@ using System.Windows.Shapes;
 
 namespace esoft.Pages
 {
-    /// <summary>
-    /// Логика взаимодействия для ExecutorsListPage.xaml
-    /// </summary>
     public partial class ExecutorsListPage : Page
     {
-        ActualContext actualContext = new ActualContext();                 // Контекст таблиц
-        ExecuterFill executer = new ExecuterFill();                       // Полученный контекст формы
-        List<ExecuterFill> executerContext = new List<ExecuterFill>();   // Список исполнителей
+        // Контекст для работы с данными таблицы
+        ActualContext actualContext = new ActualContext();
 
+        // Объект исполнителя для получения данных формы
+        ExecuterFill executer = new ExecuterFill();
+
+        // Список исполнителей
+        List<ExecuterFill> executerContext = new List<ExecuterFill>();
+
+        // Конструктор страницы списка исполнителей
         public ExecutorsListPage()
         {
             InitializeComponent();
+
+            // Заполнение формы и загрузка правил для текущего пользователя
             FillForm();
             LoadUserRule();
         }
 
+        // Загрузка правил для текущего пользователя
         private void LoadUserRule()
         {
             executerContext = Class.ExecuterFill.Fill();
@@ -41,7 +47,7 @@ namespace esoft.Pages
             var currentUser = GetCurrent.CurrentUser; // Получаем текущего пользователя
             var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);
 
-            // Проверка роли пользователя
+            // Проверка роли пользователя и настройка видимости кнопок
             if (isManager)
             {
                 BtnAddExecutor.Visibility = Visibility.Visible;
@@ -55,38 +61,38 @@ namespace esoft.Pages
                 BtnUpdate.Visibility = Visibility.Hidden;
             }
 
+            // Отображение списка исполнителей в ListView
             LViewExecutors.ItemsSource = executerContext;
         }
 
+        // Заполнение формы данными
         private void FillForm()
         {
-            // Получение списка исполнителей
+            // Получение списка исполнителей для ComboBox
             List<User> usersExecutor = actualContext.Users.Where(user => actualContext.Executor.Any(ex => ex.ID == user.ID)).ToList();
             cbExecutor.ItemsSource = UserInFIO.GroupUser(usersExecutor);
 
-            // Получение списка менеджеров
+            // Получение списка менеджеров для ComboBox
             List<User> usersManager = actualContext.Users.Where(user => actualContext.Manager.Any(manager => manager.ID == user.ID)).ToList();
             cbManager.ItemsSource = UserInFIO.GroupUser(usersManager);
         }
 
+        // Обработчик нажатия на кнопку удаления исполнителя
         private void BtnDeleteExecutor_Click(object sender, RoutedEventArgs e)
         {
-
             executerContext = Class.ExecuterFill.Fill();
 
             var currentUser = GetCurrent.CurrentUser; // Получаем текущего пользователя
             var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);
 
-
             if (LViewExecutors.SelectedItem is ExecuterFill selectedExecutor)
             {
-                // Проверка роли пользователя
+                // Проверка роли пользователя и прав на удаление
                 if (isManager)
                 {
-
                     if (selectedExecutor.ManagerID != currentUser.ID)
                     {
-                        MessageBox.Show("Извините, но вы не можете удалить исполнителя, который за вами не закреплён!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
+                        MessageBox.Show("Извините, но вы не можете удалить исполнителя, который за вами не закреплен!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                     }
                     else
                     {
@@ -98,8 +104,11 @@ namespace esoft.Pages
                                 var existingUser = context.User.FirstOrDefault(u => u.ID == selectedExecutor.ID);
                                 if (existingUser != null)
                                 {
+                                    // Помечаем исполнителя как удаленного
                                     existingUser.IsDeleted = true;
                                     context.SaveChanges();
+
+                                    // Обновляем список исполнителей в ListView
                                     executerContext = Class.ExecuterFill.Fill().Where(executer => !executer.IsDeleted).ToList();
                                     LViewExecutors.ItemsSource = executerContext;
                                 }
@@ -114,21 +123,25 @@ namespace esoft.Pages
             }
             else
             {
-                MessageBox.Show("Выберите исполнителя для редактирования.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
+                MessageBox.Show("Выберите исполнителя для удаления.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
             }
         }
 
+        // Обработчик нажатия на кнопку добавления исполнителя
         private void BtnAddExecutor_Click(object sender, RoutedEventArgs e)
         {
-            // Перенаправление пользователя на страницу с задачами
+            // Переход на страницу добавления исполнителя
             NavigationService.Navigate(new Pages.AddExecutorPage(executer));
         }
 
+        // Обработчик нажатия на кнопку обновления списка исполнителей
         private void BtnUpdate_Click(object sender, RoutedEventArgs e)
         {
+            // Обновление списка исполнителей в ListView
             LViewExecutors.ItemsSource = Class.ExecuterFill.Fill();
         }
 
+        // Обработчик двойного клика по исполнителю для редактирования
         private void LViewExecutors_MouseDoubleClick(object sender, MouseButtonEventArgs e)
         {
             executerContext = Class.ExecuterFill.Fill();
@@ -136,36 +149,35 @@ namespace esoft.Pages
             var currentUser = GetCurrent.CurrentUser; // Получаем текущего пользователя
             var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);
 
-
             if (LViewExecutors.SelectedItem is ExecuterFill selectedExecutor)
             {
-                // Проверка роли пользователя
+                // Проверка роли пользователя и прав на редактирование
                 if (isManager)
                 {
                     if (selectedExecutor.ManagerID != currentUser.ID)
                     {
-                        MessageBox.Show("Извините, но вы не можете редактировать информацию исполнителя, который за вами не закреплён!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
+                        MessageBox.Show("Извините, но вы не можете редактировать информацию исполнителя, который за вами не закреплен!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                     }
                     else
                     {
-                        // Передаем выбранного Исполнителя в окно редактирования
+                        // Передаем выбранного исполнителя на страницу редактирования
                         AddExecutorPage editPage = new AddExecutorPage(selectedExecutor);
 
-                        // Заполнение данных из выбранного исполнителя в форму редактирования
+                        // Заполняем форму редактирования данными из выбранного исполнителя
                         editPage.TBoxSurname.Text = selectedExecutor.MiddleName;
                         editPage.TBoxName.Text = selectedExecutor.FirstName;
                         editPage.TBoxLastName.Text = selectedExecutor.LastName;
                         editPage.TBoxLogin.Text = selectedExecutor.Login;
                         editPage.TBoxPassword.Text = selectedExecutor.Password;
 
-                        // Поиск соответствующего элемента в ComboBox `cbGrade` и установка его в качестве выбранного
+                        // Поиск и установка выбранного элемента в ComboBox `cbGrade`
                         if (editPage.cbGrade.ItemsSource is IEnumerable<GetGrade> gradeList)
                         {
                             var selectedGrade = gradeList.FirstOrDefault(executor => executor.Name == selectedExecutor.Grade);
                             editPage.cbGrade.SelectedItem = selectedGrade;
                         }
 
-                        // Открываем окно редактирования
+                        // Открываем страницу редактирования
                         NavigationService.Navigate(editPage);
                     }
                 }
@@ -177,24 +189,24 @@ namespace esoft.Pages
                     }
                     else
                     {
-                        // Передаем выбранного Исполнителя в окно редактирования
+                        // Передаем выбранного исполнителя на страницу редактирования
                         AddExecutorPage editPage = new AddExecutorPage(selectedExecutor);
 
-                        // Заполнение данных из выбранного исполнителя в форму редактирования
+                        // Заполняем форму редактирования данными из выбранного исполнителя
                         editPage.TBoxSurname.Text = selectedExecutor.MiddleName;
                         editPage.TBoxName.Text = selectedExecutor.FirstName;
                         editPage.TBoxLastName.Text = selectedExecutor.LastName;
                         editPage.TBoxLogin.Text = selectedExecutor.Login;
                         editPage.TBoxPassword.Text = selectedExecutor.Password;
 
-                        // Поиск соответствующего элемента в ComboBox `cbGrade` и установка его в качестве выбранного
+                        // Поиск и установка выбранного элемента в ComboBox `cbGrade`
                         if (editPage.cbGrade.ItemsSource is IEnumerable<GetGrade> gradeList)
                         {
                             var selectedGrade = gradeList.FirstOrDefault(executor => executor.Name == selectedExecutor.Grade);
                             editPage.cbGrade.SelectedItem = selectedGrade;
                         }
 
-                        // Открываем окно редактирования
+                        // Открываем страницу редактирования
                         NavigationService.Navigate(editPage);
                     }
                 }
@@ -205,21 +217,22 @@ namespace esoft.Pages
             }
         }
 
-        private void FilterTasks()
+        // Функция фильтрации исполнителей
+        private void FilterExecutors()
         {
-            // Получение актуальных данных задач из базы или контекста приложения
+            // Получение актуальных данных исполнителей
             executerContext = Class.ExecuterFill.Fill();
 
             if (cbExecutor.SelectedItem != null)
             {
                 string selectedExecutor = cbExecutor.SelectedItem.ToString();
-                executerContext = executerContext.Where(task => task.FioUser == selectedExecutor).ToList();
+                executerContext = executerContext.Where(executor => executor.FioUser == selectedExecutor).ToList();
             }
 
             if (cbManager.SelectedItem != null)
             {
                 string selectedManager = cbManager.SelectedItem.ToString();
-                executerContext = executerContext.Where(task => task.FioManager == selectedManager).ToList();
+                executerContext = executerContext.Where(executor => executor.FioManager == selectedManager).ToList();
             }
 
             if (!string.IsNullOrEmpty(Search.Text))
@@ -227,55 +240,60 @@ namespace esoft.Pages
                 // Преобразование текста поиска к нижнему регистру (для удобства сравнения)
                 string searchText = Search.Text.ToLower();
 
-                // Фильтрация задач по содержанию текста в полях Title
-                executerContext = executerContext.Where(task => task.FioUser.ToLower().Contains(searchText)).ToList();
+                // Фильтрация исполнителей по содержанию текста в полях ФИО
+                executerContext = executerContext.Where(executor => executor.FioUser.ToLower().Contains(searchText)).ToList();
             }
 
+            // Обновление списка исполнителей в ListView
             LViewExecutors.ItemsSource = executerContext;
         }
 
+        // Обработчик изменения выбора менеджера в ComboBox
         private void cbManager_SelectionChanged(object sender, SelectionChangedEventArgs e)
         {
-            FilterTasks();
+            FilterExecutors();
         }
 
+        // Обработчик изменения выбора исполнителя в ComboBox
         private void cbExecutor_SelectionChanged(object sender, SelectionChangedEventArgs e)
         {
-            FilterTasks();
+            FilterExecutors();
         }
 
+        // Обработчик изменения текста в поле поиска
         private void Search_TextChanged(object sender, TextChangedEventArgs e)
         {
-            FilterTasks();
+            FilterExecutors();
         }
 
+        // Обработчик кнопки очистки фильтра
         private void btnClearFilter_Click(object sender, RoutedEventArgs e)
         {
-            // Очистка выбранных значений комбо боксов
+            // Очистка выбранных значений ComboBox
             cbExecutor.SelectedItem = null;
             cbManager.SelectedItem = null;
             Search.Text = string.Empty;
 
-            // Очистка фильтров и отображение всех задач без фильтрации
+            // Очистка фильтров и отображение всех исполнителей без фильтрации
             LViewExecutors.ItemsSource = Class.ExecuterFill.Fill();
         }
 
+        // Обработчик события загрузки списка исполнителей
         private void LViewExecutors_Loaded(object sender, RoutedEventArgs e)
         {
             // Получение исполнителей, не помеченных на удаление
-            executerContext = Class.ExecuterFill.Fill().Where(executer => !executer.IsDeleted).ToList();
+            executerContext = Class.ExecuterFill.Fill().Where(executor => !executor.IsDeleted).ToList();
             LViewExecutors.ItemsSource = executerContext;
         }
 
+        // Обработчик кнопки перехода к редактированию коэффициентов исполнителя
         private void BtnPriceCoefficient_Click(object sender, RoutedEventArgs e)
         {
-
             executerContext = Class.ExecuterFill.Fill();
 
             var currentUser = GetCurrent.CurrentUser; // Получаем текущего пользователя
             var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);
 
-
             if (LViewExecutors.SelectedItem is ExecuterFill selectedExecutor)
             {
                 // Проверка роли пользователя
@@ -283,7 +301,7 @@ namespace esoft.Pages
                 {
                     if (selectedExecutor.ManagerID != currentUser.ID)
                     {
-                        MessageBox.Show("Извините, но вы не можете просматривать информацию о зарплате исполнителя, который за вами не закреплён!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
+                        MessageBox.Show("Извините, но вы не можете просматривать информацию о зарплате исполнителя, который за вами не закреплен!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                     }
                     else
                     {

+ 0 - 3
esoft/Pages/LoginPage.xaml.cs

@@ -23,9 +23,6 @@ using System.Windows.Shapes;
 
 namespace esoft.Pages
 {
-    /// <summary>
-    /// Логика взаимодействия для LoginPage.xaml
-    /// </summary>
     public partial class LoginPage : Page
     {
         ActualContext actualContext = new ActualContext();

+ 47 - 28
esoft/Pages/TaskLists.xaml.cs

@@ -1,4 +1,5 @@
-using esoft.Class;
+// Импорт необходимых пространств имен
+using esoft.Class;
 using esoft.Entities;
 using System;
 using System.Collections.Generic;
@@ -8,41 +9,48 @@ using System.Text;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
-using System.Windows.Data;
-using System.Windows.Documents;
-using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Imaging;
-using System.Windows.Navigation;
-using System.Windows.Shapes;
+// ...
 
 namespace esoft.Pages
 {
-    /// <summary>
-    /// Логика взаимодействия для TaskLists.xaml
-    /// </summary>
     public partial class TaskLists : Page
     {
+        // Создание экземпляров классов
         ActualContext actualContext = new ActualContext();
         TaskFill tasks = new TaskFill();
         List<TaskFill> taskContext = new List<TaskFill>();
 
+        // Конструктор страницы
         public TaskLists()
         {
             InitializeComponent();
+
+            // Инициализация элемента управления LViewTask данными из TaskFill
             LViewTask.ItemsSource = Class.TaskFill.TaskFills();
             FillForm();
             LoadAndSortTasks();
             LoadUserRule();
         }
 
+        // Загрузка и сортировка задач
+        private void LoadAndSortTasks()
+        {
+            // Сортировка задач по убыванию даты создания
+            taskContext = Class.TaskFill.TaskFills();
+            taskContext = taskContext.OrderByDescending(task => task.CreateDateTime).ToList();
+            LViewTask.ItemsSource = taskContext;
+        }
+
+        // Загрузка и применение прав доступа пользователя
         private void LoadUserRule()
         {
+            // Получение данных о задачах
             taskContext = Class.TaskFill.TaskFills();
 
+            // Получение текущего пользователя и проверка его роли
             var currentUser = GetCurrent.CurrentUser;
             var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);
- 
+
             if (isManager)
             {
                 // Логика сортировки для менеджеров
@@ -53,6 +61,7 @@ namespace esoft.Pages
                     .OrderByDescending(task => task.CreateDateTime)
                     .ToList();
 
+                // Отображение элементов управления для менеджеров
                 cbExecutor.Visibility = Visibility.Visible;
                 cbManager.Visibility = Visibility.Visible;
                 btnClearFilter.Visibility = Visibility.Visible;
@@ -69,6 +78,7 @@ namespace esoft.Pages
                     .OrderByDescending(task => task.CreateDateTime)
                     .ToList();
 
+                // Скрытие элементов управления для исполнителей
                 cbExecutor.Visibility = Visibility.Hidden;
                 cbManager.Visibility = Visibility.Hidden;
                 btnClearFilter.Visibility = Visibility.Hidden;
@@ -78,28 +88,24 @@ namespace esoft.Pages
                 BtnUpdate.Visibility = Visibility.Hidden;
             }
 
+            // Применение отфильтрованных данных к элементу управления
             LViewTask.ItemsSource = taskContext;
         }
 
-        private void LoadAndSortTasks()
-        {
-            // Сортируем задачи по убыванию даты создания
-            taskContext = Class.TaskFill.TaskFills();
-            taskContext = taskContext.OrderByDescending(task => task.CreateDateTime).ToList();
-            LViewTask.ItemsSource = taskContext;
-        }
-
+        // Заполнение формы данными
         private void FillForm()
         {
+            // Заполнение комбобоксов данными из базы данных
             cbStatus.ItemsSource = StatusTask.FillStatus();
 
-            List<User> usersExecutor = actualContext.Users.Where(user => actualContext.Executor.Any(ex => ex.ID == user.ID)).ToList(); // Получение списка исполнителей
+            List<User> usersExecutor = actualContext.Users.Where(user => actualContext.Executor.Any(ex => ex.ID == user.ID)).ToList();
             cbExecutor.ItemsSource = UserInFIO.GroupUser(usersExecutor);
 
-            List<User> usersManager = actualContext.Users.Where(user => actualContext.Manager.Any(manager => manager.ID == user.ID)).ToList(); // Получение списка менеджеров
+            List<User> usersManager = actualContext.Users.Where(user => actualContext.Manager.Any(manager => manager.ID == user.ID)).ToList();
             cbManager.ItemsSource = UserInFIO.GroupUser(usersManager);
         }
 
+        // Обработчик события нажатия на кнопку "Добавить задачу"
         private void BtnAddTask_Click(object sender, RoutedEventArgs e)
         {
             TaskFill newTask = new TaskFill();
@@ -107,17 +113,18 @@ namespace esoft.Pages
             NavigationService.Navigate(editPage);
         }
 
+        // Обработчик события нажатия на кнопку "Удалить задачу"
         private void BtnDeleteTask_Click(object sender, RoutedEventArgs e)
         {
+            // Получение данных о задачах
             taskContext = Class.TaskFill.TaskFills();
 
             var currentUser = GetCurrent.CurrentUser;
             var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);
 
-
             if (LViewTask.SelectedItem is TaskFill selectedTask)
             {
-                // Проверка роли пользователя
+                // Проверка роли пользователя и соответствия менеджера выбранной задаче
                 if (isManager)
                 {
                     var ShortName = UserInFIO.SoloUser(currentUser);
@@ -129,6 +136,7 @@ namespace esoft.Pages
                     {
                         try
                         {
+                            // Вывод сообщения подтверждения удаления
                             MessageBoxResult result = MessageBox.Show("Вы уверены, что хотите удалить выбранную задачу?",
                                                                           "Подтверждение удаления",
                                                                           MessageBoxButton.YesNo,
@@ -137,13 +145,15 @@ namespace esoft.Pages
                             {
                                 var context = esoftEntities.GetContext();
                                 var taskToDelete = context.Task.FirstOrDefault(task => task.ID == selectedTask.ID);
-                                
+
                                 if (taskToDelete != null)
                                 {
+                                    // Установка флага IsDeleted для удаления задачи
                                     taskToDelete.IsDeleted = true;
                                     context.SaveChanges();
                                     LViewTask.ItemsSource = Class.TaskFill.TaskFills();
 
+                                    // Обновление списка задач без удаленных задач
                                     taskContext = Class.TaskFill.TaskFills().Where(task => !task.IsDeleted).ToList();
                                     LViewTask.ItemsSource = taskContext;
                                     LoadAndSortTasks();
@@ -163,6 +173,7 @@ namespace esoft.Pages
             }
         }
 
+        // Обработчик события нажатия на кнопку "Обновить"
         private void BtnUpdate_Click(object sender, RoutedEventArgs e)
         {
             LViewTask.ItemsSource = Class.TaskFill.TaskFills();
@@ -170,6 +181,7 @@ namespace esoft.Pages
             LoadUserRule();
         }
 
+        // Фильтрация задач в соответствии с выбранными значениями комбобоксов и текстового поля
         private void FilterTasks()
         {
             // Получение актуальных данных задач из базы или контекста приложения
@@ -217,9 +229,11 @@ namespace esoft.Pages
                 taskContext = taskContext.Where(task => task.Title.ToLower().Contains(searchText)).ToList();
             }
 
+            // Применение отфильтрованных данных к элементу управления
             LViewTask.ItemsSource = taskContext;
         }
 
+        // Обработчики событий изменения выбора в комбобоксах и изменения текста в поле поиска
         private void cbStatus_SelectionChanged(object sender, SelectionChangedEventArgs e)
         {
             FilterTasks();
@@ -240,6 +254,7 @@ namespace esoft.Pages
             FilterTasks();
         }
 
+        // Обработчик события нажатия на кнопку "Сбросить фильтр"
         private void btnClearFilter_Click(object sender, RoutedEventArgs e)
         {
             // Очистка выбранных значений комбо боксов
@@ -254,21 +269,23 @@ namespace esoft.Pages
             LoadUserRule();
         }
 
+        // Обработчик события нажатия на кнопку "Список исполнителей"
         private void BtnExecutorList_Click(object sender, RoutedEventArgs e)
         {
             // Перенаправление пользователя на страницу с задачами
             NavigationService.Navigate(new Pages.ExecutorsListPage());
         }
 
+        // Обработчик события двойного щелчка мыши по элементу в списке задач
         private void LViewTask_MouseDoubleClick(object sender, MouseButtonEventArgs e)
         {
             if (LViewTask.SelectedItem is TaskFill selectedTask)
             {
-                // Проверяем, не является ли статус задачи "выполнена" или "отменена"
+                // Проверка, не является ли статус задачи "выполнена" или "отменена"
                 if (selectedTask.Status != "выполнена" && selectedTask.Status != "отменена")
                 {
-                    AddEditServicePage editPage = new AddEditServicePage(selectedTask); // Передаем выбранную задачу в окно редактирования
-                    NavigationService.Navigate(editPage); // Открываем окно редактирования
+                    AddEditServicePage editPage = new AddEditServicePage(selectedTask); // Передача выбранной задачи в окно редактирования
+                    NavigationService.Navigate(editPage); // Открытие окна редактирования
                 }
                 else
                 {
@@ -281,8 +298,10 @@ namespace esoft.Pages
             }
         }
 
+        // Обработчик события загрузки элемента управления списком задач
         private void LViewTask_Loaded(object sender, RoutedEventArgs e)
         {
+            // Загрузка данных о задачах, исключая удаленные задачи
             taskContext = Class.TaskFill.TaskFills().Where(task => !task.IsDeleted).ToList();
             LViewTask.ItemsSource = taskContext;
             FillForm();

+ 8 - 1
esoft_API/Controllers/UsersController.cs

@@ -16,12 +16,14 @@ namespace esoft_API.Controllers
     {
         private esoftEntities db = new esoftEntities();
 
+        // Получение списка всех пользователей
         // GET: api/Users
         public IQueryable<User> GetUser()
         {
             return db.User;
         }
 
+        // Получение информации о конкретном пользователе по ID
         // GET: api/Users/5
         [ResponseType(typeof(User))]
         public IHttpActionResult GetUser(int id)
@@ -35,6 +37,7 @@ namespace esoft_API.Controllers
             return Ok(user);
         }
 
+        // Обновление информации о пользователе по ID
         // PUT: api/Users/5
         [ResponseType(typeof(void))]
         public IHttpActionResult PutUser(int id, User user)
@@ -70,6 +73,7 @@ namespace esoft_API.Controllers
             return StatusCode(HttpStatusCode.NoContent);
         }
 
+        // Добавление нового пользователя
         // POST: api/Users
         [ResponseType(typeof(User))]
         public IHttpActionResult PostUser(User user)
@@ -85,6 +89,7 @@ namespace esoft_API.Controllers
             return CreatedAtRoute("DefaultApi", new { id = user.ID }, user);
         }
 
+        // Удаление пользователя по ID
         // DELETE: api/Users/5
         [ResponseType(typeof(User))]
         public IHttpActionResult DeleteUser(int id)
@@ -101,6 +106,7 @@ namespace esoft_API.Controllers
             return Ok(user);
         }
 
+        // Освобождение ресурсов, используемых контроллером
         protected override void Dispose(bool disposing)
         {
             if (disposing)
@@ -110,9 +116,10 @@ namespace esoft_API.Controllers
             base.Dispose(disposing);
         }
 
+        // Проверка существования пользователя по ID
         private bool UserExists(int id)
         {
             return db.User.Count(e => e.ID == id) > 0;
         }
     }
-}
+}