using Npgsql; using System; using System.Configuration; using System.Data; using System.Windows.Forms; namespace WindowsFormsApp4 { public partial class ReaderMainForm : Form { private readonly string connStr = ConfigurationManager.ConnectionStrings["PostgreSQL"].ConnectionString; public ReaderMainForm() { InitializeComponent(); } private void ReaderMainForm_Load(object sender, EventArgs e) { LoadLibraryName(); labelWelcome.Text = $"Читатель: {Session.UserFullName}"; LoadMyLoans(); tabControl.SelectedIndex = 0; } private void LoadLibraryName() { string query = "SELECT name FROM libraries WHERE id = @libId"; using (var conn = new NpgsqlConnection(connStr)) using (var cmd = new NpgsqlCommand(query, conn)) { cmd.Parameters.AddWithValue("libId", Session.LibraryId); conn.Open(); var result = cmd.ExecuteScalar(); labelLibraryName.Text = result != null ? "Библиотека: " + result.ToString() : "Библиотека: Неизвестно"; } } private void btnSearch_Click(object sender, EventArgs e) { string searchTerm = txtSearch.Text.Trim(); if (string.IsNullOrEmpty(searchTerm) || searchTerm == "Введите название или автора") { MessageBox.Show("Введите название книги или фамилию автора"); return; } string query = "SELECT * FROM search_books(@search)"; DataTable dt = new DataTable(); using (var conn = new NpgsqlConnection(connStr)) using (var cmd = new NpgsqlCommand(query, conn)) { cmd.Parameters.AddWithValue("search", searchTerm); conn.Open(); using (var adapter = new NpgsqlDataAdapter(cmd)) { adapter.Fill(dt); } } dataGridViewBooks.DataSource = dt; } private void LoadMyLoans() { string query = @" SELECT o.d AS order_id, b.title AS Название, a.name || ' ' || a.lastname AS Автор, o.give_date AS Дата_выдачи, o.return_date AS План_возврата, CASE WHEN o.return_date < CURRENT_DATE THEN 'Просрочена' ELSE 'Активна' END AS Статус FROM orders o JOIN book_exemplar be ON o.book_exemplar = be.isbn JOIN book b ON be.book_id = b.id JOIN authors a ON b.author_id = a.id WHERE o.user_id = @userId AND o.fact_return_date IS NULL ORDER BY o.return_date"; DataTable dt = new DataTable(); using (var conn = new NpgsqlConnection(connStr)) using (var cmd = new NpgsqlCommand(query, conn)) { cmd.Parameters.AddWithValue("userId", Session.UserId); conn.Open(); using (var adapter = new NpgsqlDataAdapter(cmd)) { adapter.Fill(dt); } } dataGridViewMyLoans.DataSource = dt; if (dataGridViewMyLoans.Columns["order_id"] != null) dataGridViewMyLoans.Columns["order_id"].Visible = false; } private void btnExtend_Click(object sender, EventArgs e) { if (dataGridViewMyLoans.CurrentRow == null) { MessageBox.Show("Выберите книгу для продления", "Ошибка"); return; } int orderId = Convert.ToInt32(dataGridViewMyLoans.CurrentRow.Cells["order_id"].Value); string status = dataGridViewMyLoans.CurrentRow.Cells["Статус"].Value.ToString(); if (status == "Просрочена") { MessageBox.Show("Нельзя продлить просроченную книгу. Обратитесь в библиотеку.", "Ошибка"); return; } try { using (var conn = new NpgsqlConnection(connStr)) { conn.Open(); string sql = @" UPDATE orders SET return_date = return_date + 14, extended = true WHERE d = @orderId AND fact_return_date IS NULL"; using (var cmd = new NpgsqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("orderId", orderId); int rows = cmd.ExecuteNonQuery(); if (rows > 0) { MessageBox.Show("Книга продлена на 14 дней", "Успех"); LoadMyLoans(); } else { MessageBox.Show("Не удалось продлить книгу", "Ошибка"); } } } } catch (Exception ex) { MessageBox.Show($"Ошибка: {ex.Message}", "Ошибка"); } } private void btnLogout_Click(object sender, EventArgs e) { Session.UserId = 0; Session.UserRole = null; Session.UserFullName = null; Session.LibraryId = null; this.Close(); } private void labelWelcome_Click(object sender, EventArgs e) { } } }