2024-12-08 17:27:48 +04:00
using DocumentFormat.OpenXml.Packaging ;
using DocumentFormat.OpenXml.Wordprocessing ;
using DocumentFormat.OpenXml ;
using EmployeeManagmentBusinessLogic.BusinessLogic ;
2024-12-01 15:14:20 +04:00
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 ;
2024-12-08 17:27:48 +04:00
using System.IO ;
2024-12-08 18:05:34 +04:00
using Microsoft.Win32 ;
2024-12-01 15:14:20 +04:00
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 ;
2024-12-07 23:36:29 +04:00
PhysicalPersonComboBox . DisplayMemberPath = "FullNameWithBirthday" ;
2024-12-01 15:14:20 +04:00
PhysicalPersonComboBox . SelectedValuePath = "Id" ;
}
2024-12-07 23:36:29 +04:00
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 ) ;
}
2024-12-08 17:27:48 +04:00
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 ( ) ;
2024-12-08 20:28:54 +04:00
// Канцелярская информация
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}" ) ) ) ) ;
2024-12-08 17:27:48 +04:00
// Заголовок
2024-12-08 20:28:54 +04:00
body . Append ( new Paragraph ( new Run ( new Text ( "Трудовой договор" ) )
{
RunProperties = new RunProperties
2024-12-08 17:27:48 +04:00
{
2024-12-08 20:28:54 +04:00
Bold = new Bold ( ) ,
FontSize = new FontSize { Val = "28" }
}
} ) ) ;
// Преамбула
body . Append ( new Paragraph ( new Run ( new Text (
"Настоящий трудовой договор (далее – Договор) заключается между Работодателем, " +
"именуемым далее «Работодатель», и Работником, именуемым далее «Работник», на " +
"основании Трудового кодекса Российской Федерации. Работодатель обязуется " +
"предоставить Работнику работу по должности, указанной в настоящем договоре, " +
"обеспечивать необходимые условия труда, а Работник обязуется лично выполнять " +
"трудовые функции в соответствии с условиями договора."
) ) ) ) ;
// Сведения о работнике
2024-12-08 17:27:48 +04:00
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}" ) ) ) ) ;
2024-12-08 20:28:54 +04:00
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}" ) ) ) ) ;
2024-12-08 17:27:48 +04:00
2024-12-08 20:28:54 +04:00
// Создание параграфа с текстом, который будет перенесен
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' ) )
2024-12-08 17:27:48 +04:00
{
2024-12-08 20:28:54 +04:00
body . Append ( new Paragraph ( new Run ( new Text ( line ) ) ) ) ;
2024-12-08 17:27:48 +04:00
}
2024-12-08 20:28:54 +04:00
// Права и обязанности работника
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' ) )
2024-12-08 17:27:48 +04:00
{
2024-12-08 20:28:54 +04:00
body . Append ( new Paragraph ( new Run ( new Text ( line ) ) ) ) ;
2024-12-08 17:27:48 +04:00
}
2024-12-08 20:28:54 +04:00
// Права и обязанности работодателя
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 ) ) ) ) ;
}
2024-12-08 17:27:48 +04:00
2024-12-08 20:28:54 +04:00
// Подписи сторон
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Р а б о тник: ___________________________" ) ) ) ) ;
2024-12-08 17:27:48 +04:00
// Привязка тела документа
mainPart . Document . Append ( body ) ;
mainPart . Document . Save ( ) ;
}
}
2024-12-08 20:28:54 +04:00
2024-12-08 17:27:48 +04:00
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
{
2024-12-08 18:05:34 +04:00
// Открытие диалогового окна для сохранения файла
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 ) ;
}
2024-12-08 17:27:48 +04:00
}
catch ( Exception ex )
{
MessageBox . Show ( $"Ошибка при создании документа: {ex.Message}" ) ;
}
}
2024-12-07 23:36:29 +04:00
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 ;
}
2024-12-01 15:14:20 +04:00
private void SaveButton_Click ( object sender , RoutedEventArgs e )
{
2024-12-08 00:41:13 +04:00
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
2024-12-01 15:14:20 +04:00
{
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}" ) ;
}
}
}
}