181 lines
7.4 KiB
C#
181 lines
7.4 KiB
C#
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;
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|