using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using MySql.Data.MySqlClient; using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; namespace NeshinaPolina2111 { public partial class MainForm : Form { public enum ViewMode { Production, Materials } private ViewMode currentMode = ViewMode.Production; private int userRoleId; // 1=Работник, 2=Менеджер, 3=Партнёр //ЭТО НОВОЕ private Authorization authForm; private int partnerId; private DataTable originalProductionData; // для продукции поиск+ private DataTable originalMaterialsData; // для материалов поиск + public MainForm(int roleId, int partnerId, Authorization authForm) { InitializeComponent(); this.userRoleId = roleId; this.authForm = authForm; this.partnerId = partnerId; ApplyRolePermissions(); UpdateControlVisibility(); продукцияToolStripMenuItem_Click(null, EventArgs.Empty); SetupProductionFiltersAndSorts(); //КОМБОБОКСЫ } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) //ЭТО ЧТОБ ПРИ ЗАКРЫТИИ АВТОРИЗАЦИЯ ВОЗВРАЩАЛАСЬ { e.Cancel = true; this.Hide(); authForm.Show(); } private void ApplyRolePermissions() //ЭТО ОБРАБОТЧИК КНОПОК ПОКАЗА { btnAdd.Visible = true; btnEdit.Visible = true; btnDelete.Visible = true; switch (userRoleId) { case 1: //РАБОТНИК НИЧЕ НЕ МОЖЕТ ДЕЛАТЬ btnAdd.Visible = false; btnEdit.Visible = false; btnDelete.Visible = false; btnMyDiscounts.Visible = false; btnCalculator.Visible = false; txtSearch.Visible = false; label4.Visible = false; //cmbFilter.Visible = false; //cmbSort.Visible = false; //label5.Visible = false; //label6.Visible = false; //txtSearch.Visible = false; this.Text = "Главная форма — Работник"; break; case 2: //МЕНЕДЖЕР МОЖЕТ ВСЁ ДЕЛАТЬ С ИНФОЙ, НО НЕ РАСЧЁТ СКИДОК btnMyDiscounts.Visible = false; this.Text = "Главная форма — Менеджер"; break; case 3: //ПАРТНЁР МОЖЕТ ТОЛЬКО СКИДКУ ДЕЛАТЬ btnAdd.Visible = false; btnEdit.Visible = false; btnDelete.Visible = false; btnMyDiscounts.Visible = true; btnCalculator.Visible = false; txtSearch.Visible = false; label4.Visible = false; //cmbFilter.Visible = false; //cmbSort.Visible = false; //label5.Visible = false; //label6.Visible = false; //txtSearch.Visible = false; this.Text = "Главная форма — Партнёр"; break; case 4: //ВСЁ МОЖНО РАЗРАБУ this.Text = "Главная форма — Разработчик"; break; default: MessageBox.Show("Неизвестная роль. Доступ ограничен."); btnAdd.Visible = false; btnEdit.Visible = false; btnDelete.Visible = false; break; } } private void LoadProduction() //ЗАГРУЗКА ПРОДУКЦИИ + ПОИСК ЧАТЬ { string query = @" SELECT p.idProducts_import, t.TypeProduction, p.Name, p.Article, p.Width, p.MinPrice, COALESCE( (SELECT SUM(m.PriceUnitMaterial * pc.Quantity) FROM Product_composition pc JOIN Materials_import m ON pc.idMaterials_import = m.idMaterials_import WHERE pc.idProducts_import = p.idProducts_import), 0 ) AS CalculatedCost FROM Products_import p LEFT JOIN Product_type_import t ON p.idProduct_type_import = t.idProduct_type_import"; var conn = DB.GetInstance().GetConnection(); if (conn.State == ConnectionState.Closed) conn.Open(); using (var cmd = new MySqlCommand(query, conn)) { var adapter = new MySqlDataAdapter(cmd); originalProductionData = new DataTable(); adapter.Fill(originalProductionData); } dgvMain.DataSource = originalProductionData; currentMode = ViewMode.Production; UpdateControlVisibility(); // ← вызываем здесь // показываем элементы для продукции //txtSearch.Visible = true; //cmbFilter.Visible = true; //cmbSort.Visible = true; originalProductionData.Columns.Add("SearchName", typeof(string), "CONVERT(Name, 'System.String')"); originalProductionData.Columns.Add("SearchArticle", typeof(string), "CONVERT(Article, 'System.String')"); originalProductionData.Columns.Add("SearchType", typeof(string), "CONVERT(TypeProduction, 'System.String')"); originalProductionData.Columns.Add("SearchWidth", typeof(string), "CONVERT(Width, 'System.String')"); originalProductionData.Columns.Add("SearchMinPrice", typeof(string), "CONVERT(MinPrice, 'System.String')"); originalProductionData.Columns.Add("SearchCalculatedCost", typeof(string), "CONVERT(CalculatedCost, 'System.String')"); dgvMain.DataSource = originalProductionData; //СКРОПЙ ВЕРХНИЕ ПОЛЧЯ foreach (DataGridViewColumn col in dgvMain.Columns) { if (col.Name.StartsWith("Search")) col.Visible = false; } ApplySearchFilter(); } private void LoadMaterials() //ЗАГРУЗКА МАТЕРИАЛОВ + ПОИСК ЧАТЬ { string query = @" SELECT m.idMaterials_import AS Id, m.Name, t.Name AS TypeName, m.PriceUnitMaterial, m.Quantity, m.MinQuantity, m.QuantityPack, u.Name AS UnitName FROM Materials_import m LEFT JOIN Material_type_import t ON m.idMaterial_type_import = t.idMaterial_type_import LEFT JOIN Unit u ON m.idUnit = u.idUnit"; var conn = DB.GetInstance().GetConnection(); if (conn.State == ConnectionState.Closed) conn.Open(); using (var cmd = new MySqlCommand(query, conn)) { var adapter = new MySqlDataAdapter(cmd); originalMaterialsData = new DataTable(); adapter.Fill(originalMaterialsData); } dgvMain.DataSource = originalMaterialsData; currentMode = ViewMode.Materials; UpdateControlVisibility(); // ← вызываем здесь //txtSearch.Visible = true; //cmbFilter.Visible = false; //cmbSort.Visible = false; //label5.Visible = false; //label6.Visible = false; //ПОЛЯ ДЛЯ ПОИСК КРЧ originalMaterialsData.Columns.Add("SearchName", typeof(string), "CONVERT(Name, 'System.String')"); originalMaterialsData.Columns.Add("SearchTypeName", typeof(string), "CONVERT(TypeName, 'System.String')"); originalMaterialsData.Columns.Add("SearchPrice", typeof(string), "CONVERT(PriceUnitMaterial, 'System.String')"); originalMaterialsData.Columns.Add("SearchQuantity", typeof(string), "CONVERT(Quantity, 'System.String')"); originalMaterialsData.Columns.Add("SearchMinQuantity", typeof(string), "CONVERT(MinQuantity, 'System.String')"); originalMaterialsData.Columns.Add("SearchQuantityPack", typeof(string), "CONVERT(QuantityPack, 'System.String')"); originalMaterialsData.Columns.Add("SearchUnitName", typeof(string), "CONVERT(UnitName, 'System.String')"); dgvMain.DataSource = originalMaterialsData; foreach (DataGridViewColumn col in dgvMain.Columns) { if (col.Name.StartsWith("Search")) col.Visible = false; } ApplySearchFilter(); } private void ApplySearchFilter() //ПОИСК ПО ВСМЕУ КРТ { string search = txtSearch.Text.Trim(); if (currentMode == ViewMode.Production) { string baseFilter = ""; switch (cmbFilter.SelectedIndex) { case 0: baseFilter = ""; break; case 1: baseFilter = "CalculatedCost > 1000"; break; case 2: baseFilter = "CalculatedCost < 500"; break; case 3: baseFilter = "MinPrice < CalculatedCost"; break; case 4: baseFilter = "Width > 10"; break; } if (!string.IsNullOrEmpty(search)) { search = search.Replace("'", "''"); string searchFilter = $"SearchName LIKE '%{search}%' OR " + $"SearchArticle LIKE '%{search}%' OR " + $"SearchType LIKE '%{search}%' OR " + $"SearchWidth LIKE '%{search}%' OR " + $"SearchMinPrice LIKE '%{search}%' OR " + $"SearchCalculatedCost LIKE '%{search}%'"; if (!string.IsNullOrEmpty(baseFilter)) baseFilter = $"({baseFilter}) AND ({searchFilter})"; else baseFilter = searchFilter; } string sort = ""; switch (cmbSort.SelectedIndex) { case 0: sort = "Name ASC"; break; case 1: sort = "Name DESC"; break; case 2: sort = "CalculatedCost ASC"; break; case 3: sort = "CalculatedCost DESC"; break; case 4: sort = "Article ASC"; break; } try { DataView view = originalProductionData.DefaultView; view.RowFilter = baseFilter; view.Sort = sort; dgvMain.DataSource = view; } catch (Exception ex) { MessageBox.Show($"Ошибка фильтрации продукции: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } else if (currentMode == ViewMode.Materials) { string filter = ""; if (!string.IsNullOrEmpty(search)) { search = search.Replace("'", "''"); filter = $"SearchName LIKE '%{search}%' OR " + $"SearchTypeName LIKE '%{search}%' OR " + $"SearchPrice LIKE '%{search}%' OR " + $"SearchQuantity LIKE '%{search}%' OR " + $"SearchMinQuantity LIKE '%{search}%' OR " + $"SearchQuantityPack LIKE '%{search}%' OR " + $"SearchUnitName LIKE '%{search}%'"; } try { DataView view = originalMaterialsData.DefaultView; view.RowFilter = filter; dgvMain.DataSource = view; } catch (Exception ex) { MessageBox.Show($"Ошибка поиска материалов: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } private void btnAdd_Click(object sender, EventArgs e) //ДОБАВИИТЬ { switch (currentMode) //СМОТРЯ Чё ОТКРЫТО, ТО ОТКРЫВАТЕСЯЧ { case ViewMode.Production: var addProd = new AddProduction(); if (addProd.ShowDialog() == DialogResult.OK) { LoadProduction(); } break; case ViewMode.Materials: var addMat = new AddMaterials(); if (addMat.ShowDialog() == DialogResult.OK) { LoadMaterials(); } break; } } private void btnEdit_Click(object sender, EventArgs e) //ИЗМЕНИТЬ { if (dgvMain.SelectedRows.Count == 0) { MessageBox.Show("Выберите строку для редактирования.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } var selectedRow = dgvMain.SelectedRows[0]; object idValue = null; switch (currentMode) { case ViewMode.Production: idValue = selectedRow.Cells["idProducts_import"]?.Value; if (idValue == null) { MessageBox.Show("Не удалось получить ID продукта.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } int prodId = Convert.ToInt32(idValue); var editProd = new EditProduction { ProductId = prodId }; if (editProd.ShowDialog() == DialogResult.OK) { LoadProduction(); } break; case ViewMode.Materials: idValue = selectedRow.Cells["Id"]?.Value; if (idValue == null) { MessageBox.Show("Не удалось получить ID материала.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } int matId = Convert.ToInt32(idValue); var editMat = new EditMaterials { MaterialId = matId }; if (editMat.ShowDialog() == DialogResult.OK) { LoadMaterials(); } break; } } private void btnDelete_Click(object sender, EventArgs e) //УДАИЛИТЬ { if (dgvMain.SelectedRows.Count == 0) { MessageBox.Show("Выберите строку для удаления.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } var selectedRow = dgvMain.SelectedRows[0]; object idValue = null; string itemName = "неизвестный"; switch (currentMode) { case ViewMode.Production: idValue = selectedRow.Cells["idProducts_import"]?.Value; itemName = selectedRow.Cells["Name"]?.Value?.ToString() ?? "неизвестный"; if (idValue == null) { MessageBox.Show("Не удалось получить ID продукта.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } ConfirmAndDelete("Products_import", "idProducts_import", Convert.ToInt32(idValue), itemName); LoadProduction(); break; case ViewMode.Materials: idValue = selectedRow.Cells["Id"]?.Value; //УДАЛЕНИЕ ПО АЙДИШНИКУ itemName = selectedRow.Cells["Name"]?.Value?.ToString() ?? "неизвестный"; if (idValue == null) { MessageBox.Show("Не удалось получить ID материала.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } ConfirmAndDelete("Materials_import", "idMaterials_import", Convert.ToInt32(idValue), itemName); LoadMaterials(); break; } } private void ConfirmAndDelete(string tableName, string idColumnName, int id, string itemName) //УДАЛЕНИЕ НАДО { var result = MessageBox.Show( $"Вы уверены, что хотите удалить:\n\n«{itemName}»?\n\nЭто действие нельзя отменить.", "Подтверждение удаления", MessageBoxButtons.YesNo, MessageBoxIcon.Warning ); if (result == DialogResult.No) return; string query = $"DELETE FROM {tableName} WHERE {idColumnName} = @id"; var conn = DB.GetInstance().GetConnection(); if (conn.State == ConnectionState.Closed) conn.Open(); using (var cmd = new MySqlCommand(query, conn)) { cmd.Parameters.AddWithValue("@id", id); try { int rowsAffected = cmd.ExecuteNonQuery(); if (rowsAffected > 0) { MessageBox.Show("Запись успешно удалена!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("Не удалось удалить запись.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception ex) { MessageBox.Show($"Ошибка при удалении: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void продукцияToolStripMenuItem_Click(object sender, EventArgs e) { LoadProduction(); } private void списокМатериаловToolStripMenuItem_Click(object sender, EventArgs e) { LoadMaterials(); } private void button1_Click(object sender, EventArgs e) //КАЛЬКУЛЯТОР { var form = new MaterialPurchaseCalculatorForm(); form.ShowDialog(); } private void btnMyDiscounts_Click(object sender, EventArgs e) //ЭТО НА ФОРМУ СО СКИДКАМИ { PartnerDiscountsForm partnerDiscountsForm = new PartnerDiscountsForm(partnerId); partnerDiscountsForm.ShowDialog(); MessageBox.Show($"Текущий partnerId: {partnerId}"); } private void txtSearch_TextChanged(object sender, EventArgs e) { ApplySearchFilter(); } private void SetupProductionFiltersAndSorts() //СОРТ, ФИЛЬТР { // ФИЛЬТРАЦИЯ cmbFilter.Items.Clear(); cmbFilter.Items.Add("Все"); cmbFilter.Items.Add("Себестоимость > 1000 ₽"); cmbFilter.Items.Add("Себестоимость < 500 ₽"); cmbFilter.Items.Add("С минимальной ценой < себестоимости"); cmbFilter.Items.Add("Ширина > 10"); //СОРТИРОЧКА cmbSort.Items.Clear(); cmbSort.Items.Add("По названию (А→Я)"); cmbSort.Items.Add("По названию (Я→А)"); cmbSort.Items.Add("По себестоимости (возр.)"); cmbSort.Items.Add("По себестоимости (убыв.)"); cmbSort.Items.Add("По артикулу"); cmbFilter.SelectedIndex = 0; cmbSort.SelectedIndex = 0; } private void ApplyProductionFilterAndSort() //СОРТИРОВКА, ФИЛТРАЦИЯ { if (currentMode != ViewMode.Production || originalProductionData == null) return; string filter = ""; string sort = ""; switch (cmbFilter.SelectedIndex) { case 0: filter = ""; break; case 1: filter = "CalculatedCost > 1000"; break; case 2: filter = "CalculatedCost < 500"; break; case 3: filter = "MinPrice < CalculatedCost"; break; case 4: filter = "Width > 10"; break; } switch (cmbSort.SelectedIndex) { case 0: sort = "Name ASC"; break; case 1: sort = "Name DESC"; break; case 2: sort = "CalculatedCost ASC"; break; case 3: sort = "CalculatedCost DESC"; break; case 4: sort = "Article ASC"; break; } try { DataView view = originalProductionData.DefaultView; view.RowFilter = filter; view.Sort = sort; dgvMain.DataSource = view; } catch (Exception ex) { MessageBox.Show($"Ошибка применения фильтра/сортировки: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void cmbSort_SelectedIndexChanged(object sender, EventArgs e) { ApplyProductionFilterAndSort(); } private void cmbFilter_SelectedIndexChanged(object sender, EventArgs e) { ApplyProductionFilterAndSort(); } private void UpdateControlVisibility() //СКРЫТИЕ КНОПОК ПРЯМ МНОГО СКРЫВАТЬ { bool isDeveloper = (userRoleId == 4); // РАЗРАБ ВСЁ ВИДИТ bool isManager = (userRoleId == 2); // МЕНЕДЖЕР +- ЧЁТ ВИДИТ bool isWorkerOrPartner = (userRoleId == 1 || userRoleId == 3); // РАБОТЯГА И ПАРТНЁРЫ +- НИЧЕГО НЕ ВИДЯТ bool isProduction = (currentMode == ViewMode.Production); bool isMaterials = (currentMode == ViewMode.Materials); if (isDeveloper) { txtSearch.Visible = true; } else if (isManager) { txtSearch.Visible = isProduction || isMaterials; } else { txtSearch.Visible = false; } if (isDeveloper) { cmbFilter.Visible = isProduction; cmbSort.Visible = isProduction; } else if (isManager) { cmbFilter.Visible = isProduction; cmbSort.Visible = isProduction; } else { cmbFilter.Visible = false; cmbSort.Visible = false; } label5.Visible = isDeveloper; label6.Visible = isDeveloper; } } }