| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657 |
- using System;
- using System.Data;
- using System.Security.Cryptography;
- using System.Text;
- using Npgsql;
- using System.Configuration;
- using System.Windows.Forms;
- namespace WindowsFormsApp4
- {
- public static class DatabaseHelper
- {
- private static string connectionString = ConfigurationManager.ConnectionStrings["PostgreSQL"].ConnectionString;
- public static NpgsqlConnection GetConnection()
- {
- return new NpgsqlConnection(connectionString);
- }
- public static bool TestConnection()
- {
- try
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- return true;
- }
- }
- catch (Exception ex)
- {
- System.Diagnostics.Debug.WriteLine($"Ошибка подключения: {ex.Message}");
- return false;
- }
- }
- public static string HashPassword(string password)
- {
- using (SHA256 sha256 = SHA256.Create())
- {
- byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(password));
- StringBuilder builder = new StringBuilder();
- foreach (byte b in bytes)
- builder.Append(b.ToString("x2"));
- return builder.ToString();
- }
- }
- public class User
- {
- public int UserId { get; set; }
- public string LastName { get; set; }
- public string FirstName { get; set; }
- public string MiddleName { get; set; }
- public string Phone { get; set; }
- public string Role { get; set; }
- public bool IsActive { get; set; }
- public int? ClientId { get; set; }
- public int? ManagerId { get; set; }
- }
- public static User Authenticate(string login, string password)
- {
- string passwordHash = HashPassword(password);
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- SELECT u.user_id, u.last_name, u.first_name, u.middle_name,
- u.phone, u.role_name, u.is_active, u.client_id, u.manager_id
- FROM users u
- JOIN user_auth a ON u.user_id = a.user_id
- WHERE a.login = @login AND a.password_hash = @password_hash AND u.is_active = true";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@login", login);
- cmd.Parameters.AddWithValue("@password_hash", passwordHash);
- using (var reader = cmd.ExecuteReader())
- {
- if (reader.Read())
- {
- return new User
- {
- UserId = reader.GetInt32(0),
- LastName = reader.GetString(1),
- FirstName = reader.GetString(2),
- MiddleName = reader.IsDBNull(3) ? null : reader.GetString(3),
- Phone = reader.GetString(4),
- Role = reader.GetString(5),
- IsActive = reader.GetBoolean(6),
- ClientId = reader.IsDBNull(7) ? null : (int?)reader.GetInt32(7),
- ManagerId = reader.IsDBNull(8) ? null : (int?)reader.GetInt32(8)
- };
- }
- }
- }
- }
- return null;
- }
- public static DataTable GetRequests(int userId, string role, int? clientId = null, int? managerId = null)
- {
- DataTable dt = new DataTable();
- string sql;
- if (role == "admin")
- {
- sql = @"
- SELECT r.id, c.last_name || ' ' || c.first_name AS client_name,
- COALESCE(m.last_name || ' ' || m.first_name, 'Не назначен') AS manager_name,
- r.request_date, r.measurement_datetime, r.status
- FROM request r
- LEFT JOIN client c ON r.client_id = c.client_id
- LEFT JOIN manager m ON r.manager_id = m.id
- ORDER BY r.request_date DESC";
- }
- else if (role == "manager" && managerId.HasValue)
- {
- sql = @"
- SELECT r.id, c.last_name || ' ' || c.first_name AS client_name,
- r.request_date, r.measurement_datetime, r.status
- FROM request r
- JOIN client c ON r.client_id = c.client_id
- WHERE r.status = 'new' OR r.manager_id = @managerId
- ORDER BY r.request_date DESC";
- }
- else if (role == "client" && clientId.HasValue)
- {
- sql = @"
- SELECT r.id, r.request_date, r.measurement_datetime, r.status
- FROM request r
- WHERE r.client_id = @clientId
- ORDER BY r.request_date DESC";
- }
- else
- {
- return dt;
- }
- using (var conn = GetConnection())
- {
- conn.Open();
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- if (role == "manager" && managerId.HasValue)
- cmd.Parameters.AddWithValue("@managerId", managerId.Value);
- if (role == "client" && clientId.HasValue)
- cmd.Parameters.AddWithValue("@clientId", clientId.Value);
- using (var adapter = new NpgsqlDataAdapter(cmd))
- {
- adapter.Fill(dt);
- }
- }
- }
- return dt;
- }
- public static bool UpdateRequestStatus(int requestId, string newStatus)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = "UPDATE request SET status = @status WHERE id = @id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@status", newStatus);
- cmd.Parameters.AddWithValue("@id", requestId);
- return cmd.ExecuteNonQuery() > 0;
- }
- }
- }
- public static DataTable GetClients()
- {
- DataTable dt = new DataTable();
- string sql = "SELECT client_id, last_name, first_name, middle_name, phone FROM client ORDER BY last_name";
- using (var conn = GetConnection())
- {
- conn.Open();
- using (var adapter = new NpgsqlDataAdapter(sql, conn))
- {
- adapter.Fill(dt);
- }
- }
- return dt;
- }
- public static DataTable GetManagers()
- {
- DataTable dt = new DataTable();
- string sql = "SELECT id AS manager_id, last_name, first_name, phone FROM manager ORDER BY last_name";
- using (var conn = GetConnection())
- {
- conn.Open();
- using (var adapter = new NpgsqlDataAdapter(sql, conn))
- {
- adapter.Fill(dt);
- }
- }
- return dt;
- }
- public static DataTable GetManagerStatistics()
- {
- DataTable dt = new DataTable();
- string sql = @"SELECT * FROM zimogorov_aa.manager_statistics ORDER BY completed_requests DESC";
- using (var conn = GetConnection())
- {
- conn.Open();
- using (var adapter = new NpgsqlDataAdapter(sql, conn))
- {
- adapter.Fill(dt);
- }
- }
- return dt;
- }
- public static DataTable GetManagerPerformance(DateTime startDate, DateTime endDate)
- {
- DataTable dt = new DataTable();
- string sql = @"SELECT * FROM zimogorov_aa.get_manager_performance(@start_date::date, @end_date::date)";
- using (var conn = GetConnection())
- {
- conn.Open();
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@start_date", startDate);
- cmd.Parameters.AddWithValue("@end_date", endDate);
- using (var adapter = new NpgsqlDataAdapter(cmd))
- {
- adapter.Fill(dt);
- }
- }
- }
- return dt;
- }
- public static int AddClient(string lastName, string firstName, string middleName, string phone)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- INSERT INTO client (last_name, first_name, middle_name, phone)
- VALUES (@last_name, @first_name, @middle_name, @phone)
- RETURNING client_id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@last_name", lastName);
- cmd.Parameters.AddWithValue("@first_name", firstName);
- cmd.Parameters.AddWithValue("@middle_name", string.IsNullOrEmpty(middleName) ? (object)DBNull.Value : middleName);
- cmd.Parameters.AddWithValue("@phone", phone);
- return (int)cmd.ExecuteScalar();
- }
- }
- }
- public static int AddManager(string lastName, string firstName, string middleName, string phone)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- INSERT INTO manager (last_name, first_name, middle_name, phone)
- VALUES (@last_name, @first_name, @middle_name, @phone)
- RETURNING id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@last_name", lastName);
- cmd.Parameters.AddWithValue("@first_name", firstName);
- cmd.Parameters.AddWithValue("@middle_name", string.IsNullOrEmpty(middleName) ? (object)DBNull.Value : middleName);
- cmd.Parameters.AddWithValue("@phone", phone);
- return (int)cmd.ExecuteScalar();
- }
- }
- }
- public static bool DeleteClient(int clientId)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = "DELETE FROM client WHERE client_id = @client_id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@client_id", clientId);
- return cmd.ExecuteNonQuery() > 0;
- }
- }
- }
- public static bool DeleteManager(int managerId)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = "DELETE FROM manager WHERE id = @id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@id", managerId);
- return cmd.ExecuteNonQuery() > 0;
- }
- }
- }
- public static bool LoginExists(string login)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = "SELECT COUNT(*) FROM user_auth WHERE login = @login";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@login", login);
- long count = (long)cmd.ExecuteScalar();
- return count > 0;
- }
- }
- }
- public static bool PhoneExists(string phone)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = "SELECT COUNT(*) FROM client WHERE phone = @phone";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@phone", phone);
- long count = (long)cmd.ExecuteScalar();
- return count > 0;
- }
- }
- }
- public static int RegisterClient(string lastName, string firstName, string middleName, string phone)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- INSERT INTO client (last_name, first_name, middle_name, phone)
- VALUES (@last_name, @first_name, @middle_name, @phone)
- RETURNING client_id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@last_name", lastName);
- cmd.Parameters.AddWithValue("@first_name", firstName);
- cmd.Parameters.AddWithValue("@middle_name", string.IsNullOrEmpty(middleName) ? (object)DBNull.Value : middleName);
- cmd.Parameters.AddWithValue("@phone", phone);
- return (int)cmd.ExecuteScalar();
- }
- }
- }
- public static int CreateUser(string lastName, string firstName, string middleName, string phone, string role, int? clientId, int? managerId)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- INSERT INTO users (last_name, first_name, middle_name, phone, role_name, client_id, manager_id, created_at, is_active)
- VALUES (@last_name, @first_name, @middle_name, @phone, @role::user_role, @client_id, @manager_id, CURRENT_DATE, true)
- RETURNING user_id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@last_name", lastName);
- cmd.Parameters.AddWithValue("@first_name", firstName);
- cmd.Parameters.AddWithValue("@middle_name", string.IsNullOrEmpty(middleName) ? (object)DBNull.Value : middleName);
- cmd.Parameters.AddWithValue("@phone", phone);
- cmd.Parameters.AddWithValue("@role", role);
- cmd.Parameters.AddWithValue("@client_id", clientId.HasValue ? (object)clientId.Value : DBNull.Value);
- cmd.Parameters.AddWithValue("@manager_id", managerId.HasValue ? (object)managerId.Value : DBNull.Value);
- return (int)cmd.ExecuteScalar();
- }
- }
- }
- public static bool CreateUserAuth(int userId, string login, string password)
- {
- string passwordHash = HashPassword(password);
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- INSERT INTO user_auth (user_id, login, password_hash, created_at, is_current)
- VALUES (@user_id, @login, @password_hash, CURRENT_TIMESTAMP, true)";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@user_id", userId);
- cmd.Parameters.AddWithValue("@login", login);
- cmd.Parameters.AddWithValue("@password_hash", passwordHash);
- return cmd.ExecuteNonQuery() > 0;
- }
- }
- }
- public static bool UpdateClient(int clientId, string lastName, string firstName, string middleName, string phone)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- UPDATE client
- SET last_name = @last_name,
- first_name = @first_name,
- middle_name = @middle_name,
- phone = @phone
- WHERE client_id = @client_id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@client_id", clientId);
- cmd.Parameters.AddWithValue("@last_name", lastName);
- cmd.Parameters.AddWithValue("@first_name", firstName);
- cmd.Parameters.AddWithValue("@middle_name", string.IsNullOrEmpty(middleName) ? (object)DBNull.Value : middleName);
- cmd.Parameters.AddWithValue("@phone", phone);
- return cmd.ExecuteNonQuery() > 0;
- }
- }
- }
- public static bool UpdateManager(int managerId, string lastName, string firstName, string middleName, string phone)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- UPDATE manager
- SET last_name = @last_name,
- first_name = @first_name,
- middle_name = @middle_name,
- phone = @phone
- WHERE id = @id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@id", managerId);
- cmd.Parameters.AddWithValue("@last_name", lastName);
- cmd.Parameters.AddWithValue("@first_name", firstName);
- cmd.Parameters.AddWithValue("@middle_name", string.IsNullOrEmpty(middleName) ? (object)DBNull.Value : middleName);
- cmd.Parameters.AddWithValue("@phone", phone);
- return cmd.ExecuteNonQuery() > 0;
- }
- }
- }
- public static int GetManagerActiveRequests(int managerId)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = "SELECT COUNT(*) FROM request WHERE manager_id = @manager_id AND status IN ('new', 'in_progress')";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@manager_id", managerId);
- return Convert.ToInt32(cmd.ExecuteScalar());
- }
- }
- }
- public static DataTable GetClientAddresses(int clientId)
- {
- DataTable dt = new DataTable();
- string sql = @"
- SELECT a.id AS address_id,
- a.city || ', ' || a.street || ', ' || a.house ||
- CASE WHEN a.apartment IS NOT NULL AND a.apartment != ''
- THEN ', кв. ' || a.apartment
- ELSE '' END AS address_text
- FROM client_address ca
- JOIN address a ON ca.address_id = a.id
- WHERE ca.client_id = @client_id
- ORDER BY ca.priority ASC";
- using (var conn = GetConnection())
- {
- conn.Open();
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@client_id", clientId);
- using (var adapter = new NpgsqlDataAdapter(cmd))
- {
- adapter.Fill(dt);
- }
- }
- }
- return dt;
- }
- public static int CreateRequest(int clientId, DateTime measurementDateTime)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- INSERT INTO request (client_id, request_date, measurement_datetime, status)
- VALUES (@client_id, CURRENT_DATE, @measurement_datetime, 'new')
- RETURNING id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@client_id", clientId);
- cmd.Parameters.AddWithValue("@measurement_datetime", measurementDateTime);
- return (int)cmd.ExecuteScalar();
- }
- }
- }
- public static DataTable GetClientAddressesWithDetails(int clientId)
- {
- DataTable dt = new DataTable();
- string sql = @"
- SELECT a.id AS address_id, a.city, a.street, a.house, a.building, a.apartment,
- ca.address_type, ca.priority
- FROM client_address ca
- JOIN address a ON ca.address_id = a.id
- WHERE ca.client_id = @client_id
- ORDER BY ca.priority ASC";
- using (var conn = GetConnection())
- {
- conn.Open();
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@client_id", clientId);
- using (var adapter = new NpgsqlDataAdapter(cmd))
- {
- adapter.Fill(dt);
- }
- }
- }
- return dt;
- }
- public static int AddAddress(string city, string street, string house, string building, string apartment)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- INSERT INTO address (city, street, house, building, apartment)
- VALUES (@city, @street, @house, @building, @apartment)
- RETURNING id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@city", city);
- cmd.Parameters.AddWithValue("@street", street);
- cmd.Parameters.AddWithValue("@house", house);
- cmd.Parameters.AddWithValue("@building", string.IsNullOrEmpty(building) ? (object)DBNull.Value : building);
- cmd.Parameters.AddWithValue("@apartment", string.IsNullOrEmpty(apartment) ? (object)DBNull.Value : apartment);
- return (int)cmd.ExecuteScalar();
- }
- }
- }
- public static bool UpdateAddress(int addressId, string city, string street, string house, string building, string apartment)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- UPDATE address
- SET city = @city, street = @street, house = @house,
- building = @building, apartment = @apartment
- WHERE id = @id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@id", addressId);
- cmd.Parameters.AddWithValue("@city", city);
- cmd.Parameters.AddWithValue("@street", street);
- cmd.Parameters.AddWithValue("@house", house);
- cmd.Parameters.AddWithValue("@building", string.IsNullOrEmpty(building) ? (object)DBNull.Value : building);
- cmd.Parameters.AddWithValue("@apartment", string.IsNullOrEmpty(apartment) ? (object)DBNull.Value : apartment);
- return cmd.ExecuteNonQuery() > 0;
- }
- }
- }
- public static bool AddClientAddress(int clientId, int addressId, string addressType, int priority)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = @"
- INSERT INTO client_address (client_id, address_id, address_type, priority)
- VALUES (@client_id, @address_id, @address_type, @priority)";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@client_id", clientId);
- cmd.Parameters.AddWithValue("@address_id", addressId);
- cmd.Parameters.AddWithValue("@address_type", addressType);
- cmd.Parameters.AddWithValue("@priority", priority);
- return cmd.ExecuteNonQuery() > 0;
- }
- }
- }
- public static bool DeleteClientAddress(int clientId, int addressId)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = "DELETE FROM client_address WHERE client_id = @client_id AND address_id = @address_id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@client_id", clientId);
- cmd.Parameters.AddWithValue("@address_id", addressId);
- return cmd.ExecuteNonQuery() > 0;
- }
- }
- }
- public static bool SetMainAddress(int clientId, int addressId)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- using (var trans = conn.BeginTransaction())
- {
- string sqlReset = "UPDATE client_address SET priority = 10 WHERE client_id = @client_id";
- using (var cmdReset = new NpgsqlCommand(sqlReset, conn, trans))
- {
- cmdReset.Parameters.AddWithValue("@client_id", clientId);
- cmdReset.ExecuteNonQuery();
- }
- string sqlSet = "UPDATE client_address SET priority = 1 WHERE client_id = @client_id AND address_id = @address_id";
- using (var cmdSet = new NpgsqlCommand(sqlSet, conn, trans))
- {
- cmdSet.Parameters.AddWithValue("@client_id", clientId);
- cmdSet.Parameters.AddWithValue("@address_id", addressId);
- cmdSet.ExecuteNonQuery();
- }
- trans.Commit();
- return true;
- }
- }
- }
- public static bool AssignManagerToRequest(int requestId, int managerId)
- {
- using (var conn = GetConnection())
- {
- conn.Open();
- string sql = "UPDATE request SET manager_id = @manager_id WHERE id = @request_id";
- using (var cmd = new NpgsqlCommand(sql, conn))
- {
- cmd.Parameters.AddWithValue("@request_id", requestId);
- cmd.Parameters.AddWithValue("@manager_id", managerId);
- return cmd.ExecuteNonQuery() > 0;
- }
- }
- }
- }
- }
|