Загрузка данных


using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using VasilisaSalon.Models;

namespace VasilisaSalon
{
    public partial class Form1 : Form
    {
        private class ClientItem
        {
            public int ClientId { get; set; }
            public string FullName { get; set; }
            public string Phone { get; set; }
            public string Email { get; set; }
            public bool IsNew { get; set; }
        }

        private class EmployeeItem
        {
            public int EmployeeId { get; set; }
            public string FullName { get; set; }
            public string Phone { get; set; }
            public string Email { get; set; }
            public string PositionName { get; set; }
            public int PositionId { get; set; }
            public bool IsNew { get; set; }
        }

        private class MaterialItem
        {
            public int MaterialId { get; set; }
            public string MaterialName { get; set; }
            public string UnitName { get; set; }
            public int UnitId { get; set; }
            public int StockQty { get; set; }
            public int MinStockQty { get; set; }
            public bool IsNew { get; set; }
        }

        private List<ClientItem> clients = new List<ClientItem>();
        private List<EmployeeItem> employees = new List<EmployeeItem>();
        private List<MaterialItem> materials = new List<MaterialItem>();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LoadClients();
            LoadEmployees();
            LoadMaterials();

            cmbSort.Items.AddRange(new[] { "По ФИО", "По телефону" });
            cmbSort.SelectedIndex = 0;
            txtSearch.TextChanged += Search_Changed;
            cmbSort.SelectedIndexChanged += Search_Changed;

            SaveButton.Visible = false;
            CancelButton.Visible = false;
        }

        // ============================================================
        // ЗАГРУЗКА
        // ============================================================

        private void LoadClients()
        {
            try
            {
                using (var db = new VasilisaSalonEntities())
                {
                    clients = db.client.ToList().Select(c => new ClientItem
                    {
                        ClientId = c.client_id,
                        FullName = c.full_name,
                        Phone = c.phone,
                        Email = c.email ?? "",
                        IsNew = false
                    }).ToList();
                }
                RefreshClientsGrid();
            }
            catch (Exception ex) { MessageBox.Show("Ошибка: " + ex.Message); }
        }

        private void LoadEmployees()
        {
            try
            {
                using (var db = new VasilisaSalonEntities())
                {
                    employees = db.employee.Include("position_ref").ToList()
                        .Select(e => new EmployeeItem
                        {
                            EmployeeId = e.employee_id,
                            FullName = e.full_name,
                            Phone = e.phone,
                            Email = e.email ?? "",
                            PositionName = e.position_ref?.position_name ?? "",
                            PositionId = e.position_id,
                            IsNew = false
                        }).ToList();
                }
                RefreshEmployeesGrid();
            }
            catch (Exception ex) { MessageBox.Show("Ошибка: " + ex.Message); }
        }

        private void LoadMaterials()
        {
            try
            {
                using (var db = new VasilisaSalonEntities())
                {
                    materials = db.material.Include("unit_ref").ToList()
                        .Select(m => new MaterialItem
                        {
                            MaterialId = m.material_id,
                            MaterialName = m.material_name,
                            UnitName = m.unit_ref?.unit_name ?? "",
                            UnitId = m.unit_id,
                            StockQty = m.stock_qty,
                            MinStockQty = m.min_stock_qty,
                            IsNew = false
                        }).ToList();
                }
                RefreshMaterialsGrid();
            }
            catch (Exception ex) { MessageBox.Show("Ошибка: " + ex.Message); }
        }

        // ============================================================
        // ОТОБРАЖЕНИЕ
        // ============================================================

        private void RefreshClientsGrid()
        {
            dataGridViewClients.DataSource = null;
            dataGridViewClients.DataSource = clients;
            dataGridViewClients.AutoGenerateColumns = false;
            if (dataGridViewClients.Columns.Count == 0)
            {
                dataGridViewClients.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "ClientId", HeaderText = "ID", ReadOnly = true, Width = 40 });
                dataGridViewClients.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "FullName", HeaderText = "ФИО", Width = 220 });
                dataGridViewClients.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Phone", HeaderText = "Телефон", Width = 140 });
                dataGridViewClients.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Email", HeaderText = "Email", Width = 180 });
            }
        }

        private void RefreshEmployeesGrid()
        {
            dataGridViewEmployees.DataSource = null;
            dataGridViewEmployees.DataSource = employees;
            dataGridViewEmployees.AutoGenerateColumns = false;
            if (dataGridViewEmployees.Columns.Count == 0)
            {
                dataGridViewEmployees.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "EmployeeId", HeaderText = "ID", ReadOnly = true, Width = 40 });
                dataGridViewEmployees.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "FullName", HeaderText = "ФИО", Width = 220 });
                dataGridViewEmployees.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Phone", HeaderText = "Телефон", Width = 140 });
                dataGridViewEmployees.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Email", HeaderText = "Email", Width = 180 });
                dataGridViewEmployees.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "PositionName", HeaderText = "Должность", ReadOnly = true, Width = 140 });
            }
        }

        private void RefreshMaterialsGrid()
        {
            dataGridViewMaterials.DataSource = null;
            dataGridViewMaterials.DataSource = materials;
            dataGridViewMaterials.AutoGenerateColumns = false;
            if (dataGridViewMaterials.Columns.Count == 0)
            {
                dataGridViewMaterials.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "MaterialId", HeaderText = "ID", ReadOnly = true, Width = 40 });
                dataGridViewMaterials.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "MaterialName", HeaderText = "Название", Width = 220 });
                dataGridViewMaterials.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "UnitName", HeaderText = "Единица", ReadOnly = true, Width = 80 });
                dataGridViewMaterials.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "StockQty", HeaderText = "Остаток", Width = 80 });
                dataGridViewMaterials.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "MinStockQty", HeaderText = "Минимум", Width = 80 });
            }
        }

        // ============================================================
        // ПОИСК И СОРТИРОВКА
        // ============================================================

        private void Search_Changed(object sender, EventArgs e)
        {
            string search = txtSearch.Text.Trim().ToLower();
            string sort = cmbSort.SelectedItem?.ToString();

            if (tabControl1.SelectedTab == tabClients)
            {
                var f = clients.AsEnumerable();
                if (!string.IsNullOrEmpty(search))
                    f = f.Where(c => c.FullName.ToLower().Contains(search) || c.Phone.Contains(search));
                if (sort == "По ФИО") f = f.OrderBy(c => c.FullName);
                else if (sort == "По телефону") f = f.OrderBy(c => c.Phone);
                dataGridViewClients.DataSource = f.ToList();
            }
            else if (tabControl1.SelectedTab == tabEmployees)
            {
                var f = employees.AsEnumerable();
                if (!string.IsNullOrEmpty(search))
                    f = f.Where(c => c.FullName.ToLower().Contains(search) || c.Phone.Contains(search));
                if (sort == "По ФИО") f = f.OrderBy(c => c.FullName);
                else if (sort == "По телефону") f = f.OrderBy(c => c.Phone);
                dataGridViewEmployees.DataSource = f.ToList();
            }
            else if (tabControl1.SelectedTab == tabMaterials)
            {
                var f = materials.AsEnumerable();
                if (!string.IsNullOrEmpty(search))
                    f = f.Where(c => c.MaterialName.ToLower().Contains(search));
                dataGridViewMaterials.DataSource = f.ToList();
            }
        }

        // ============================================================
        // ДОБАВИТЬ / УДАЛИТЬ
        // ============================================================

        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (tabControl1.SelectedTab == tabClients)
            {
                clients.Add(new ClientItem { ClientId = -1, FullName = "Новый клиент", Phone = "+7", Email = "", IsNew = true });
                RefreshClientsGrid();
            }
            else if (tabControl1.SelectedTab == tabEmployees)
            {
                employees.Add(new EmployeeItem { EmployeeId = -1, FullName = "Новый сотрудник", Phone = "+7", Email = "", PositionName = "", PositionId = 1, IsNew = true });
                RefreshEmployeesGrid();
            }
            else if (tabControl1.SelectedTab == tabMaterials)
            {
                materials.Add(new MaterialItem { MaterialId = -1, MaterialName = "Новый материал", UnitName = "шт", UnitId = 3, StockQty = 0, MinStockQty = 0, IsNew = true });
                RefreshMaterialsGrid();
            }
            ShowSaveButtons();
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (tabControl1.SelectedTab == tabClients)
            {
                if (dataGridViewClients.CurrentRow == null) return;
                var item = dataGridViewClients.CurrentRow.DataBoundItem as ClientItem;
                if (item != null) { clients.Remove(item); RefreshClientsGrid(); ShowSaveButtons(); }
            }
            else if (tabControl1.SelectedTab == tabEmployees)
            {
                if (dataGridViewEmployees.CurrentRow == null) return;
                var item = dataGridViewEmployees.CurrentRow.DataBoundItem as EmployeeItem;
                if (item != null) { employees.Remove(item); RefreshEmployeesGrid(); ShowSaveButtons(); }
            }
            else if (tabControl1.SelectedTab == tabMaterials)
            {
                if (dataGridViewMaterials.CurrentRow == null) return;
                var item = dataGridViewMaterials.CurrentRow.DataBoundItem as MaterialItem;
                if (item != null) { materials.Remove(item); RefreshMaterialsGrid(); ShowSaveButtons(); }
            }
        }

        // ============================================================
        // СОХРАНЕНИЕ
        // ============================================================

        private void ShowSaveButtons()
        {
            SaveButton.Visible = true;
            CancelButton.Visible = true;
        }

        private void SaveButton_Click(object sender, EventArgs e)
        {
            try
            {
                dataGridViewClients.EndEdit();
                dataGridViewEmployees.EndEdit();
                dataGridViewMaterials.EndEdit();

                using (var db = new VasilisaSalonEntities())
                {
                    // клиенты
                    foreach (var item in clients)
                    {
                        if (item.IsNew)
                        {
                            db.client.Add(new client
                            {
                                full_name = item.FullName,
                                phone = item.Phone,
                                email = item.Email,
                                reg_date = DateTime.Now,
                                pd_consent = true
                            });
                        }
                        else
                        {
                            var dbItem = db.client.Find(item.ClientId);
                            if (dbItem != null)
                            {
                                dbItem.full_name = item.FullName;
                                dbItem.phone = item.Phone;
                                dbItem.email = item.Email;
                            }
                        }
                    }
                    // удалённые клиенты
                    var clientIds = clients.Where(c => !c.IsNew).Select(c => c.ClientId).ToList();
                    foreach (var dbItem in db.client.ToList())
                        if (!clientIds.Contains(dbItem.client_id))
                            db.client.Remove(dbItem);

                    // сотрудники
                    foreach (var item in employees)
                    {
                        if (item.IsNew)
                        {
                            db.employee.Add(new employee
                            {
                                full_name = item.FullName,
                                phone = item.Phone,
                                email = item.Email,
                                position_id = item.PositionId,
                                hire_date = DateTime.Now,
                                is_active = true
                            });
                        }
                        else
                        {
                            var dbItem = db.employee.Find(item.EmployeeId);
                            if (dbItem != null)
                            {
                                dbItem.full_name = item.FullName;
                                dbItem.phone = item.Phone;
                                dbItem.email = item.Email;
                            }
                        }
                    }
                    // удалённые сотрудники
                    var empIds = employees.Where(e => !e.IsNew).Select(e => e.EmployeeId).ToList();
                    foreach (var dbItem in db.employee.ToList())
                        if (!empIds.Contains(dbItem.employee_id))
                            db.employee.Remove(dbItem);

                    // расходники
                    foreach (var item in materials)
                    {
                        if (item.IsNew)
                        {
                            db.material.Add(new material
                            {
                                material_name = item.MaterialName,
                                unit_id = item.UnitId,
                                stock_qty = item.StockQty,
                                min_stock_qty = item.MinStockQty
                            });
                        }
                        else
                        {
                            var dbItem = db.material.Find(item.MaterialId);
                            if (dbItem != null)
                            {
                                dbItem.material_name = item.MaterialName;
                                dbItem.stock_qty = item.StockQty;
                                dbItem.min_stock_qty = item.MinStockQty;
                            }
                        }
                    }
                    // удалённые расходники
                    var matIds = materials.Where(m => !m.IsNew).Select(m => m.MaterialId).ToList();
                    foreach (var dbItem in db.material.ToList())
                        if (!matIds.Contains(dbItem.material_id))
                            db.material.Remove(dbItem);

                    db.SaveChanges();
                }

                LoadClients();
                LoadEmployees();
                LoadMaterials();
                SaveButton.Visible = false;
                CancelButton.Visible = false;
                MessageBox.Show("Сохранено!");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка: " + (ex.InnerException?.Message ?? ex.Message));
            }
        }

        private void CancelButton_Click(object sender, EventArgs e)
        {
            LoadClients();
            LoadEmployees();
            LoadMaterials();
            SaveButton.Visible = false;
            CancelButton.Visible = false;
        }

        private void txtSearch_TextChanged(object sender, EventArgs e)
        {
            Search_Changed(sender, e);
        }

        private void cmbSort_SelectedIndexChanged(object sender, EventArgs e)
        {
            Search_Changed(sender, e);
        }
    }
}