PIbd-42_Kashin_M.I_CPO_Cour.../EmployeeManagmentView/Employee/Salary/ViewSalaryWindow.xaml.cs

181 lines
7.4 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.Spreadsheet;
using DocumentFormat.OpenXml;
using EmployeeManagmentContracts.BusinessLogicContracts;
using EmployeeManagmentContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.IO;
using Microsoft.Win32;
namespace EmployeeManagmentView.Employee.Salary
{
/// <summary>
/// Логика взаимодействия для ViewSalaryWindow.xaml
/// </summary>
public partial class ViewSalaryWindow : Window
{
private readonly ISalaryLogic _salaryLogic;
private IEnumerable<SalaryViewModel> _allSalaries;
public ViewSalaryWindow(ISalaryLogic salaryLogic)
{
_salaryLogic = salaryLogic;
InitializeComponent();
LoadSalaries();
}
private void LoadSalaries()
{
_allSalaries = _salaryLogic.GetFullList(); // Загрузка всех данных
SalariesDataGrid.ItemsSource = _allSalaries;
}
private void ExportToExcelButton_Click(object sender, RoutedEventArgs e)
{
try
{
// Получаем данные о зарплатах
var salaries = _salaryLogic.GetFullList();
if (salaries == null || !salaries.Any())
{
MessageBox.Show("Нет данных для экспорта.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
// Открытие диалогового окна для сохранения файла
SaveFileDialog saveFileDialog = new SaveFileDialog
{
Filter = "Excel файлы (*.xlsx)|*.xlsx", // фильтр для файлов .xlsx
Title = "Сохранить отчет об зарплатах", // заголовок окна
FileName = "Отчет_зарплат.xlsx" // имя по умолчанию
};
// Проверка, что пользователь выбрал путь и имя файла
if (saveFileDialog.ShowDialog() == true)
{
string filePath = saveFileDialog.FileName; // Путь и имя файла
GenerateExcelReport(filePath, salaries); // Генерация отчета
MessageBox.Show($"Отчет успешно сохранен: {filePath}", "Успех", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка экспорта: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void GenerateExcelReport(string filePath, List<SalaryViewModel> salaries)
{
using (SpreadsheetDocument document = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook))
{
// Создаем Workbook
WorkbookPart workbookPart = document.AddWorkbookPart();
workbookPart.Workbook = new Workbook();
// Создаем Worksheet
WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());
// Добавляем лист в Workbook
Sheets sheets = document.WorkbookPart.Workbook.AppendChild(new Sheets());
Sheet sheet = new Sheet()
{
Id = document.WorkbookPart.GetIdOfPart(worksheetPart),
SheetId = 1,
Name = "Зарплаты"
};
sheets.Append(sheet);
// Получаем SheetData
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
// Заполняем заголовки
Row headerRow = new Row();
headerRow.Append(
CreateTextCell("A", "ID"),
CreateTextCell("B", "Сотрудник"),
CreateTextCell("C", "Часы"),
CreateTextCell("D", "Ставка"),
CreateTextCell("E", "Премия"),
CreateTextCell("F", "Дата"),
CreateTextCell("G", "Статус оплаты") // Добавлен заголовок для Passed
);
sheetData.AppendChild(headerRow);
// Заполняем данные
foreach (var salary in salaries)
{
Row row = new Row();
row.Append(
CreateTextCell("A", salary.Id.ToString()),
CreateTextCell("B", salary.EmployeeName),
CreateTextCell("C", salary.CountHours.ToString()),
CreateTextCell("D", salary.PriceHour.ToString("F2")),
CreateTextCell("E", salary.Premium?.ToString("F2") ?? "0"),
CreateTextCell("F", salary.Date.Value.ToString("dd.MM.yyyy")),
CreateTextCell("G", salary.Passed ? "Заплачено" : "Не заплачено") // Используем поле Passed
);
sheetData.AppendChild(row);
}
workbookPart.Workbook.Save();
}
}
// Метод для создания текстовой ячейки
private Cell CreateTextCell(string columnName, string text)
{
return new Cell
{
DataType = CellValues.String,
CellReference = columnName,
CellValue = new CellValue(text)
};
}
private void SearchTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
string query = SearchTextBox.Text.ToLower();
if (string.IsNullOrWhiteSpace(query))
{
// Отображаем все записи
SalariesDataGrid.ItemsSource = _allSalaries;
}
else
{
// Фильтрация по всем полям сущности
var filteredList = _allSalaries.Where(sal =>
(sal.EmployeeName?.ToLower().Contains(query) ?? false) ||
sal.CountHours.ToString().Contains(query) ||
sal.PriceHour.ToString().Contains(query) ||
(sal.Premium.HasValue && sal.Premium.Value.ToString().Contains(query)) ||
(sal.Date.HasValue && sal.Date.Value.ToString("dd.MM.yyyy").Contains(query)) ||
(sal.Passed ? "заплачено" : "не заплачено").Contains(query) // Добавлен фильтр для Passed
).ToList();
SalariesDataGrid.ItemsSource = filteredList;
}
}
}
}