skud/Form1.cs
2025-04-14 16:04:11 +07:00

930 lines
38 KiB
C#
Raw 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 System.Data.SQLite;
using System.Configuration;
using System.IO;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
// Путь к файлу SQLite
private string connectionString = @"Data Source=EmployeeDB.db;Version=3;";
public Form1()
{
InitializeComponent();
this.AcceptButton = buttonLogin;
this.Text = "Авторизация";
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.StartPosition = FormStartPosition.CenterScreen;
// Добавляем компоненты
InitializeLoginComponents();
// Создаем базу данных, если она не существует
CreateDatabaseIfNotExists();
}
private void CreateDatabaseIfNotExists()
{
try
{
if (!File.Exists("EmployeeDB.db"))
{
SQLiteConnection.CreateFile("EmployeeDB.db");
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
// Создаем таблицу пользователей
string createUsersTable = @"CREATE TABLE IF NOT EXISTS Users (
UserID INTEGER PRIMARY KEY AUTOINCREMENT,
Login TEXT NOT NULL,
Password TEXT NOT NULL)";
using (SQLiteCommand command = new SQLiteCommand(createUsersTable, connection))
{
command.ExecuteNonQuery();
}
// Создаем admin пользователя
string insertAdmin = @"INSERT INTO Users (Login, Password) VALUES ('admin', 'admin')";
using (SQLiteCommand command = new SQLiteCommand(insertAdmin, connection))
{
command.ExecuteNonQuery();
}
// Создаем таблицу сотрудников
string createEmployeesTable = @"CREATE TABLE IF NOT EXISTS Employees (
EmployeeID INTEGER PRIMARY KEY AUTOINCREMENT,
LastName TEXT NOT NULL,
FirstName TEXT NOT NULL,
MiddleName TEXT,
Position TEXT,
Department TEXT)";
using (SQLiteCommand command = new SQLiteCommand(createEmployeesTable, connection))
{
command.ExecuteNonQuery();
}
// Создаем таблицу посещаемости
string createAttendanceTable = @"CREATE TABLE IF NOT EXISTS Attendance (
AttendanceID INTEGER PRIMARY KEY AUTOINCREMENT,
EmployeeID INTEGER NOT NULL,
ArrivalTime TEXT NOT NULL,
DepartureTime TEXT,
FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID))";
using (SQLiteCommand command = new SQLiteCommand(createAttendanceTable, connection))
{
command.ExecuteNonQuery();
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка инициализации базы данных: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void InitializeLoginComponents()
{
// Заголовок
Label lblHeader = new Label
{
Text = "Вход в систему учета посещаемости",
Font = new Font("Arial", 14, FontStyle.Bold),
Width = 350,
TextAlign = ContentAlignment.MiddleCenter,
Location = new Point(70, 20)
};
// Поле логина
Label lblLogin = new Label
{
Text = "Логин:",
Location = new Point(70, 70),
Width = 100
};
TextBox txtLogin = new TextBox
{
Name = "txtLogin",
Location = new Point(170, 70),
Width = 200
};
// Поле пароля
Label lblPassword = new Label
{
Text = "Пароль:",
Location = new Point(70, 100),
Width = 100
};
TextBox txtPassword = new TextBox
{
Name = "txtPassword",
Location = new Point(170, 100),
Width = 200,
PasswordChar = '*'
};
// Кнопка входа
Button buttonLogin = new Button
{
Name = "buttonLogin",
Text = "Войти",
Location = new Point(200, 150),
Width = 100
};
buttonLogin.Click += ButtonLogin_Click;
// Добавляем все компоненты на форму
this.Controls.Add(lblHeader);
this.Controls.Add(lblLogin);
this.Controls.Add(txtLogin);
this.Controls.Add(lblPassword);
this.Controls.Add(txtPassword);
this.Controls.Add(buttonLogin);
// Устанавливаем размеры формы
this.Width = 480;
this.Height = 250;
}
private void ButtonLogin_Click(object sender, EventArgs e)
{
string login = this.Controls["txtLogin"].Text;
string password = this.Controls["txtPassword"].Text;
try
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
string query = "SELECT COUNT(*) FROM Users WHERE Login = @Login AND Password = @Password";
using (SQLiteCommand command = new SQLiteCommand(query, connection))
{
command.Parameters.AddWithValue("@Login", login);
command.Parameters.AddWithValue("@Password", password);
int count = Convert.ToInt32(command.ExecuteScalar());
if (count > 0)
{
MessageBox.Show("Вход выполнен успешно!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
// Скрываем текущую форму
this.Hide();
// Открываем главную форму приложения
MainForm mainForm = new MainForm(connectionString);
mainForm.FormClosed += (s, args) => this.Close();
mainForm.Show();
}
else
{
MessageBox.Show("Неверный логин или пароль!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка входа: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
// Форма для работы с таблицами
public class MainForm : Form
{
private string connectionString;
private TabControl tabControl;
private TabPage tabEmployees;
private TabPage tabAttendance;
private DataGridView dgvEmployees;
private DataGridView dgvAttendance;
public MainForm(string connString)
{
connectionString = connString;
InitializeComponent();
LoadEmployeeData();
LoadAttendanceData();
}
private void InitializeComponent()
{
this.Text = "Система учета посещаемости";
this.Width = 800;
this.Height = 600;
this.StartPosition = FormStartPosition.CenterScreen;
// Создаем вкладки
tabControl = new TabControl
{
Dock = DockStyle.Fill
};
// Вкладка "Сотрудники"
tabEmployees = new TabPage
{
Text = "Сотрудники"
};
// Вкладка "Посещаемость"
tabAttendance = new TabPage
{
Text = "Посещаемость"
};
// Панель для кнопок сотрудников
Panel panelEmployeesButtons = new Panel
{
Dock = DockStyle.Top,
Height = 50
};
// Кнопки для управления сотрудниками
Button btnAddEmployee = new Button
{
Text = "Добавить сотрудника",
Width = 150,
Location = new Point(10, 10)
};
btnAddEmployee.Click += BtnAddEmployee_Click;
Button btnEditEmployee = new Button
{
Text = "Редактировать",
Width = 150,
Location = new Point(170, 10)
};
btnEditEmployee.Click += BtnEditEmployee_Click;
Button btnDeleteEmployee = new Button
{
Text = "Удалить",
Width = 150,
Location = new Point(330, 10)
};
btnDeleteEmployee.Click += BtnDeleteEmployee_Click;
// Добавляем кнопки на панель
panelEmployeesButtons.Controls.Add(btnAddEmployee);
panelEmployeesButtons.Controls.Add(btnEditEmployee);
panelEmployeesButtons.Controls.Add(btnDeleteEmployee);
// Таблица для сотрудников
dgvEmployees = new DataGridView
{
AllowUserToAddRows = false,
AllowUserToDeleteRows = false,
ReadOnly = true,
AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill,
SelectionMode = DataGridViewSelectionMode.FullRowSelect,
Dock = DockStyle.Fill
};
// ВАЖНО: сначала добавляем DataGridView, затем панель кнопок
// Это обеспечивает правильное расположение элементов сверху вниз
tabEmployees.Controls.Add(dgvEmployees);
tabEmployees.Controls.Add(panelEmployeesButtons);
// Панель для кнопок посещаемости
Panel panelAttendanceButtons = new Panel
{
Dock = DockStyle.Top,
Height = 50
};
// Кнопки для управления посещаемостью
Button btnArrival = new Button
{
Text = "Отметить прибытие",
Width = 150,
Location = new Point(10, 10)
};
btnArrival.Click += BtnArrival_Click;
Button btnDeparture = new Button
{
Text = "Отметить убытие",
Width = 150,
Location = new Point(170, 10)
};
btnDeparture.Click += BtnDeparture_Click;
// Добавляем кнопки на панель
panelAttendanceButtons.Controls.Add(btnArrival);
panelAttendanceButtons.Controls.Add(btnDeparture);
// Таблица для посещаемости
dgvAttendance = new DataGridView
{
AllowUserToAddRows = false,
AllowUserToDeleteRows = false,
ReadOnly = true,
AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill,
SelectionMode = DataGridViewSelectionMode.FullRowSelect,
Dock = DockStyle.Fill
};
// ВАЖНО: сначала добавляем DataGridView, затем панель кнопок
tabAttendance.Controls.Add(dgvAttendance);
tabAttendance.Controls.Add(panelAttendanceButtons);
// Добавляем вкладки в контрол
tabControl.TabPages.Add(tabEmployees);
tabControl.TabPages.Add(tabAttendance);
// Добавляем контрол вкладок на форму
this.Controls.Add(tabControl);
}
private void LoadEmployeeData()
{
try
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
string query = "SELECT EmployeeID, LastName, FirstName, MiddleName, Position, Department FROM Employees";
SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, connection);
DataTable dt = new DataTable();
adapter.Fill(dt);
dgvEmployees.DataSource = dt;
// Переименовываем колонки для отображения
if (dt.Rows.Count > 0)
{
dgvEmployees.Columns["EmployeeID"].HeaderText = "ID";
dgvEmployees.Columns["LastName"].HeaderText = "Фамилия";
dgvEmployees.Columns["FirstName"].HeaderText = "Имя";
dgvEmployees.Columns["MiddleName"].HeaderText = "Отчество";
dgvEmployees.Columns["Position"].HeaderText = "Должность";
dgvEmployees.Columns["Department"].HeaderText = "Отдел";
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки данных сотрудников: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadAttendanceData()
{
try
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
// Изменен синтаксис конкатенации для SQLite
string query = @"SELECT a.AttendanceID, e.EmployeeID,
e.LastName || ' ' || e.FirstName || ' ' || COALESCE(e.MiddleName, '') as FullName,
a.ArrivalTime, a.DepartureTime
FROM Attendance a
JOIN Employees e ON a.EmployeeID = e.EmployeeID
ORDER BY a.ArrivalTime DESC";
SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, connection);
DataTable dt = new DataTable();
adapter.Fill(dt);
dgvAttendance.DataSource = dt;
// Переименовываем колонки для отображения
if (dt.Rows.Count > 0)
{
dgvAttendance.Columns["AttendanceID"].HeaderText = "ID записи";
dgvAttendance.Columns["EmployeeID"].HeaderText = "ID сотрудника";
dgvAttendance.Columns["FullName"].HeaderText = "ФИО";
dgvAttendance.Columns["ArrivalTime"].HeaderText = "Время прибытия";
dgvAttendance.Columns["DepartureTime"].HeaderText = "Время убытия";
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки данных посещаемости: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// Обработчики событий для кнопок
private void BtnAddEmployee_Click(object sender, EventArgs e)
{
EmployeeForm form = new EmployeeForm(connectionString, 0);
if (form.ShowDialog() == DialogResult.OK)
{
LoadEmployeeData();
}
}
private void BtnEditEmployee_Click(object sender, EventArgs e)
{
if (dgvEmployees.SelectedRows.Count > 0)
{
int employeeId = Convert.ToInt32(dgvEmployees.SelectedRows[0].Cells["EmployeeID"].Value);
EmployeeForm form = new EmployeeForm(connectionString, employeeId);
if (form.ShowDialog() == DialogResult.OK)
{
LoadEmployeeData();
}
}
else
{
MessageBox.Show("Выберите сотрудника для редактирования", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void BtnDeleteEmployee_Click(object sender, EventArgs e)
{
if (dgvEmployees.SelectedRows.Count > 0)
{
int employeeId = Convert.ToInt32(dgvEmployees.SelectedRows[0].Cells["EmployeeID"].Value);
string employeeName = dgvEmployees.SelectedRows[0].Cells["LastName"].Value.ToString() + " " +
dgvEmployees.SelectedRows[0].Cells["FirstName"].Value.ToString();
DialogResult result = MessageBox.Show($"Вы уверены, что хотите удалить сотрудника {employeeName}?",
"Подтверждение", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
try
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
// Начинаем транзакцию
using (SQLiteTransaction transaction = connection.BeginTransaction())
{
try
{
// Сначала удаляем записи посещаемости
string deleteAttendance = "DELETE FROM Attendance WHERE EmployeeID = @EmployeeID";
using (SQLiteCommand command = new SQLiteCommand(deleteAttendance, connection, transaction))
{
command.Parameters.AddWithValue("@EmployeeID", employeeId);
command.ExecuteNonQuery();
}
// Затем удаляем сотрудника
string deleteEmployee = "DELETE FROM Employees WHERE EmployeeID = @EmployeeID";
using (SQLiteCommand command = new SQLiteCommand(deleteEmployee, connection, transaction))
{
command.Parameters.AddWithValue("@EmployeeID", employeeId);
command.ExecuteNonQuery();
}
// Фиксируем изменения
transaction.Commit();
MessageBox.Show("Сотрудник успешно удален", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
LoadEmployeeData();
LoadAttendanceData();
}
catch (Exception ex)
{
// Откатываем изменения при ошибке
transaction.Rollback();
throw ex;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка при удалении сотрудника: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
else
{
MessageBox.Show("Выберите сотрудника для удаления", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void BtnArrival_Click(object sender, EventArgs e)
{
AttendanceForm form = new AttendanceForm(connectionString, true);
if (form.ShowDialog() == DialogResult.OK)
{
LoadAttendanceData();
}
}
private void BtnDeparture_Click(object sender, EventArgs e)
{
AttendanceForm form = new AttendanceForm(connectionString, false);
if (form.ShowDialog() == DialogResult.OK)
{
LoadAttendanceData();
}
}
}
// Форма для добавления/редактирования сотрудника
public class EmployeeForm : Form
{
private string connectionString;
private int employeeId;
private TextBox txtLastName;
private TextBox txtFirstName;
private TextBox txtMiddleName;
private TextBox txtPosition;
private TextBox txtDepartment;
public EmployeeForm(string connString, int id)
{
connectionString = connString;
employeeId = id;
InitializeComponent();
if (employeeId > 0)
{
this.Text = "Редактирование сотрудника";
LoadEmployeeData();
}
else
{
this.Text = "Добавление нового сотрудника";
}
}
private void InitializeComponent()
{
this.Width = 400;
this.Height = 300;
this.StartPosition = FormStartPosition.CenterParent;
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
// Поля для ввода данных
Label lblLastName = new Label
{
Text = "Фамилия:",
Location = new Point(30, 20),
Width = 100
};
txtLastName = new TextBox
{
Location = new Point(150, 20),
Width = 200
};
Label lblFirstName = new Label
{
Text = "Имя:",
Location = new Point(30, 50),
Width = 100
};
txtFirstName = new TextBox
{
Location = new Point(150, 50),
Width = 200
};
Label lblMiddleName = new Label
{
Text = "Отчество:",
Location = new Point(30, 80),
Width = 100
};
txtMiddleName = new TextBox
{
Location = new Point(150, 80),
Width = 200
};
Label lblPosition = new Label
{
Text = "Должность:",
Location = new Point(30, 110),
Width = 100
};
txtPosition = new TextBox
{
Location = new Point(150, 110),
Width = 200
};
Label lblDepartment = new Label
{
Text = "Отдел:",
Location = new Point(30, 140),
Width = 100
};
txtDepartment = new TextBox
{
Location = new Point(150, 140),
Width = 200
};
// Кнопки
Button btnSave = new Button
{
Text = "Сохранить",
DialogResult = DialogResult.OK,
Location = new Point(150, 180),
Width = 100
};
btnSave.Click += BtnSave_Click;
Button btnCancel = new Button
{
Text = "Отмена",
DialogResult = DialogResult.Cancel,
Location = new Point(260, 180),
Width = 100
};
// Добавляем компоненты на форму
this.Controls.Add(lblLastName);
this.Controls.Add(txtLastName);
this.Controls.Add(lblFirstName);
this.Controls.Add(txtFirstName);
this.Controls.Add(lblMiddleName);
this.Controls.Add(txtMiddleName);
this.Controls.Add(lblPosition);
this.Controls.Add(txtPosition);
this.Controls.Add(lblDepartment);
this.Controls.Add(txtDepartment);
this.Controls.Add(btnSave);
this.Controls.Add(btnCancel);
this.AcceptButton = btnSave;
this.CancelButton = btnCancel;
}
private void LoadEmployeeData()
{
try
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
string query = "SELECT LastName, FirstName, MiddleName, Position, Department FROM Employees WHERE EmployeeID = @EmployeeID";
using (SQLiteCommand command = new SQLiteCommand(query, connection))
{
command.Parameters.AddWithValue("@EmployeeID", employeeId);
using (SQLiteDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
txtLastName.Text = reader["LastName"].ToString();
txtFirstName.Text = reader["FirstName"].ToString();
txtMiddleName.Text = reader["MiddleName"].ToString();
txtPosition.Text = reader["Position"].ToString();
txtDepartment.Text = reader["Department"].ToString();
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка при загрузке данных сотрудника: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void BtnSave_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(txtLastName.Text) || string.IsNullOrWhiteSpace(txtFirstName.Text))
{
MessageBox.Show("Фамилия и имя обязательны для заполнения", "Предупреждение", MessageBoxButtons.OK, MessageBoxIcon.Warning);
this.DialogResult = DialogResult.None;
return;
}
try
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
string query;
if (employeeId > 0)
{
// Обновление существующего сотрудника
query = @"UPDATE Employees SET
LastName = @LastName,
FirstName = @FirstName,
MiddleName = @MiddleName,
Position = @Position,
Department = @Department
WHERE EmployeeID = @EmployeeID";
}
else
{
// Добавление нового сотрудника
query = @"INSERT INTO Employees (LastName, FirstName, MiddleName, Position, Department)
VALUES (@LastName, @FirstName, @MiddleName, @Position, @Department)";
}
using (SQLiteCommand command = new SQLiteCommand(query, connection))
{
command.Parameters.AddWithValue("@LastName", txtLastName.Text);
command.Parameters.AddWithValue("@FirstName", txtFirstName.Text);
command.Parameters.AddWithValue("@MiddleName", txtMiddleName.Text);
command.Parameters.AddWithValue("@Position", txtPosition.Text);
command.Parameters.AddWithValue("@Department", txtDepartment.Text);
if (employeeId > 0)
{
command.Parameters.AddWithValue("@EmployeeID", employeeId);
}
command.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка при сохранении данных: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.DialogResult = DialogResult.None;
}
}
}
// Форма для отметки посещаемости
public class AttendanceForm : Form
{
private string connectionString;
private bool isArrival;
private ComboBox cmbEmployees;
public AttendanceForm(string connString, bool arrival)
{
connectionString = connString;
isArrival = arrival;
InitializeComponent();
LoadEmployees();
this.Text = isArrival ? "Отметка прибытия" : "Отметка убытия";
}
private void InitializeComponent()
{
this.Width = 400;
this.Height = 200;
this.StartPosition = FormStartPosition.CenterParent;
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
// Заголовок
Label lblHeader = new Label
{
Text = isArrival ? "Отметка прибытия сотрудника" : "Отметка убытия сотрудника",
Font = new Font("Arial", 12, FontStyle.Bold),
Location = new Point(50, 20),
Width = 300,
TextAlign = ContentAlignment.MiddleCenter
};
// Выбор сотрудника
Label lblEmployee = new Label
{
Text = "Сотрудник:",
Location = new Point(30, 60),
Width = 100
};
cmbEmployees = new ComboBox
{
Location = new Point(130, 60),
Width = 220,
DropDownStyle = ComboBoxStyle.DropDownList
};
// Кнопки
Button btnSave = new Button
{
Text = "Отметить",
DialogResult = DialogResult.OK,
Location = new Point(130, 100),
Width = 100
};
btnSave.Click += BtnSave_Click;
Button btnCancel = new Button
{
Text = "Отмена",
DialogResult = DialogResult.Cancel,
Location = new Point(250, 100),
Width = 100
};
// Добавляем компоненты на форму
this.Controls.Add(lblHeader);
this.Controls.Add(lblEmployee);
this.Controls.Add(cmbEmployees);
this.Controls.Add(btnSave);
this.Controls.Add(btnCancel);
this.AcceptButton = btnSave;
this.CancelButton = btnCancel;
}
private void LoadEmployees()
{
try
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
string query = "SELECT EmployeeID, LastName || ' ' || FirstName || ' ' || COALESCE(MiddleName, '') as FullName FROM Employees ORDER BY LastName, FirstName";
SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, connection);
DataTable dt = new DataTable();
adapter.Fill(dt);
cmbEmployees.DataSource = dt;
cmbEmployees.DisplayMember = "FullName";
cmbEmployees.ValueMember = "EmployeeID";
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка при загрузке списка сотрудников: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void BtnSave_Click(object sender, EventArgs e)
{
if (cmbEmployees.SelectedValue == null)
{
MessageBox.Show("Необходимо выбрать сотрудника", "Предупреждение", MessageBoxButtons.OK, MessageBoxIcon.Warning);
this.DialogResult = DialogResult.None;
return;
}
try
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
if (isArrival)
{
// Отметка прибытия - создаем новую запись
string query = "INSERT INTO Attendance (EmployeeID, ArrivalTime) VALUES (@EmployeeID, @ArrivalTime)";
using (SQLiteCommand command = new SQLiteCommand(query, connection))
{
command.Parameters.AddWithValue("@EmployeeID", cmbEmployees.SelectedValue);
command.Parameters.AddWithValue("@ArrivalTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
command.ExecuteNonQuery();
}
}
else
{
// Отметка убытия - ищем последнюю запись с прибытием для данного сотрудника
string query = @"UPDATE Attendance SET DepartureTime = @DepartureTime
WHERE EmployeeID = @EmployeeID AND DepartureTime IS NULL
AND AttendanceID = (SELECT AttendanceID FROM Attendance
WHERE EmployeeID = @EmployeeID AND DepartureTime IS NULL
ORDER BY ArrivalTime DESC LIMIT 1)";
using (SQLiteCommand command = new SQLiteCommand(query, connection))
{
command.Parameters.AddWithValue("@EmployeeID", cmbEmployees.SelectedValue);
command.Parameters.AddWithValue("@DepartureTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
int rowsAffected = command.ExecuteNonQuery();
if (rowsAffected == 0)
{
MessageBox.Show("Для данного сотрудника нет открытых записей о прибытии",
"Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.DialogResult = DialogResult.None;
return;
}
}
}
MessageBox.Show("Посещаемость успешно отмечена", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка при сохранении данных: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.DialogResult = DialogResult.None;
}
}
}
}