PIbd-42_Kashin_M.I_CPO_Cour.../EmployeeManagmentView/Employee/AddEmployeeWindow.xaml.cs

301 lines
13 KiB
C#
Raw Normal View History

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml;
using EmployeeManagmentBusinessLogic.BusinessLogic;
using EmployeeManagmentContracts.BusinessLogicContracts;
using EmployeeManagmentContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.IO;
namespace EmployeeManagmentView.Employee
{
/// <summary>
/// Логика взаимодействия для AddEmployeeWindow.xaml
/// </summary>
public partial class AddEmployeeWindow : Window
{
private readonly IEmployeeLogic _employeeLogic;
private readonly IPhisicalPersonLogic _phisicalPersonLogic;
public AddEmployeeWindow(IEmployeeLogic employeeLogic, IPhisicalPersonLogic phisicalPersonLogic)
{
_employeeLogic = employeeLogic;
_phisicalPersonLogic = phisicalPersonLogic;
InitializeComponent();
LoadPhysicalPersons();
}
private void LoadPhysicalPersons()
{
if (PhysicalPersonComboBox == null)
{
throw new InvalidOperationException("PhysicalPersonComboBox не инициализирован.");
}
var persons = _phisicalPersonLogic.GetFullList();
PhysicalPersonComboBox.ItemsSource = persons;
PhysicalPersonComboBox.DisplayMemberPath = "FullNameWithBirthday";
PhysicalPersonComboBox.SelectedValuePath = "Id";
}
private void NameTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
// Разрешаем только буквы
e.Handled = !char.IsLetter(e.Text, 0);
}
private void NameTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var textBox = sender as TextBox;
if (textBox == null) return;
// Получаем текущий текст
string currentText = textBox.Text;
// Если текст не пустой, преобразуем первую букву в заглавную, а остальные в строчные
if (!string.IsNullOrEmpty(currentText))
{
// Разбиваем строку по пробелам, чтобы обрабатывать каждое слово отдельно
var words = currentText.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < words.Length; i++)
{
// Преобразуем первую букву в заглавную, а остальные в строчные
words[i] = char.ToUpper(words[i][0]) + words[i].Substring(1).ToLower();
}
// Объединяем слова обратно в строку и обновляем текст
textBox.Text = string.Join(" ", words);
// Устанавливаем курсор в конец текста
textBox.SelectionStart = textBox.Text.Length;
}
}
// Проверка на ввод только чисел и одной запятой
private void DecimalTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
var textBox = sender as TextBox;
if (textBox == null) return;
// Разрешаем только цифры и запятую
e.Handled = !(char.IsDigit(e.Text, 0) || e.Text == ",");
// Проверка на количество запятых
if (e.Text == "," && textBox.Text.Contains(","))
{
e.Handled = true;
}
}
// Ограничение на 2 знака после запятой
private void DecimalTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var textBox = sender as TextBox;
if (textBox == null) return;
// Получаем текущий текст
string currentText = textBox.Text;
// Проверяем наличие запятой
int commaIndex = currentText.IndexOf(',');
if (commaIndex != -1 && currentText.Length - commaIndex > 3)
{
// Обрезаем текст до двух знаков после запятой
textBox.Text = currentText.Substring(0, commaIndex + 3);
textBox.SelectionStart = textBox.Text.Length; // Устанавливаем курсор в конец текста
}
}
private void TelephoneTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
e.Handled = !char.IsDigit(e.Text, 0);
}
public static void CreateEmploymentContract(string filePath, string employeeName, string jobTitle, DateTime startDate, DateTime? endDate, decimal hourlyRate, string partTimeInfo)
{
using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(filePath, WordprocessingDocumentType.Document))
{
// Добавление основной части документа
MainDocumentPart mainPart = wordDocument.AddMainDocumentPart();
mainPart.Document = new Document();
Body body = new Body();
// Заголовок
body.Append(new Paragraph(
new Run(
new Text("Трудовой договор"))
{
RunProperties = new RunProperties
{
Bold = new Bold(),
FontSize = new FontSize { Val = "28" }
}
}));
// Информация о сотруднике
body.Append(new Paragraph(new Run(new Text($"Сотрудник: {employeeName}"))));
body.Append(new Paragraph(new Run(new Text($"Должность: {jobTitle}"))));
body.Append(new Paragraph(new Run(new Text($"Дата начала работы: {startDate:dd.MM.yyyy}"))));
if (endDate.HasValue)
{
body.Append(new Paragraph(new Run(new Text($"Дата окончания работы: {endDate:dd.MM.yyyy}"))));
}
else
{
body.Append(new Paragraph(new Run(new Text("Дата окончания работы: бессрочный договор"))));
}
body.Append(new Paragraph(new Run(new Text($"Ставка: {hourlyRate:C} рублей в час"))));
body.Append(new Paragraph(new Run(new Text($"Совместительство: {partTimeInfo}"))));
// Заключение
body.Append(new Paragraph(new Run(new Text("Договор подписан обеими сторонами."))));
// Привязка тела документа
mainPart.Document.Append(body);
mainPart.Document.Save();
}
}
private void GenerateContractButton_Click(object sender, RoutedEventArgs e)
{
// Проверка данных
if (string.IsNullOrWhiteSpace(JobNameTextBox.Text) ||
!StartDatePicker.SelectedDate.HasValue ||
string.IsNullOrWhiteSpace(BidTextBox.Text) ||
string.IsNullOrWhiteSpace(PhysicalPersonComboBox.Text))
{
MessageBox.Show("Пожалуйста, заполните все обязательные поля.");
return;
}
// Получение данных
string employeeName = PhysicalPersonComboBox.Text;
string jobTitle = JobNameTextBox.Text;
DateTime startDate = StartDatePicker.SelectedDate.Value;
DateTime? endDate = EndDatePicker.SelectedDate;
decimal hourlyRate = decimal.Parse(BidTextBox.Text);
string partTimeInfo = PartTimeJobTextBox.Text;
// Путь сохранения
string filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Трудовой_договор.docx");
try
{
// Генерация документа
CreateEmploymentContract(filePath, employeeName, jobTitle, startDate, endDate, hourlyRate, partTimeInfo);
MessageBox.Show($"Договор успешно создан по адресу:\n{filePath}");
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка при создании документа: {ex.Message}");
}
}
private void TelephoneTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var textBox = sender as TextBox;
if (textBox == null) return;
// Удаляем все символы, кроме цифр
string rawInput = new string(textBox.Text.Where(char.IsDigit).ToArray());
// Добавляем "7" по умолчанию
if (!rawInput.StartsWith("7"))
rawInput = "7" + rawInput;
if (rawInput.Length > 11) rawInput = rawInput.Substring(0, 11);
// Форматируем как +7 (XXX) XXX-XX-XX
if (rawInput.Length <= 1)
textBox.Text = "+7 ";
else if (rawInput.Length <= 4)
textBox.Text = $"+7 ({rawInput.Substring(1)}";
else if (rawInput.Length <= 7)
textBox.Text = $"+7 ({rawInput.Substring(1, 3)}) {rawInput.Substring(4)}";
else if (rawInput.Length <= 9)
textBox.Text = $"+7 ({rawInput.Substring(1, 3)}) {rawInput.Substring(4, 3)}-{rawInput.Substring(7)}";
else
textBox.Text = $"+7 ({rawInput.Substring(1, 3)}) {rawInput.Substring(4, 3)}-{rawInput.Substring(7, 2)}-{rawInput.Substring(9)}";
// Устанавливаем курсор в конец
textBox.SelectionStart = textBox.Text.Length;
}
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
bool isValid = true;
// Проверка обязательных полей
if (string.IsNullOrWhiteSpace(JobNameTextBox.Text))
{
isValid = false;
MessageBox.Show("Поле 'Название должности' не заполнено.");
}
if (string.IsNullOrWhiteSpace(PartTimeJobTextBox.Text))
{
isValid = false;
MessageBox.Show("Поле 'Совместительство' не заполнено.");
}
if (string.IsNullOrWhiteSpace(BidTextBox.Text))
{
isValid = false;
MessageBox.Show("Поле 'Ставка' не заполнено.");
}
if (!StartDatePicker.SelectedDate.HasValue)
{
isValid = false;
MessageBox.Show("Поле 'Начало работы' не выбрано.");
}
if (!EndDatePicker.SelectedDate.HasValue)
{
isValid = false;
MessageBox.Show("Поле 'Конец работы' не выбрано.");
}
// Если все поля заполнены, продолжаем выполнение
if (isValid)
try
{
var model = new EmployeeViewModel
{
NameJob = JobNameTextBox.Text,
StartJob = StartDatePicker.SelectedDate.Value.ToUniversalTime(),
EndJob = EndDatePicker.SelectedDate.Value.ToUniversalTime(),
Bid = float.Parse(BidTextBox.Text),
PartTimeJob = PartTimeJobTextBox.Text,
PhysicalPersonsId = (int?)PhysicalPersonComboBox.SelectedValue
};
_employeeLogic.Insert(model);
MessageBox.Show("Данные сотрудника успешно сохранены!");
Close();
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка: {ex.Message}");
}
}
}
}