homework24nov/NeshinaPolina2111/Form1.cs
2025-11-24 01:18:10 +04:00

602 lines
24 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}