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

301 lines
13 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 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}");
}
}
}
}