2025-02-11 10:23:14 +00:00
|
|
|
|
using Avalonia.Controls;
|
|
|
|
|
using Avalonia.Interactivity;
|
2025-04-25 11:37:47 +00:00
|
|
|
|
using Avalonia.Media.Imaging;
|
2025-04-22 07:25:24 +00:00
|
|
|
|
using Demka_Snova_1.Hardik.Conect;
|
2025-02-11 10:23:14 +00:00
|
|
|
|
using Demka_Snova_1.Hardik.Conect.Dao;
|
2025-04-25 11:37:47 +00:00
|
|
|
|
using PdfSharpCore.Drawing;
|
|
|
|
|
using PdfSharpCore.Pdf;
|
2025-02-11 10:23:14 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2025-04-25 11:37:47 +00:00
|
|
|
|
using System.IO;
|
2025-04-22 07:25:24 +00:00
|
|
|
|
using System.Linq;
|
2025-04-25 11:37:47 +00:00
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
2025-02-11 10:23:14 +00:00
|
|
|
|
|
|
|
|
|
namespace Demka_Snova_1.OknaFunciy;
|
|
|
|
|
|
|
|
|
|
public partial class AddZakazWindow : Window
|
|
|
|
|
{
|
2025-04-25 11:37:47 +00:00
|
|
|
|
private List<KlientDao> _allClients;
|
|
|
|
|
private List<uslugiDao> _allServices;
|
|
|
|
|
private List<SelectedService> _selectedServices = new();
|
|
|
|
|
private KlientDao _selectedClient;
|
|
|
|
|
private int _nextOrderId;
|
|
|
|
|
private string _generatedBarcodeData;
|
|
|
|
|
|
|
|
|
|
//private TextBox OrderNumberTextBox => this.FindControl<TextBox>("OrderNumberTextBox");
|
|
|
|
|
//private TextBox ClientSearchTextBoxTextBox => this.FindControl<TextBox>("ClientSearchTextBoxTextBox");
|
|
|
|
|
private TextBox ServiceSearchTextBox => this.FindControl<TextBox>("ServiceSearchTextBox");
|
|
|
|
|
//private TextBox TotalPriceTextBlock => this.FindControl<TextBox>("TotalPriceTextBlock");
|
|
|
|
|
//private DataGrid ClientsDataGrid => this.FindControl<DataGrid>("ClientsDataGrid");
|
|
|
|
|
//private DataGrid ServicesDataGrid => this.FindControl<DataGrid>("ServicesDataGrid");
|
|
|
|
|
//private DataGrid SelectedServicesDataGrid => this.FindControl<DataGrid>("SelectedServicesDataGrid");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-02-11 10:23:14 +00:00
|
|
|
|
|
|
|
|
|
public AddZakazWindow()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
2025-05-07 11:41:56 +00:00
|
|
|
|
this.DataContext = this;
|
2025-05-06 10:38:00 +00:00
|
|
|
|
this.Loaded += OnWindowLoaded;
|
2025-04-25 11:37:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-05-06 10:38:00 +00:00
|
|
|
|
private void OnWindowLoaded(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
LoadData();
|
|
|
|
|
}
|
2025-04-25 11:37:47 +00:00
|
|
|
|
|
|
|
|
|
private async void LoadData()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using (var db = new DatabaseConnection())
|
|
|
|
|
{
|
|
|
|
|
_allClients = db.GetAllKlienti();
|
|
|
|
|
_allServices = db.GetAllUslugi();
|
|
|
|
|
|
2025-05-07 11:41:56 +00:00
|
|
|
|
foreach (var service in _allServices)
|
2025-05-06 10:38:00 +00:00
|
|
|
|
{
|
2025-05-07 11:41:56 +00:00
|
|
|
|
service.Code = service.id.ToString();
|
2025-05-06 10:38:00 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-04-25 11:37:47 +00:00
|
|
|
|
var orders = db.GetAllOrders();
|
|
|
|
|
_nextOrderId = orders.Count > 0 ? orders.Max(o => o.ID) + 1 : 1;
|
|
|
|
|
|
|
|
|
|
OrderNumberTextBox.Text = _nextOrderId.ToString();
|
|
|
|
|
OrderNumberTextBox.Watermark = $"Рекомендуемый номер: {_nextOrderId}";
|
|
|
|
|
|
|
|
|
|
ClientsDataGrid.ItemsSource = _allClients;
|
|
|
|
|
ServicesDataGrid.ItemsSource = _allServices;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
await ShowError($"Ошибка загрузки данных: {ex.Message}");
|
|
|
|
|
}
|
2025-04-22 07:25:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-04-25 11:37:47 +00:00
|
|
|
|
private void OrderNumberTextBox_KeyDown(object sender, Avalonia.Input.KeyEventArgs e)
|
2025-04-22 07:25:24 +00:00
|
|
|
|
{
|
2025-04-25 11:37:47 +00:00
|
|
|
|
if (e.Key == Avalonia.Input.Key.Enter)
|
2025-04-22 07:25:24 +00:00
|
|
|
|
{
|
2025-04-25 11:37:47 +00:00
|
|
|
|
if (int.TryParse(OrderNumberTextBox.Text, out int orderNum))
|
|
|
|
|
{
|
|
|
|
|
_nextOrderId = orderNum;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
OrderNumberTextBox.Text = _nextOrderId.ToString();
|
|
|
|
|
}
|
2025-04-22 07:25:24 +00:00
|
|
|
|
}
|
2025-02-11 10:23:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-04-25 11:37:47 +00:00
|
|
|
|
private void ClientSearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
|
|
|
|
{
|
2025-05-07 11:41:56 +00:00
|
|
|
|
var searchText = ClientSearchTextBox.Text?.ToLower() ?? string.Empty;
|
|
|
|
|
if (_allClients != null)
|
|
|
|
|
{
|
|
|
|
|
ClientsDataGrid.ItemsSource = _allClients
|
|
|
|
|
.Where(c => c.Fio?.ToLower().Contains(searchText) == true ||
|
|
|
|
|
c.Code.ToString().Contains(searchText))
|
|
|
|
|
.ToList();
|
|
|
|
|
}
|
2025-04-25 11:37:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ServiceSearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
2025-02-11 10:23:14 +00:00
|
|
|
|
{
|
2025-04-25 11:37:47 +00:00
|
|
|
|
var searchText = ServiceSearchTextBox.Text.ToLower();
|
|
|
|
|
ServicesDataGrid.ItemsSource = _allServices
|
|
|
|
|
.Where(s => s.Name.ToLower().Contains(searchText) ||
|
2025-05-06 10:38:00 +00:00
|
|
|
|
s.Code.ToString().Contains(searchText))
|
2025-04-25 11:37:47 +00:00
|
|
|
|
.ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ClientsDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
_selectedClient = ClientsDataGrid.SelectedItem as KlientDao;
|
|
|
|
|
UpdateButtonsState();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async void AddClientButton_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var addClientWindow = new AddClientWindow();
|
|
|
|
|
var result = await addClientWindow.ShowDialog<KlientDao>(this);
|
|
|
|
|
|
|
|
|
|
if (result != null)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using (var db = new DatabaseConnection())
|
|
|
|
|
{
|
|
|
|
|
_allClients.Add(result);
|
|
|
|
|
ClientsDataGrid.ItemsSource = _allClients;
|
|
|
|
|
ClientsDataGrid.SelectedItem = result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
await ShowError($"Ошибка при добавлении клиента: {ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-02-11 10:23:14 +00:00
|
|
|
|
|
2025-04-25 11:37:47 +00:00
|
|
|
|
private async void AddServiceButton_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var selectedService = ServicesDataGrid.SelectedItem as uslugiDao;
|
|
|
|
|
if (selectedService == null)
|
2025-02-11 10:23:14 +00:00
|
|
|
|
{
|
2025-04-25 11:37:47 +00:00
|
|
|
|
await ShowError("Выберите услугу из списка");
|
2025-02-11 10:23:14 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-25 11:37:47 +00:00
|
|
|
|
/*var hoursWindow = new InputHoursWindow(selectedService.Name);
|
|
|
|
|
var hours = await hoursWindow.ShowDialog<int?>(this);
|
|
|
|
|
|
|
|
|
|
if (hours.HasValue && hours > 0)
|
2025-02-11 10:23:14 +00:00
|
|
|
|
{
|
2025-04-25 11:37:47 +00:00
|
|
|
|
_selectedServices.Add(new SelectedService
|
|
|
|
|
{
|
|
|
|
|
Id = selectedService.id.ToString(),
|
|
|
|
|
Name = selectedService.Name,
|
|
|
|
|
PrisePerH = selectedService.PrisePerH,
|
|
|
|
|
Hours = hours.Value
|
|
|
|
|
});
|
2025-02-11 10:23:14 +00:00
|
|
|
|
|
2025-04-25 11:37:47 +00:00
|
|
|
|
UpdateSelectedServices();
|
|
|
|
|
}*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void RemoveServiceButton_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var selected = SelectedServicesDataGrid.SelectedItem as SelectedService;
|
|
|
|
|
if (selected != null)
|
|
|
|
|
{
|
|
|
|
|
_selectedServices.Remove(selected);
|
|
|
|
|
UpdateSelectedServices();
|
|
|
|
|
}
|
2025-02-11 10:23:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-04-25 11:37:47 +00:00
|
|
|
|
private void UpdateSelectedServices()
|
|
|
|
|
{
|
|
|
|
|
SelectedServicesDataGrid.ItemsSource = _selectedServices.ToList();
|
|
|
|
|
TotalPriceTextBlock.Text = $"Итого: {_selectedServices.Sum(s => s.Total)} руб.";
|
|
|
|
|
UpdateButtonsState();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async void SaveOrderButton_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (_selectedClient == null || !_selectedServices.Any())
|
|
|
|
|
{
|
|
|
|
|
await ShowError("Выберите клиента и добавьте хотя бы одну услугу");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using (var db = new DatabaseConnection())
|
|
|
|
|
{
|
|
|
|
|
var order = new ordersDao
|
|
|
|
|
{
|
|
|
|
|
ID = _nextOrderId,
|
|
|
|
|
CodeZakaz = _generatedBarcodeData,
|
|
|
|
|
Date = DateOnly.FromDateTime(DateTime.Now),
|
|
|
|
|
Time = TimeOnly.FromDateTime(DateTime.Now),
|
|
|
|
|
CodeClient = _selectedClient.Code.ToString(),
|
|
|
|
|
Usluga = string.Join(", ", _selectedServices.Select(s => $"{s.Name} ({s.Hours}ч)")),
|
|
|
|
|
Status = "Активен",
|
|
|
|
|
Prokat = _selectedServices.Sum(s => s.Hours)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
db.AddOrder(order);
|
|
|
|
|
|
|
|
|
|
var orderData = $"дата_заказа={DateTime.Now:yyyy-MM-ddTHH:mm:ss}&номер_заказа={_nextOrderId}";
|
|
|
|
|
var base64Data = Convert.ToBase64String(Encoding.UTF8.GetBytes(orderData));
|
|
|
|
|
var orderLink = $"C:/Users/PC/source/Dopolnenia/Fails/Doky";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var linkPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
|
|
|
|
|
$"Ссылка_заказа_{_nextOrderId}.txt");
|
|
|
|
|
File.WriteAllText(linkPath, orderLink);
|
|
|
|
|
|
|
|
|
|
var pdfPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
|
|
|
|
|
$"Штрих-код_{_nextOrderId}.pdf");
|
|
|
|
|
|
|
|
|
|
await ShowError($"Заказ №{_nextOrderId} успешно сохранен!\n" +
|
|
|
|
|
$"Штрих-код сохранен в: {pdfPath}\n" +
|
|
|
|
|
$"Ссылка сохранена в: {linkPath}");
|
|
|
|
|
|
|
|
|
|
this.Close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
await ShowError($"Ошибка при сохранении заказа: {ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void CancelButton_Click(object sender, RoutedEventArgs e)
|
2025-02-11 10:23:14 +00:00
|
|
|
|
{
|
|
|
|
|
this.Close();
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-25 11:37:47 +00:00
|
|
|
|
private void UpdateButtonsState()
|
|
|
|
|
{
|
|
|
|
|
SaveOrderButton.IsEnabled = _selectedClient != null && _selectedServices.Any();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task ShowError(string message)
|
2025-03-05 09:12:58 +00:00
|
|
|
|
{
|
|
|
|
|
var dialog = new Window
|
2025-02-11 10:23:14 +00:00
|
|
|
|
{
|
2025-04-25 11:37:47 +00:00
|
|
|
|
Title = "Информация",
|
|
|
|
|
Content = new TextBlock { Text = message },
|
|
|
|
|
Width = 400,
|
|
|
|
|
Height = 200,
|
2025-05-06 10:38:00 +00:00
|
|
|
|
WindowStartupLocation = WindowStartupLocation.CenterScreen
|
2025-03-05 09:12:58 +00:00
|
|
|
|
};
|
2025-05-06 10:38:00 +00:00
|
|
|
|
|
|
|
|
|
// await dialog.Show()
|
2025-03-05 09:12:58 +00:00
|
|
|
|
await dialog.ShowDialog(this);
|
|
|
|
|
}
|
|
|
|
|
}
|