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

375 lines
20 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;
using Microsoft.Win32;
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($"Номер договора: {Guid.NewGuid().ToString("N").ToUpper().Substring(0, 10)}"))));
body.Append(new Paragraph(new Run(new Text($"Дата составления: {DateTime.Now:dd.MM.yyyy}"))));
// Заголовок
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(
"Настоящий трудовой договор (далее Договор) заключается между Работодателем, " +
"именуемым далее «Работодатель», и Работником, именуемым далее «Работник», на " +
"основании Трудового кодекса Российской Федерации. Работодатель обязуется " +
"предоставить Работнику работу по должности, указанной в настоящем договоре, " +
"обеспечивать необходимые условия труда, а Работник обязуется лично выполнять " +
"трудовые функции в соответствии с условиями договора."
))));
// Сведения о работнике
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}"))));
body.Append(new Paragraph(new Run(new Text(endDate.HasValue ? $"Дата окончания работы: {endDate:dd.MM.yyyy}" : "Дата окончания работы: бессрочный договор"))));
body.Append(new Paragraph(new Run(new Text($"Ставка: {hourlyRate}"))));
body.Append(new Paragraph(new Run(new Text($"Совместительство: {partTimeInfo}"))));
// Создание параграфа с текстом, который будет перенесен
body.Append(new Paragraph(
new Run(new Text("Условия трудового договора:"))));
// Пример добавления нескольких строк с переносом
string contractConditions =
"1. Рабочее время Работника составляет 40 часов в неделю, если иное не предусмотрено " +
"действующим законодательством. Работник обязуется являться на рабочее место своевременно, " +
"выполнять свои трудовые обязанности добросовестно и качественно.\n" +
"2. Работодатель обязуется своевременно выплачивать Работнику заработную плату. Заработная плата " +
"состоит из оклада и дополнительных выплат в виде премий и надбавок.\n" +
"3. Работник имеет право на ежегодный оплачиваемый отпуск продолжительностью 28 календарных дней, " +
"а также другие виды отпусков в соответствии с законодательством.\n" +
"4. Работодатель имеет право привлекать Работника к дисциплинарной ответственности в случаях, " +
"предусмотренных Трудовым кодексом РФ.";
// Разбиваем на строки и добавляем в документ
foreach (var line in contractConditions.Split('\n'))
{
body.Append(new Paragraph(new Run(new Text(line))));
}
// Права и обязанности работника
body.Append(new Paragraph(new Run(new Text("Права и обязанности Работника:"))));
string rules = "1. Работник имеет право на:\n" +
" 1.1. Получение своевременной оплаты труда.\n" +
" 1.2. Условия труда, соответствующие установленным нормам охраны труда.\n" +
" 1.3. Отдых в соответствии с трудовым законодательством Российской Федерации.\n" +
"2. Работник обязан:\n" +
" 2.1. Соблюдать правила внутреннего трудового распорядка.\n" +
" 2.2. Выполнять должностные обязанности в соответствии с трудовым договором и локальными нормативными актами Работодателя.\n" +
" 2.3. Бережно относиться к имуществу Работодателя.";
// Разбиваем на строки и добавляем в документ
foreach (var line in rules.Split('\n'))
{
body.Append(new Paragraph(new Run(new Text(line))));
}
// Права и обязанности работодателя
body.Append(new Paragraph(new Run(new Text("Права и обязанности Работодателя:"))));
string rulesRussia =
"1. Работодатель имеет право на:\n" +
" 1.1. Привлечение Работника к выполнению трудовых функций в рамках установленных обязанностей.\n" +
" 1.2. Осуществление контроля за выполнением Работником трудовых обязанностей.\n" +
"2. Работодатель обязан:\n" +
" 2.1. Своевременно выплачивать заработную плату Работнику.\n" +
" 2.2. Предоставлять Работнику возможность использовать ежегодный оплачиваемый отпуск.\n" +
" 2.3. Соблюдать нормы трудового законодательства Российской Федерации.";
// Разбиваем на строки и добавляем в документ
foreach (var line in rulesRussia.Split('\n'))
{
body.Append(new Paragraph(new Run(new Text(line))));
}
// Подписи сторон
body.Append(new Paragraph(new Run(new Text("\nПодписи сторон:"))));
body.Append(new Paragraph(new Run(new Text("\nРаботодатель: _______________________"))));
body.Append(new Paragraph(new Run(new Text("\nРаботник: ___________________________"))));
// Привязка тела документа
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;
try
{
// Открытие диалогового окна для сохранения файла
SaveFileDialog saveFileDialog = new SaveFileDialog
{
Filter = "Excel файлы (*.docx)|*.docx", // фильтр для файлов .docx
Title = "Сохранить договор о трудоустройстве", // заголовок окна
FileName = "Договор.docx" // имя по умолчанию
};
// Проверка, что пользователь выбрал путь и имя файла
if (saveFileDialog.ShowDialog() == true)
{
string filePath = saveFileDialog.FileName; // Путь и имя файла
CreateEmploymentContract(filePath, employeeName, jobTitle, startDate, endDate, hourlyRate, partTimeInfo); // Генерация отчета
MessageBox.Show($"Договор успешно сохранен: {filePath}", "Успех", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
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("Данные сотрудника успешно сохранены!");
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка: {ex.Message}");
}
}
}
}