Сделал половину дезигн изменений

This commit is contained in:
maksim 2024-12-07 23:36:29 +04:00
parent 7b0a8dd3d6
commit 69726bde25
28 changed files with 819 additions and 52 deletions

View File

@ -16,6 +16,8 @@ namespace EmployeeManagmentContracts.ViewModels
public float Bid { get; set; } public float Bid { get; set; }
public int? PhysicalPersonsId { get; set; } public int? PhysicalPersonsId { get; set; }
public string? PhysicalPersonName { get; set; } public string? PhysicalPersonName { get; set; }
// Новое свойство для отображения комбинированного текста
public string DisplayText => $"{NameJob} ({PhysicalPersonName})";
} }
} }

View File

@ -14,5 +14,15 @@ namespace EmployeeManagmentContracts.ViewModels
public bool Passed { get; set; } public bool Passed { get; set; }
public int? EmployeeId { get; set; } public int? EmployeeId { get; set; }
public string? EmployeeName { get; set; } = string.Empty; public string? EmployeeName { get; set; } = string.Empty;
public string DisplayName
{
get
{
return $"{EmployeeName} ({StartData:dd.MM.yyyy} - {EndData:dd.MM.yyyy})";
}
}
} }
} }

View File

@ -22,7 +22,7 @@ namespace EmployeeManagmentDataBaseImplement.Implements
PartTimeJob = e.PartTimeJob, PartTimeJob = e.PartTimeJob,
Bid = e.Bid, Bid = e.Bid,
PhysicalPersonsId = e.PhisicalPersonsId, PhysicalPersonsId = e.PhisicalPersonsId,
PhysicalPersonName = $"{e.PhisicalPerson.Surname} {e.PhisicalPerson.Name}" PhysicalPersonName = $"{e.PhisicalPerson.Surname} {e.PhisicalPerson.Name} {e.PhisicalPerson.Patronymic} "
}) })
.ToList(); .ToList();
} }
@ -48,7 +48,7 @@ namespace EmployeeManagmentDataBaseImplement.Implements
PartTimeJob = e.PartTimeJob, PartTimeJob = e.PartTimeJob,
Bid = e.Bid, Bid = e.Bid,
PhysicalPersonsId = e.PhisicalPersonsId, PhysicalPersonsId = e.PhisicalPersonsId,
PhysicalPersonName = $"{e.PhisicalPerson.Surname} {e.PhisicalPerson.Name}" PhysicalPersonName = $"{e.PhisicalPerson.Surname} {e.PhisicalPerson.Name} {e.PhisicalPerson.Patronymic}",
}) })
.ToList(); .ToList();
} }
@ -71,7 +71,7 @@ namespace EmployeeManagmentDataBaseImplement.Implements
Bid = entity.Bid, Bid = entity.Bid,
PhysicalPersonsId = entity.PhisicalPersonsId, PhysicalPersonsId = entity.PhisicalPersonsId,
PhysicalPersonName = entity.PhisicalPerson != null PhysicalPersonName = entity.PhisicalPerson != null
? $"{entity.PhisicalPerson.Surname} {entity.PhisicalPerson.Name}" ? $"{entity.PhisicalPerson.Surname} {entity.PhisicalPerson.Name} {entity.PhisicalPerson.Patronymic} "
: "Не указано" // Обработка отсутствующего физического лица : "Не указано" // Обработка отсутствующего физического лица
}; };
} }

View File

@ -22,7 +22,7 @@ namespace EmployeeManagmentDataBaseImplement.Implements
EndData = v.EndData, EndData = v.EndData,
Passed = v.Passed, Passed = v.Passed,
EmployeeId = v.EmployeesId, EmployeeId = v.EmployeesId,
EmployeeName = v.Employee != null ? $"{v.Employee.PhisicalPerson.Surname} {v.Employee.PhisicalPerson.Name}" : "Не указано" EmployeeName = v.Employee != null ? $"{v.Employee.PhisicalPerson.Surname} {v.Employee.PhisicalPerson.Name} {v.Employee.PhisicalPerson.Patronymic} ({v.Employee.NameJob})" : "Не указано"
}) })
.ToList(); .ToList();
} }
@ -44,7 +44,7 @@ namespace EmployeeManagmentDataBaseImplement.Implements
EndData = v.EndData, EndData = v.EndData,
Passed = v.Passed, Passed = v.Passed,
EmployeeId = v.EmployeesId, EmployeeId = v.EmployeesId,
EmployeeName = v.Employee != null ? $"{v.Employee.PhisicalPerson.Surname} {v.Employee.PhisicalPerson.Name}" : "Не указано" EmployeeName = v.Employee != null ? $"{v.Employee.PhisicalPerson.Surname} {v.Employee.PhisicalPerson.Name} {v.Employee.PhisicalPerson.Patronymic} ({v.Employee.NameJob})" : "Не указано"
}) })
.ToList(); .ToList();
} }
@ -63,7 +63,7 @@ namespace EmployeeManagmentDataBaseImplement.Implements
EndData = entity.EndData, EndData = entity.EndData,
Passed = entity.Passed, Passed = entity.Passed,
EmployeeId = entity.EmployeesId, EmployeeId = entity.EmployeesId,
EmployeeName = entity.Employee != null ? $"{entity.Employee.PhisicalPerson.Surname} {entity.Employee.PhisicalPerson.Name}" : "Не указано" EmployeeName = entity.Employee != null ? $"{entity.Employee.PhisicalPerson.Surname} {entity.Employee.PhisicalPerson.Name} {entity.Employee.PhisicalPerson.Patronymic} ({entity.Employee.NameJob})" : "Не указано"
}; };
} }

View File

@ -18,6 +18,7 @@
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" />
<PackageReference Include="PresentationFramework" Version="4.6.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System;
using System.Windows.Data;
namespace EmployeeManagmentDataModels.Enums
{
public class BooleanToSalaryConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool booleanValue)
{
return booleanValue ? "Заплачено" : "Не заплачено";
}
return "Неизвестно";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException("Обратное преобразование не поддерживается.");
}
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace EmployeeManagmentDataModels.Enums
{
public class BooleanToVacationConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool booleanValue)
{
return booleanValue ? "Завершен" : "Не завершено";
}
return "Неизвестно";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException("Обратное преобразование не поддерживается.");
}
}
}

View File

@ -2,6 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Resources> <Application.Resources>
<!-- Стиль для закругленных кнопок --> <!-- Стиль для закругленных кнопок -->
<Style x:Key="RoundedButtonStyle" TargetType="Button"> <Style x:Key="RoundedButtonStyle" TargetType="Button">
<Setter Property="Template"> <Setter Property="Template">

View File

@ -38,7 +38,9 @@
Width="250" Height="40" Width="250" Height="40"
Style="{StaticResource RoundedTextBoxStyle}" Style="{StaticResource RoundedTextBoxStyle}"
Margin="0,5" Margin="0,5"
ToolTip="Введите название должности" HorizontalAlignment="Center"/> ToolTip="Введите название должности" HorizontalAlignment="Center"
PreviewTextInput="NameTextBox_PreviewTextInput"
TextChanged="NameTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<!-- Поле для даты начала работы --> <!-- Поле для даты начала работы -->
@ -66,7 +68,9 @@
Width="250" Height="40" Width="250" Height="40"
Style="{StaticResource RoundedTextBoxStyle}" Style="{StaticResource RoundedTextBoxStyle}"
Margin="0,5" Margin="0,5"
ToolTip="Введите почасовую ставку" HorizontalAlignment="Center"/> ToolTip="Введите почасовую ставку" HorizontalAlignment="Center"
PreviewTextInput="DecimalTextBox_PreviewTextInput"
TextChanged="DecimalTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<!-- Поле для физического лица --> <!-- Поле для физического лица -->
@ -86,7 +90,9 @@
Width="250" Height="40" Width="250" Height="40"
Style="{StaticResource RoundedTextBoxStyle}" Style="{StaticResource RoundedTextBoxStyle}"
Margin="0,5" Margin="0,5"
ToolTip="Введите почасовую ставку" HorizontalAlignment="Center"/> ToolTip="Введите почасовую ставку" HorizontalAlignment="Center"
PreviewTextInput="NameTextBox_PreviewTextInput"
TextChanged="NameTextBox_TextChanged"/>
</StackPanel> </StackPanel>

View File

@ -43,10 +43,115 @@ namespace EmployeeManagmentView.Employee
var persons = _phisicalPersonLogic.GetFullList(); var persons = _phisicalPersonLogic.GetFullList();
PhysicalPersonComboBox.ItemsSource = persons; PhysicalPersonComboBox.ItemsSource = persons;
PhysicalPersonComboBox.DisplayMemberPath = "Name"; PhysicalPersonComboBox.DisplayMemberPath = "FullNameWithBirthday";
PhysicalPersonComboBox.SelectedValuePath = "Id"; 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);
}
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) private void SaveButton_Click(object sender, RoutedEventArgs e)
{ {
try try

View File

@ -77,7 +77,9 @@
<StackPanel Grid.Row="0" Grid.Column="0" Margin="10"> <StackPanel Grid.Row="0" Grid.Column="0" Margin="10">
<Label Content="Название работы" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Название работы" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="JobNameTextBox" Width="250" Height="40" <TextBox x:Name="JobNameTextBox" Width="250" Height="40"
Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите название работы" /> Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите название работы"
PreviewTextInput="NameTextBox_PreviewTextInput"
TextChanged="NameTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1" Margin="10"> <StackPanel Grid.Row="0" Grid.Column="1" Margin="10">
<Label Content="Дата начала работы" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Дата начала работы" Foreground="White" HorizontalAlignment="Center"/>
@ -90,14 +92,18 @@
ToolTip="Выберите дату окончания" /> ToolTip="Выберите дату окончания" />
</StackPanel> </StackPanel>
<StackPanel Grid.Row="1" Grid.Column="1" Margin="10"> <StackPanel Grid.Row="1" Grid.Column="1" Margin="10">
<Label Content="Частичная занятость" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Совместительство" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="PartTimeTextBox" Width="250" Height="40" <TextBox x:Name="PartTimeTextBox" Width="250" Height="40"
Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Укажите частичную занятость" /> Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Укажите частичную занятость"
PreviewTextInput="NameTextBox_PreviewTextInput"
TextChanged="NameTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="2" Grid.Column="0" Margin="10"> <StackPanel Grid.Row="2" Grid.Column="0" Margin="10">
<Label Content="Ставка" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Ставка" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="BidTextBox" Width="250" Height="40" <TextBox x:Name="BidTextBox" Width="250" Height="40"
Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите ставку" /> Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите ставку"
PreviewTextInput="NameTextBox_PreviewTextInput"
TextChanged="NameTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="2" Grid.Column="1" Margin="10"> <StackPanel Grid.Row="2" Grid.Column="1" Margin="10">
<Label Content="Физическое лицо" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Физическое лицо" Foreground="White" HorizontalAlignment="Center"/>

View File

@ -38,11 +38,20 @@ namespace EmployeeManagmentView.Employee
private void LoadEmployees() private void LoadEmployees()
{ {
_employees = _employeeLogic.GetFullList(); _employees = _employeeLogic.GetFullList();
// Заполняем комбинированное свойство, если нужно
foreach (var employee in _employees)
{
var physicalPerson = _physicalPersonLogic.GetElement(employee.PhysicalPersonsId ?? 0);
employee.PhysicalPersonName = physicalPerson?.FullNameWithBirthday;
}
EmployeeComboBox.ItemsSource = _employees; EmployeeComboBox.ItemsSource = _employees;
EmployeeComboBox.DisplayMemberPath = "NameJob"; EmployeeComboBox.DisplayMemberPath = "DisplayText"; // Используем новое свойство
EmployeeComboBox.SelectedValuePath = "Id"; EmployeeComboBox.SelectedValuePath = "Id";
} }
private void LoadPhysicalPersons() private void LoadPhysicalPersons()
{ {
var physicalPersons = _physicalPersonLogic.GetFullList(); var physicalPersons = _physicalPersonLogic.GetFullList();
@ -59,6 +68,7 @@ namespace EmployeeManagmentView.Employee
} }
} }
private void LoadEmployee(int employeeId) private void LoadEmployee(int employeeId)
{ {
var employee = _employeeLogic.GetElement(employeeId); var employee = _employeeLogic.GetElement(employeeId);
@ -84,6 +94,78 @@ namespace EmployeeManagmentView.Employee
EmployeeComboBox.ItemsSource = filteredEmployees; EmployeeComboBox.ItemsSource = filteredEmployees;
} }
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 TelephoneTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
e.Handled = !char.IsDigit(e.Text, 0);
}
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) private void SaveButton_Click(object sender, RoutedEventArgs e)
{ {
if (EmployeeComboBox.SelectedValue is int selectedEmployeeId) if (EmployeeComboBox.SelectedValue is int selectedEmployeeId)

View File

@ -93,7 +93,7 @@ namespace EmployeeManagmentView.Employee
} }
} }
var viewWindow = new ViewEmployeeWindow(_employeeLogic, _salaryLogic, _vacationLogic); var viewWindow = new ViewEmployeeWindow(_employeeLogic, _salaryLogic, _vacationLogic, _phisicalPersonLogic);
viewWindow.Show(); viewWindow.Show();
} }
} }

View File

@ -39,21 +39,26 @@
<StackPanel Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" Margin="0,10"> <StackPanel Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" Margin="0,10">
<Label Content="Количество часов" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Количество часов" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="HoursTextBox" Width="200" Height="40" <TextBox x:Name="HoursTextBox" Width="200" Height="40"
Margin="0,5" ToolTip="Введите количество часов" /> Margin="0,5" ToolTip="Введите количество часов"
PreviewTextInput="NumericTextBox_PreviewTextInput"/>
</StackPanel> </StackPanel>
<!-- Поле для ставки --> <!-- Поле для ставки -->
<StackPanel Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" Margin="0,10"> <StackPanel Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" Margin="0,10">
<Label Content="Цена за час" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Цена за час" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="PriceTextBox" Width="200" Height="40" <TextBox x:Name="PriceTextBox" Width="200" Height="40"
Margin="0,5" ToolTip="Введите ставку" /> Margin="0,5" ToolTip="Введите ставку"
PreviewTextInput="DecimalTextBox_PreviewTextInput"
TextChanged="DecimalTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<!-- Поле для премии --> <!-- Поле для премии -->
<StackPanel Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center" Margin="0,10"> <StackPanel Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center" Margin="0,10">
<Label Content="Премия" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Премия" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="PremiumTextBox" Width="200" Height="40" <TextBox x:Name="PremiumTextBox" Width="200" Height="40"
Margin="0,5" ToolTip="Введите премию (если есть)" /> Margin="0,5" ToolTip="Введите премию (если есть)"
PreviewTextInput="DecimalTextBox_PreviewTextInput"
TextChanged="DecimalTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<!-- Поле для даты --> <!-- Поле для даты -->

View File

@ -24,15 +24,131 @@ namespace EmployeeManagmentView.Employee.Salary
private readonly ISalaryLogic _salaryLogic; private readonly ISalaryLogic _salaryLogic;
private readonly IEmployeeLogic _employeeLogic; private readonly IEmployeeLogic _employeeLogic;
private readonly IPhisicalPersonLogic _phisicalPersonLogic;
public AddSalaryWindow(ISalaryLogic salaryLogic, IEmployeeLogic employeeLogic) public AddSalaryWindow(ISalaryLogic salaryLogic, IEmployeeLogic employeeLogic, IPhisicalPersonLogic phisicalPersonLogic)
{ {
_salaryLogic = salaryLogic; _salaryLogic = salaryLogic;
_employeeLogic = employeeLogic; _employeeLogic = employeeLogic;
_phisicalPersonLogic = phisicalPersonLogic;
InitializeComponent(); InitializeComponent();
LoadEmployees(); LoadEmployees();
} }
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;
}
}
private void NumericTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
// Разрешаем ввод только цифр и запятой
e.Handled = !char.IsDigit(e.Text, 0);
}
// Ограничение на 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);
}
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 LoadEmployees() private void LoadEmployees()
{ {
var employees = _employeeLogic.GetFullList(); var employees = _employeeLogic.GetFullList();

View File

@ -51,15 +51,20 @@
<StackPanel Grid.Row="0" Grid.Column="0" Margin="10"> <StackPanel Grid.Row="0" Grid.Column="0" Margin="10">
<Label Content="Часы работы" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Часы работы" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="CountHoursTextBox" Width="250" Height="40" Style="{StaticResource RoundedTextBoxStyle}" /> <TextBox x:Name="CountHoursTextBox" Width="250" Height="40" Style="{StaticResource RoundedTextBoxStyle}"
PreviewTextInput="NumericTextBox_PreviewTextInput"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1" Margin="10"> <StackPanel Grid.Row="0" Grid.Column="1" Margin="10">
<Label Content="Ставка за час" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Ставка за час" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="PriceHourTextBox" Width="250" Height="40" Style="{StaticResource RoundedTextBoxStyle}" /> <TextBox x:Name="PriceHourTextBox" Width="250" Height="40" Style="{StaticResource RoundedTextBoxStyle}"
PreviewTextInput="DecimalTextBox_PreviewTextInput"
TextChanged="DecimalTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0" Margin="10"> <StackPanel Grid.Row="1" Grid.Column="0" Margin="10">
<Label Content="Премия" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Премия" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="PremiumTextBox" Width="250" Height="40" Style="{StaticResource RoundedTextBoxStyle}" /> <TextBox x:Name="PremiumTextBox" Width="250" Height="40" Style="{StaticResource RoundedTextBoxStyle}"
PreviewTextInput="DecimalTextBox_PreviewTextInput"
TextChanged="DecimalTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="1" Grid.Column="1" Margin="10"> <StackPanel Grid.Row="1" Grid.Column="1" Margin="10">
<Label Content="Дата" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Дата" Foreground="White" HorizontalAlignment="Center"/>

View File

@ -23,13 +23,15 @@ namespace EmployeeManagmentView.Employee.Salary
{ {
private readonly ISalaryLogic _salaryLogic; // Логика для работы с зарплатами private readonly ISalaryLogic _salaryLogic; // Логика для работы с зарплатами
private readonly IEmployeeLogic _employeeLogic; // Логика для работы с сотрудниками private readonly IEmployeeLogic _employeeLogic; // Логика для работы с сотрудниками
private readonly IPhisicalPersonLogic _phisicalPersonLogic;
private List<SalaryViewModel> _salaries; private List<SalaryViewModel> _salaries;
private List<EmployeeViewModel> _employees; // Список сотрудников private List<EmployeeViewModel> _employees; // Список сотрудников
public EditSalaryWindow(ISalaryLogic salaryLogic, IEmployeeLogic employeeLogic) public EditSalaryWindow(ISalaryLogic salaryLogic, IEmployeeLogic employeeLogic, IPhisicalPersonLogic phisicalPersonLogic)
{ {
_salaryLogic = salaryLogic; _salaryLogic = salaryLogic;
_employeeLogic = employeeLogic; _employeeLogic = employeeLogic;
_phisicalPersonLogic = phisicalPersonLogic;
InitializeComponent(); InitializeComponent();
LoadSalaries(); LoadSalaries();
} }
@ -77,6 +79,120 @@ namespace EmployeeManagmentView.Employee.Salary
SalaryComboBox.ItemsSource = filteredSalaries; SalaryComboBox.ItemsSource = filteredSalaries;
} }
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;
}
}
private void NumericTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
// Разрешаем ввод только цифр и запятой
e.Handled = !char.IsDigit(e.Text, 0);
}
// Ограничение на 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);
}
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) private void SaveButton_Click(object sender, RoutedEventArgs e)
{ {
try try

View File

@ -26,12 +26,14 @@ namespace EmployeeManagmentView.Employee.Salary
private readonly ISalaryLogic _salaryLogic; private readonly ISalaryLogic _salaryLogic;
private readonly IEmployeeLogic _employeeLogic; private readonly IEmployeeLogic _employeeLogic;
private readonly IPhisicalPersonLogic _phisicalPersonLogic;
public SalaryManagementWindow(ISalaryLogic salaryLogic, IEmployeeLogic employeeLogic) public SalaryManagementWindow(ISalaryLogic salaryLogic, IEmployeeLogic employeeLogic, IPhisicalPersonLogic phisicalPersonLogic)
{ {
_salaryLogic = salaryLogic; _salaryLogic = salaryLogic;
_employeeLogic = employeeLogic; _employeeLogic = employeeLogic;
_phisicalPersonLogic = phisicalPersonLogic;
InitializeComponent(); InitializeComponent();
} }
@ -47,7 +49,7 @@ namespace EmployeeManagmentView.Employee.Salary
} }
} }
var addWindow = new AddSalaryWindow(_salaryLogic, _employeeLogic); var addWindow = new AddSalaryWindow(_salaryLogic, _employeeLogic, _phisicalPersonLogic);
addWindow.Show(); addWindow.Show();
} }
@ -77,7 +79,7 @@ namespace EmployeeManagmentView.Employee.Salary
} }
} }
var editWindow = new EditSalaryWindow(_salaryLogic, _employeeLogic); var editWindow = new EditSalaryWindow(_salaryLogic, _employeeLogic, _phisicalPersonLogic);
editWindow.Show(); editWindow.Show();
} }

View File

@ -1,12 +1,15 @@
<Window x:Class="EmployeeManagmentView.Employee.Salary.ViewSalaryWindow" <Window x:Class="EmployeeManagmentView.Employee.Salary.ViewSalaryWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:EmployeeManagmentDataModels.Enums;assembly=EmployeeManagmentDataModels"
Title="Управление зарплатами" Title="Управление зарплатами"
Height="600" Width="800" Height="600" Width="800"
ResizeMode="NoResize" ResizeMode="NoResize"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
Background="#0D2D4F"> Background="#0D2D4F">
<Window.Resources>
<local:BooleanToSalaryConverter x:Key="BooleanToSalaryConverter" />
</Window.Resources>
<Grid> <Grid>
<!-- Заголовок окна --> <!-- Заголовок окна -->
<TextBlock Text="Список зарплат" <TextBlock Text="Список зарплат"
@ -34,8 +37,9 @@
<DataGridTextColumn Header="Цена за час" Binding="{Binding PriceHour, StringFormat={}{0:F2}}" Width="*" /> <DataGridTextColumn Header="Цена за час" Binding="{Binding PriceHour, StringFormat={}{0:F2}}" Width="*" />
<DataGridTextColumn Header="Премия" Binding="{Binding Premium, StringFormat={}{0:F2}}" Width="*" /> <DataGridTextColumn Header="Премия" Binding="{Binding Premium, StringFormat={}{0:F2}}" Width="*" />
<DataGridTextColumn Header="Дата" Binding="{Binding Date, StringFormat=dd.MM.yyyy}" Width="*" /> <DataGridTextColumn Header="Дата" Binding="{Binding Date, StringFormat=dd.MM.yyyy}" Width="*" />
<DataGridTextColumn Header="Заврешен" Binding="{Binding Passed}" Width="*" /> <DataGridTextColumn Header="Оплачено" Binding="{Binding Passed, Converter={StaticResource BooleanToSalaryConverter}}" Width="*" />
<DataGridTextColumn Header="Сотрудник" Binding="{Binding EmployeeName}" Width="*" /> <DataGridTextColumn Header="Работа" Binding="{Binding EmployeeName}" Width="*" />
<DataGridTextColumn Header="Физ. лицо" Binding="{Binding PhysicalPersonName}" Width="*" />
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>

View File

@ -2,6 +2,7 @@
using EmployeeManagmentContracts.ViewModels; using EmployeeManagmentContracts.ViewModels;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -39,6 +40,7 @@ namespace EmployeeManagmentView.Employee.Salary
SalariesDataGrid.ItemsSource = _allSalaries; SalariesDataGrid.ItemsSource = _allSalaries;
} }
private void SearchTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) private void SearchTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{ {
string query = SearchTextBox.Text.ToLower(); string query = SearchTextBox.Text.ToLower();

View File

@ -4,6 +4,7 @@ using EmployeeManagmentContracts.ViewModels;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Security.AccessControl;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
@ -25,23 +26,103 @@ namespace EmployeeManagmentView.Employee.Vacation
private readonly IVacationLogic _vacationLogic; private readonly IVacationLogic _vacationLogic;
private readonly IEmployeeLogic _employeeLogic; private readonly IEmployeeLogic _employeeLogic;
private readonly IPhisicalPersonLogic _phisicalPersonLogic;
private List<EmployeeViewModel> _employees;
public AddVacationWindow(IVacationLogic vacationLogic, IEmployeeLogic employeeLogic) public AddVacationWindow(IVacationLogic vacationLogic, IEmployeeLogic employeeLogic, IPhisicalPersonLogic phisicalPersonLogic)
{ {
_vacationLogic = vacationLogic; _vacationLogic = vacationLogic;
_employeeLogic = employeeLogic; _employeeLogic = employeeLogic;
_phisicalPersonLogic = phisicalPersonLogic;
InitializeComponent(); InitializeComponent();
LoadEmployees(); LoadEmployees();
} }
private void LoadEmployees() private void LoadEmployees()
{ {
var employees = _employeeLogic.GetFullList(); _employees = _employeeLogic.GetFullList();
EmployeeComboBox.ItemsSource = employees;
EmployeeComboBox.DisplayMemberPath = "NameJob"; // Заполняем комбинированное свойство, если нужно
foreach (var employee in _employees)
{
var physicalPerson = _phisicalPersonLogic.GetElement(employee.PhysicalPersonsId ?? 0);
employee.PhysicalPersonName = physicalPerson?.FullNameWithBirthday;
}
EmployeeComboBox.ItemsSource = _employees;
EmployeeComboBox.DisplayMemberPath = "DisplayText"; // Используем новое свойство
EmployeeComboBox.SelectedValuePath = "Id"; EmployeeComboBox.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 TelephoneTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
e.Handled = !char.IsDigit(e.Text, 0);
}
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) private void SaveButton_Click(object sender, RoutedEventArgs e)
{ {
try try

View File

@ -3,6 +3,7 @@ using EmployeeManagmentContracts.ViewModels;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Security.AccessControl;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
@ -23,13 +24,15 @@ namespace EmployeeManagmentView.Employee.Vacation
{ {
private readonly IVacationLogic _vacationLogic; // Логика для работы с отпусками private readonly IVacationLogic _vacationLogic; // Логика для работы с отпусками
private readonly IEmployeeLogic _employeeLogic; // Логика для работы с сотрудниками private readonly IEmployeeLogic _employeeLogic; // Логика для работы с сотрудниками
private readonly IPhisicalPersonLogic _phisicalPersonLogic;
private List<VacationViewModel> _vacations; private List<VacationViewModel> _vacations;
private List<EmployeeViewModel> _employees; // Список сотрудников private List<EmployeeViewModel> _employees; // Список сотрудников
public EditVacationWindow(IVacationLogic vacationLogic, IEmployeeLogic employeeLogic) public EditVacationWindow(IVacationLogic vacationLogic, IEmployeeLogic employeeLogic, IPhisicalPersonLogic phisicalPersonLogic)
{ {
_vacationLogic = vacationLogic; _vacationLogic = vacationLogic;
_employeeLogic = employeeLogic; _employeeLogic = employeeLogic;
_phisicalPersonLogic = phisicalPersonLogic;
InitializeComponent(); InitializeComponent();
LoadVacations(); LoadVacations();
} }
@ -76,6 +79,75 @@ namespace EmployeeManagmentView.Employee.Vacation
VacationComboBox.ItemsSource = filteredVacations; VacationComboBox.ItemsSource = filteredVacations;
} }
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 TelephoneTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
e.Handled = !char.IsDigit(e.Text, 0);
}
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) private void SaveButton_Click(object sender, RoutedEventArgs e)
{ {
try try

View File

@ -24,12 +24,14 @@ namespace EmployeeManagmentView.Employee.Vacation
private readonly IVacationLogic _vacationLogic; private readonly IVacationLogic _vacationLogic;
private readonly IEmployeeLogic _employeeLogic; private readonly IEmployeeLogic _employeeLogic;
private readonly IPhisicalPersonLogic _phisicalPersonLogic;
public VacationManagementWindow(IVacationLogic vacationLogic, IEmployeeLogic employeeLogic) public VacationManagementWindow(IVacationLogic vacationLogic, IEmployeeLogic employeeLogic, IPhisicalPersonLogic phisicalPersonLogic)
{ {
_vacationLogic = vacationLogic; _vacationLogic = vacationLogic;
_employeeLogic = employeeLogic; _employeeLogic = employeeLogic;
_phisicalPersonLogic = phisicalPersonLogic;
InitializeComponent(); InitializeComponent();
} }
@ -45,7 +47,7 @@ namespace EmployeeManagmentView.Employee.Vacation
} }
} }
var addWindow = new AddVacationWindow(_vacationLogic, _employeeLogic); var addWindow = new AddVacationWindow(_vacationLogic, _employeeLogic, _phisicalPersonLogic);
addWindow.Show(); addWindow.Show();
} }
@ -75,7 +77,7 @@ namespace EmployeeManagmentView.Employee.Vacation
} }
} }
var editWindow = new EditVacationWindow(_vacationLogic, _employeeLogic); var editWindow = new EditVacationWindow(_vacationLogic, _employeeLogic, _phisicalPersonLogic);
editWindow.Show(); editWindow.Show();
} }
@ -90,7 +92,7 @@ namespace EmployeeManagmentView.Employee.Vacation
} }
} }
var viewWindow = new ViewVacationWindow(_vacationLogic); var viewWindow = new ViewVacationWindow(_vacationLogic, _employeeLogic, _phisicalPersonLogic);
viewWindow.Show(); viewWindow.Show();
} }
} }

View File

@ -1,12 +1,15 @@
<Window x:Class="EmployeeManagmentView.Employee.Vacation.ViewVacationWindow" <Window x:Class="EmployeeManagmentView.Employee.Vacation.ViewVacationWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:EmployeeManagmentDataModels.Enums;assembly=EmployeeManagmentDataModels"
Title="Управление отпусками" Title="Управление отпусками"
Height="600" Width="800" Height="600" Width="800"
ResizeMode="NoResize" ResizeMode="NoResize"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
Background="#0D2D4F"> Background="#0D2D4F">
<Window.Resources>
<local:BooleanToVacationConverter x:Key="BooleanToVacationConverter" />
</Window.Resources>
<Grid> <Grid>
<!-- Заголовок окна --> <!-- Заголовок окна -->
<TextBlock Text="Список отпусков" <TextBlock Text="Список отпусков"
@ -32,8 +35,8 @@
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="Дата начала" Binding="{Binding StartData, StringFormat=dd.MM.yyyy}" Width="*" /> <DataGridTextColumn Header="Дата начала" Binding="{Binding StartData, StringFormat=dd.MM.yyyy}" Width="*" />
<DataGridTextColumn Header="Дата окончания" Binding="{Binding EndData, StringFormat=dd.MM.yyyy}" Width="*" /> <DataGridTextColumn Header="Дата окончания" Binding="{Binding EndData, StringFormat=dd.MM.yyyy}" Width="*" />
<DataGridTextColumn Header="Заврешен" Binding="{Binding Passed}" Width="*" /> <DataGridTextColumn Header="Заврешен" Binding="{Binding Passed, Converter={StaticResource BooleanToVacationConverter}}" Width="*" />
<DataGridTextColumn Header="Сотрудник" Binding="{Binding EmployeeName}" Width="*" /> <DataGridTextColumn Header="Работник" Binding="{Binding EmployeeName}" Width="*" />
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>

View File

@ -1,4 +1,5 @@
using EmployeeManagmentContracts.BusinessLogicContracts; using EmployeeManagmentBusinessLogic.BusinessLogic;
using EmployeeManagmentContracts.BusinessLogicContracts;
using EmployeeManagmentContracts.ViewModels; using EmployeeManagmentContracts.ViewModels;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -23,11 +24,16 @@ namespace EmployeeManagmentView.Employee.Vacation
{ {
private readonly IVacationLogic _vacationLogic; private readonly IVacationLogic _vacationLogic;
private readonly IEmployeeLogic _employeeLogic;
private readonly IPhisicalPersonLogic _phisicalPersonLogic;
private IEnumerable<VacationViewModel> _allVacations; private IEnumerable<VacationViewModel> _allVacations;
private List<EmployeeViewModel> _employees;
public ViewVacationWindow(IVacationLogic vacationLogic) public ViewVacationWindow(IVacationLogic vacationLogic, IEmployeeLogic employeeLogic, IPhisicalPersonLogic phisicalPersonLogic)
{ {
_vacationLogic = vacationLogic; _vacationLogic = vacationLogic;
_employeeLogic = employeeLogic;
_phisicalPersonLogic = phisicalPersonLogic;
InitializeComponent(); InitializeComponent();
LoadVacations(); LoadVacations();
} }
@ -38,6 +44,7 @@ namespace EmployeeManagmentView.Employee.Vacation
VacationsDataGrid.ItemsSource = _allVacations; VacationsDataGrid.ItemsSource = _allVacations;
} }
private void SearchTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) private void SearchTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{ {
string query = SearchTextBox.Text.ToLower(); string query = SearchTextBox.Text.ToLower();

View File

@ -28,13 +28,16 @@ namespace EmployeeManagmentView.Employee
private readonly IEmployeeLogic _employeeLogic; private readonly IEmployeeLogic _employeeLogic;
private readonly ISalaryLogic _salaryLogic; private readonly ISalaryLogic _salaryLogic;
private readonly IVacationLogic _vacationLogic; private readonly IVacationLogic _vacationLogic;
private readonly IPhisicalPersonLogic _phisicalPersonLogic;
private IEnumerable<EmployeeViewModel> _allEmployees; // Список сотрудников для фильтрации private IEnumerable<EmployeeViewModel> _allEmployees; // Список сотрудников для фильтрации
private List<EmployeeViewModel> _employees;
public ViewEmployeeWindow(IEmployeeLogic employeeLogic, ISalaryLogic salaryLogic, IVacationLogic vacationLogic) public ViewEmployeeWindow(IEmployeeLogic employeeLogic, ISalaryLogic salaryLogic, IVacationLogic vacationLogic, IPhisicalPersonLogic phisicalPersonLogic)
{ {
_employeeLogic = employeeLogic; _employeeLogic = employeeLogic;
_salaryLogic = salaryLogic; _salaryLogic = salaryLogic;
_vacationLogic = vacationLogic; _vacationLogic = vacationLogic;
_phisicalPersonLogic = phisicalPersonLogic;
InitializeComponent(); InitializeComponent();
LoadEmployees(); LoadEmployees();
} }
@ -43,6 +46,9 @@ namespace EmployeeManagmentView.Employee
{ {
_allEmployees = _employeeLogic.GetFullList(); // Загрузка всех данных _allEmployees = _employeeLogic.GetFullList(); // Загрузка всех данных
EmployeesDataGrid.ItemsSource = _allEmployees; EmployeesDataGrid.ItemsSource = _allEmployees;
_employees = _employeeLogic.GetFullList();
} }
@ -86,7 +92,7 @@ namespace EmployeeManagmentView.Employee
} }
} }
var salaryWindow = new SalaryManagementWindow(_salaryLogic, _employeeLogic); var salaryWindow = new SalaryManagementWindow(_salaryLogic, _employeeLogic, _phisicalPersonLogic);
salaryWindow.Show(); salaryWindow.Show();
} }
@ -105,7 +111,7 @@ namespace EmployeeManagmentView.Employee
} }
} }
var vacationWindow = new VacationManagementWindow(_vacationLogic, _employeeLogic); var vacationWindow = new VacationManagementWindow(_vacationLogic, _employeeLogic, _phisicalPersonLogic);
vacationWindow.Show(); vacationWindow.Show();
} }
} }

View File

@ -77,17 +77,23 @@
<StackPanel Grid.Row="0" Grid.Column="0" Margin="10"> <StackPanel Grid.Row="0" Grid.Column="0" Margin="10">
<Label Content="Имя" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Имя" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="NameTextBox" Width="250" Height="40" <TextBox x:Name="NameTextBox" Width="250" Height="40"
Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите имя" /> Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите имя"
PreviewTextInput="NameTextBox_PreviewTextInput"
TextChanged="NameTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1" Margin="10"> <StackPanel Grid.Row="0" Grid.Column="1" Margin="10">
<Label Content="Фамилия" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Фамилия" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="SurnameTextBox" Width="250" Height="40" <TextBox x:Name="SurnameTextBox" Width="250" Height="40"
Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите фамилию" /> Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите фамилию"
PreviewTextInput="NameTextBox_PreviewTextInput"
TextChanged="NameTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0" Margin="10" > <StackPanel Grid.Row="1" Grid.Column="0" Margin="10" >
<Label Content="Отчество" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Отчество" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="PatronomicTextBox" Width="250" Height="40" <TextBox x:Name="PatronomicTextBox" Width="250" Height="40"
Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите отчество" /> Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите отчество"
PreviewTextInput="NameTextBox_PreviewTextInput"
TextChanged="NameTextBox_TextChanged"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="1" Grid.Column="1" Margin="10"> <StackPanel Grid.Row="1" Grid.Column="1" Margin="10">
<Label Content="Дата рождения" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Дата рождения" Foreground="White" HorizontalAlignment="Center"/>
@ -109,7 +115,9 @@
<StackPanel Grid.Row="3" Grid.Column="0" Margin="10"> <StackPanel Grid.Row="3" Grid.Column="0" Margin="10">
<Label Content="Телефон" Foreground="White" HorizontalAlignment="Center"/> <Label Content="Телефон" Foreground="White" HorizontalAlignment="Center"/>
<TextBox x:Name="TelephoneTextBox" Width="250" Height="40" <TextBox x:Name="TelephoneTextBox" Width="250" Height="40"
Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите номер телефона" /> Style="{StaticResource RoundedTextBoxStyle}" ToolTip="Введите номер телефона"
PreviewTextInput="TelephoneTextBox_PreviewTextInput"
TextChanged="TelephoneTextBox_TextChanged"/>
</StackPanel> </StackPanel>
</Grid> </Grid>

View File

@ -62,6 +62,76 @@ namespace EmployeeManagmentView.PhysicalPerson
} }
} }
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 TelephoneTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
e.Handled = !char.IsDigit(e.Text, 0);
}
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 SearchTextBox_TextChanged(object sender, TextChangedEventArgs e) private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)