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


using System;
using System.Collections.Generic;
using System.Data.SqlClient;

namespace MilkFactory
{
    public static class Data
    {
        private static string cs = @"Data Source=EDGE-PC\SQLEXPRESS;Initial Catalog=MilkFactoryDB;Integrated Security=True";

        public static List<User> GetUsers()
        {
            var list = new List<User>();
            using (var c = new SqlConnection(cs))
            {
                c.Open();
                var r = new SqlCommand("SELECT * FROM Users", c).ExecuteReader();
                while (r.Read())
                    list.Add(new User((int)r["Id"], (string)r["Login"], (string)r["Password"], (string)r["Role"], (bool)r["IsBlocked"]));
            }
            return list;
        }

        public static User Auth(string login, string pass)
        {
            using (var c = new SqlConnection(cs))
            {
                c.Open();
                var cmd = new SqlCommand("SELECT * FROM Users WHERE Login=@l AND Password=@p", c);
                cmd.Parameters.AddWithValue("@l", login);
                cmd.Parameters.AddWithValue("@p", pass);
                var r = cmd.ExecuteReader();
                if (r.Read())
                    return new User((int)r["Id"], (string)r["Login"], (string)r["Password"], (string)r["Role"], (bool)r["IsBlocked"]);
                return null;
            }
        }

        public static void ChangePass(string login, string pass)
        {
            using (var c = new SqlConnection(cs))
            {
                c.Open();
                var cmd = new SqlCommand("UPDATE Users SET Password=@p WHERE Login=@l", c);
                cmd.Parameters.AddWithValue("@p", pass);
                cmd.Parameters.AddWithValue("@l", login);
                cmd.ExecuteNonQuery();
            }
        }

        public static void AddUser(string login, string pass, string role)
        {
            using (var c = new SqlConnection(cs))
            {
                c.Open();
                var cmd = new SqlCommand("INSERT INTO Users (Login, Password, Role, IsBlocked) VALUES (@l,@p,@r,0)", c);
                cmd.Parameters.AddWithValue("@l", login);
                cmd.Parameters.AddWithValue("@p", pass);
                cmd.Parameters.AddWithValue("@r", role);
                cmd.ExecuteNonQuery();
            }
        }

        public static void UpdateUser(string oldLogin, string newLogin, string newPass)
        {
            using (var c = new SqlConnection(cs))
            {
                c.Open();
                var cmd = new SqlCommand("UPDATE Users SET Login=@nl, Password=@np WHERE Login=@ol", c);
                cmd.Parameters.AddWithValue("@nl", newLogin);
                cmd.Parameters.AddWithValue("@np", newPass);
                cmd.Parameters.AddWithValue("@ol", oldLogin);
                cmd.ExecuteNonQuery();
            }
        }

        public static void BlockUser(string login)
        {
            using (var c = new SqlConnection(cs))
            {
                c.Open();
                new SqlCommand($"UPDATE Users SET IsBlocked=1 WHERE Login='{login}'", c).ExecuteNonQuery();
            }
        }

        public static void UnblockUser(string login)
        {
            using (var c = new SqlConnection(cs))
            {
                c.Open();
                new SqlCommand($"UPDATE Users SET IsBlocked=0 WHERE Login='{login}'", c).ExecuteNonQuery();
            }
        }
    }
}
















using System;
using System.Windows.Forms;

namespace MilkFactory
{
    public class LoginForm : Form
    {
        TextBox tbLogin = new TextBox { Left = 110, Top = 20, Width = 160 };
        TextBox tbPass = new TextBox { Left = 110, Top = 60, Width = 160, PasswordChar = '*' };
        Button btn = new Button { Left = 110, Top = 100, Width = 160, Text = "Войти" };
        int attempts = 0;
        DateTime blockTime;
        Timer timer = new Timer { Interval = 1000 };

        public LoginForm()
        {
            Text = "Молочный комбинат";
            Width = 320; Height = 190;
            Controls.AddRange(new Control[] {
                new Label { Text = "Логин:", Left = 20, Top = 20, Width = 80 },
                new Label { Text = "Пароль:", Left = 20, Top = 60, Width = 80 },
                tbLogin, tbPass, btn
            });
            btn.Click += Login;
            timer.Tick += (s, e) => { if (DateTime.Now >= blockTime) { timer.Stop(); btn.Enabled = true; attempts = 0; MessageBox.Show("Блокировка снята!"); } };
        }

        void Login(object sender, EventArgs e)
        {
            if (DateTime.Now < blockTime) { MessageBox.Show($"Блокировка! Осталось {(blockTime - DateTime.Now).Minutes} мин"); return; }
            if (string.IsNullOrEmpty(tbLogin.Text) || string.IsNullOrEmpty(tbPass.Text)) { MessageBox.Show("Введите логин и пароль"); return; }

            var user = Data.Auth(tbLogin.Text, tbPass.Text);
            if (user == null)
            {
                if (++attempts >= 3) { blockTime = DateTime.Now.AddMinutes(15); btn.Enabled = false; timer.Start(); MessageBox.Show("3 ошибки! Блокировка 15 мин"); }
                else MessageBox.Show($"Неверно. Попытка {attempts} из 3");
                return;
            }
            if (user.Blocked) { MessageBox.Show("Пользователь заблокирован"); return; }

            attempts = 0;
            if (user.Role == "admin") OpenAdmin(); else ChangePassword(user);
        }

        void ChangePassword(User u)
        {
            var f = new Form { Text = "Смена пароля", Width = 320, Height = 150, FormBorderStyle = FormBorderStyle.FixedDialog, StartPosition = FormStartPosition.CenterScreen };
            var t = new TextBox { Left = 130, Top = 20, Width = 150, PasswordChar = '*' };
            var b = new Button { Left = 130, Top = 60, Width = 150, Text = "Изменить" };
            f.Controls.AddRange(new Control[] { new Label { Text = "Новый пароль:", Left = 20, Top = 20 }, t, b });
            b.Click += (s, ev) => { if (string.IsNullOrEmpty(t.Text)) { MessageBox.Show("Введите пароль"); return; } Data.ChangePass(u.Login, t.Text); MessageBox.Show("Пароль изменён"); f.Close(); };
            f.ShowDialog();
        }

        void OpenAdmin()
        {
            var f = new Form { Text = "Админ-панель", Width = 420, Height = 420, FormBorderStyle = FormBorderStyle.FixedDialog, StartPosition = FormStartPosition.CenterScreen };
            var list = new ListBox { Left = 20, Top = 20, Width = 360, Height = 150 };
            var tbLogin = new TextBox { Left = 100, Top = 190, Width = 280 };
            var tbPass = new TextBox { Left = 100, Top = 230, Width = 280 };
            var btnAdd = new Button { Left = 20, Top = 280, Width = 80, Text = "Добавить" };
            var btnEdit = new Button { Left = 110, Top = 280, Width = 80, Text = "Изменить" };
            var btnBlock = new Button { Left = 200, Top = 280, Width = 90, Text = "Блок/Разблок" };
            var btnRefresh = new Button { Left = 300, Top = 280, Width = 80, Text = "Обновить" };

            f.Controls.AddRange(new Control[] { list, new Label { Text = "Логин:", Left = 20, Top = 190, Width = 80 }, new Label { Text = "Пароль:", Left = 20, Top = 230, Width = 80 }, tbLogin, tbPass, btnAdd, btnEdit, btnBlock, btnRefresh });

            Action load = () => { list.Items.Clear(); try { foreach (var u in Data.GetUsers()) if (!u.Blocked) list.Items.Add(u); } catch (Exception ex) { MessageBox.Show($"Ошибка: {ex.Message}"); } };
            load();

            list.SelectedIndexChanged += (s, ev) => { if (list.SelectedItem is User u) { tbLogin.Text = u.Login; tbPass.Text = u.Password; } };

            btnAdd.Click += (s, ev) =>
            {
                if (string.IsNullOrEmpty(tbLogin.Text) || string.IsNullOrEmpty(tbPass.Text)) { MessageBox.Show("Заполните поля"); return; }
                try { Data.AddUser(tbLogin.Text, tbPass.Text, "user"); load(); MessageBox.Show("Добавлен!"); tbLogin.Clear(); tbPass.Clear(); } catch (Exception ex) { MessageBox.Show($"Ошибка: {ex.Message}"); }
            };

            btnEdit.Click += (s, ev) =>
            {
                if (list.SelectedItem is User u) { try { Data.UpdateUser(u.Login, tbLogin.Text, tbPass.Text); load(); MessageBox.Show("Изменено!"); } catch (Exception ex) { MessageBox.Show($"Ошибка: {ex.Message}"); } }
                else MessageBox.Show("Выберите пользователя");
            };

            btnBlock.Click += (s, ev) =>
            {
                if (list.SelectedItem is User u)
                {
                    try { if (u.Blocked) Data.UnblockUser(u.Login); else Data.BlockUser(u.Login); load(); MessageBox.Show(u.Blocked ? "Разблокирован" : "Заблокирован"); }
                    catch (Exception ex) { MessageBox.Show($"Ошибка: {ex.Message}"); }
                }
                else MessageBox.Show("Выберите пользователя");
            };

            btnRefresh.Click += (s, ev) => load();
            f.ShowDialog();
        }
    }
}


using System;
using System.Windows.Forms;

namespace MilkFactory
{
    internal static class Program
    {
        [STAThread]
        static void Main() { Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new LoginForm()); }
    }
}






using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MilkFactory
{
    public class User
    {
        public int Id { get; set; }
        public string Login { get; set; }
        public string Password { get; set; }
        public string Role { get; set; }
        public bool Blocked { get; set; }

        public User(int id, string login, string pass, string role, bool blocked)
        {
            Id = id; Login = login; Password = pass; Role = role; Blocked = blocked;
        }

        public override string ToString() => Login;
    }
}







CREATE DATABASE MilkFactoryDB;
GO
USE MilkFactoryDB;
GO

-- ===== 1. ПОЛЬЗОВАТЕЛИ =====
CREATE TABLE Users (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Login NVARCHAR(50) UNIQUE NOT NULL,
    Password NVARCHAR(50) NOT NULL,
    Role NVARCHAR(20) NOT NULL DEFAULT 'user',
    IsBlocked BIT NOT NULL DEFAULT 0
);
GO

-- ===== 2. ЗАКАЗЧИКИ =====
CREATE TABLE Customers (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    CustomerId NVARCHAR(20) UNIQUE,
    Name NVARCHAR(200) NOT NULL,
    INN NVARCHAR(20) NULL,
    Address NVARCHAR(200) NULL,
    Phone NVARCHAR(20) NULL,
    IsSalesman BIT DEFAULT 0,
    IsBuyer BIT DEFAULT 1
);
GO

-- ===== 3. ПРОДУКТЫ =====
CREATE TABLE Products (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Code NVARCHAR(20) NULL,
    Name NVARCHAR(200) NOT NULL,
    Price DECIMAL(18,2) NOT NULL,
    Unit NVARCHAR(20) DEFAULT 'шт'
);
GO

-- ===== 4. МАТЕРИАЛЫ =====
CREATE TABLE Materials (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Code NVARCHAR(20) NULL,
    Name NVARCHAR(200) NOT NULL,
    Price DECIMAL(18,2) NOT NULL,
    Unit NVARCHAR(20) DEFAULT 'кг'
);
GO

-- ===== 5. ЗАКАЗЫ (связь с Customers) =====
CREATE TABLE Orders (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    OrderNumber NVARCHAR(50) NOT NULL,
    OrderDate DATETIME NOT NULL,
    CustomerId INT NOT NULL,
    Executor NVARCHAR(200),
    TotalSum DECIMAL(18,2) NOT NULL,
    FOREIGN KEY (CustomerId) REFERENCES Customers(Id)  -- ← СВЯЗЬ!
);
GO

-- ===== 6. ДЕТАЛИ ЗАКАЗОВ (связи с Orders и Products) =====
CREATE TABLE OrderDetails (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    OrderId INT NOT NULL,
    ProductId INT NOT NULL,
    Quantity DECIMAL(18,3) NOT NULL,
    Price DECIMAL(18,2) NOT NULL,
    Sum DECIMAL(18,2) NOT NULL,
    FOREIGN KEY (OrderId) REFERENCES Orders(Id) ON DELETE CASCADE, 
    FOREIGN KEY (ProductId) REFERENCES Products(Id)               
);
GO

-- ===== 7. ПРОИЗВОДСТВО (связь с Products) =====
CREATE TABLE Productions (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    ProductionNumber NVARCHAR(50) NOT NULL,
    ProductionDate DATETIME NOT NULL,
    ProductId INT NOT NULL,                                       
    FOREIGN KEY (ProductId) REFERENCES Products(Id)          
);
GO

-- ===== 8. СПЕЦИФИКАЦИИ (связи с Products и Materials) =====
CREATE TABLE Specifications (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    ProductId INT NOT NULL,
    MaterialId INT NOT NULL,
    Quantity DECIMAL(18,3) NOT NULL,
    FOREIGN KEY (ProductId) REFERENCES Products(Id),             
    FOREIGN KEY (MaterialId) REFERENCES Materials(Id)            
);
GO

-- 1. ПОЛЬЗОВАТЕЛИ
INSERT INTO Users (Login, Password, Role, IsBlocked) VALUES 
('admin', 'admin123', 'admin', 0),
('user1', 'pass123', 'user', 0),
('user2', 'pass123', 'user', 0);
GO

-- 2. ЗАКАЗЧИКИ
INSERT INTO Customers (CustomerId, Name, INN, Address, Phone, IsSalesman, IsBuyer) VALUES 
('000000001', 'ООО "Поставка"', '', 'г.Пятигорск', '+79198634592', 1, 1),
('000000002', 'ООО "Кинотеатр Квант"', '26320045123', 'г. Железноводск, ул. Мира, 123', '+79884581555', 1, 0),
('000000008', 'ООО "Новый JDTO"', '26320045111', 'г. Железноводсу', '+79884581555', 1, 0),
('000000003', 'ООО "Ромашка"', '4140784214', 'г. Омск, ул. Строителей, 294', '+79882584546', 0, 1),
('000000009', 'ООО "Ипподром"', '5874045632', 'г. Уфа, ул. Набережная, 37', '+79627486389', 1, 1),
('000000010', 'ООО "Ассоль"', '2629011278', 'г. Калуга, ул. Пушкина, 94', '+79184572398', 0, 1);
GO

-- 3. ПРОДУКТЫ
INSERT INTO Products (Code, Name, Price, Unit) VALUES 
('НФ-00000006', 'Сметана классическая 15% 540г.', 89, 'шт'),
(NULL, 'Сметана классическая 20% 540г.', 92, 'шт'),
(NULL, 'Кефир 2,5% 900г.', 80, 'шт'),
(NULL, 'Кефир 3,2% 900г.', 82, 'шт'),
(NULL, 'Молоко 2,5% 900г.', 70, 'шт'),
(NULL, 'Молоко 3,2% 900г.', 76, 'шт');
GO

-- 4. МАТЕРИАЛЫ
INSERT INTO Materials (Code, Name, Price, Unit) VALUES 
('НФ-00000004', 'Молоко нормализованное', 34, 'кг'),
('НФ-00000005', 'Закваска сметанная', 45, 'кг');
GO

-- 5. ПРОИЗВОДСТВО (связь с ProductId = 1)
INSERT INTO Productions (ProductionNumber, ProductionDate, ProductId) VALUES 
('1', '2025-06-09', 1);
GO

-- 6. СПЕЦИФИКАЦИИ (связи с ProductId=1 и MaterialId=1,2)
INSERT INTO Specifications (ProductId, MaterialId, Quantity) VALUES 
(1, 1, 0.9),
(1, 2, 0.07);
GO

-- 7. ЗАКАЗЫ (связь с CustomerId=6)
INSERT INTO Orders (OrderNumber, OrderDate, CustomerId, Executor, TotalSum) VALUES 
('2', '2025-06-06', 6, 'ООО Молочный комбинат "Полесье"', 2488);
GO

-- 8. ДЕТАЛИ ЗАКАЗОВ (связи с OrderId=1 и ProductId=3,4,5)
INSERT INTO OrderDetails (OrderId, ProductId, Quantity, Price, Sum) VALUES 
(1, 3, 12, 80, 960),
(1, 4, 9, 82, 738),
(1, 5, 10, 79, 790);
GO

-- ===== ПРОВЕРКА =====
SELECT 'Users' as TableName, COUNT(*) as Count FROM Users
UNION ALL
SELECT 'Customers', COUNT(*) FROM Customers
UNION ALL
SELECT 'Products', COUNT(*) FROM Products
UNION ALL
SELECT 'Materials', COUNT(*) FROM Materials
UNION ALL
SELECT 'Orders', COUNT(*) FROM Orders
UNION ALL
SELECT 'OrderDetails', COUNT(*) FROM OrderDetails
UNION ALL
SELECT 'Productions', COUNT(*) FROM Productions
UNION ALL
SELECT 'Specifications', COUNT(*) FROM Specifications;
GO