demko_v/MainWindow.axaml.cs
2025-04-16 00:00:02 +03:00

244 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 System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Avalonia.Media.Imaging;
using Microsoft.EntityFrameworkCore;
using demko_v.Models;
namespace demko_v;
public partial class MainWindow : Window
{
ObservableCollection<AgentPresenter> agents = new ObservableCollection<AgentPresenter>();
List<AgentPresenter> dataSourceAgents;
private const int ItemsPerPage = 10;
private int currentPage = 1;
public MainWindow()
{
InitializeComponent();
LoadData();
TitleAgentSortComboBox.SelectedIndex = 0;
SaleSortComboBox.SelectedIndex = 0;
PrioritySortCombobox.SelectedIndex = 0;
TypeAgentSortCombobox.SelectedIndex = 0;
DisplayAgents();
}
private void LoadData()
{
using var ctx = new DemoAgentsContext();
dataSourceAgents = ctx.Agents
.Include(a => a.ProductSales)
.ThenInclude(ps => ps.Product)
.Select(agent => new AgentPresenter
{
Id = agent.Id,
Title = agent.Title,
Phone = "+" + agent.Phone,
AgentType = agent.AgentType.Title,
Priority = agent.Priority,
SalesYear = agent.ProductSales.Any() ? agent.ProductSales.Max(ps => ps.SaleDate.Year) : 0,
SalesQuantity = agent.ProductSales.Sum(ps => ps.ProductCount * (int)ps.Product.MinCostForAgent),
CountSales = agent.ProductSales.Sum(ps => ps.ProductCount),
Sale = agent.ProductSales.Any() ? CalculateSale(agent.ProductSales.Sum(ps => ps.Product.MinCostForAgent * ps.ProductCount)) + "%" : "0%",
Logo = agent.Logo
}).ToList();
}
public void DisplayAgents()
{
LoadData();
var temp = dataSourceAgents;
agents.Clear();
switch (TitleAgentSortComboBox.SelectedIndex)
{
case 0: break;
case 1: temp = temp.OrderBy(a => a.Title).ToList(); break;
case 2: temp = temp.OrderByDescending(a => a.Title).ToList(); break;
}
switch (SaleSortComboBox.SelectedIndex)
{
case 0: break;
case 1: temp = temp.OrderByDescending(a => int.Parse(a.Sale.Replace("%", ""))).ToList(); break;
case 2: temp = temp.OrderBy(a => int.Parse(a.Sale.Replace("%", ""))).ToList(); break;
}
switch (PrioritySortCombobox.SelectedIndex)
{
case 0: break;
case 1: temp = temp.OrderByDescending(a => a.Priority).ToList(); break;
case 2: temp = temp.OrderBy(a => a.Priority).ToList(); break;
}
switch (TypeAgentSortCombobox.SelectedIndex)
{
case 0: break;
case 1: temp = temp.Where(a => a.AgentType == "ООО").ToList(); break;
case 2: temp = temp.Where(a => a.AgentType == "МФО").ToList(); break;
case 3: temp = temp.Where(a => a.AgentType == "ЗАО").ToList(); break;
case 4: temp = temp.Where(a => a.AgentType == "МКК").ToList(); break;
case 5: temp = temp.Where(a => a.AgentType == "ПАО").ToList(); break;
case 6: temp = temp.Where(a => a.AgentType == "ОАО").ToList(); break;
}
if (!string.IsNullOrEmpty(SearchTextBox.Text))
{
var search = SearchTextBox.Text;
temp = temp.Where(a => IsContains(a.Title, a.Phone, search)).ToList();
}
foreach (var item in temp)
{
agents.Add(item);
}
currentPage = 0;
UpdateListBox();
}
public class AgentPresenter : Agent
{
Bitmap? Image
{
get
{
try
{
string absolutePath = Path.Combine(AppContext.BaseDirectory, Logo);
return new Bitmap(absolutePath);
}
catch
{
return null;
}
}
}
public int SalesYear { get; set; }
public int? SalesQuantity { get; set; }
public string? Sale { get; set; }
public string? AgentType { get; set; }
public int CountSales { get; set; }
}
public void UpdateListBox()
{
var pagedAgents = agents.Skip(currentPage * ItemsPerPage).Take(ItemsPerPage).ToList();
AgentListBox.ItemsSource = pagedAgents;
CountAgentsTextBlock.Text = $"{currentPage + 1} / {Math.Ceiling((double)agents.Count / ItemsPerPage)}";
BackButton.IsEnabled = currentPage > 0;
NextButton.IsEnabled = (currentPage + 1) * ItemsPerPage < agents.Count;
}
public void Back_OnClick(object? sender, RoutedEventArgs e)
{
if (currentPage > 0)
{
currentPage--;
UpdateListBox();
}
}
public void Next_OnClick(object? sender, RoutedEventArgs e)
{
if ((currentPage + 1) * ItemsPerPage < agents.Count)
{
currentPage++;
UpdateListBox();
}
}
public bool IsContains(string title, string phone, string search)
{
string message = (title + phone).ToLower();
search = search.ToLower();
return message.Contains(search);
}
private static int CalculateSale(decimal totalSales)
{
if (totalSales < 10000) return 0;
if (totalSales < 50000) return 5;
if (totalSales < 150000) return 10;
if (totalSales < 500000) return 20;
return 25;
}
public void SearchTextBox_OnTextChanging(object? sender, RoutedEventArgs e)
{
DisplayAgents();
}
public void TitleAgentSortComboBox_OnSelectionChanged(object? sender, RoutedEventArgs e)
{
DisplayAgents();
}
public void SaleSortComboBox_OnSelectionChanged(object? sender, RoutedEventArgs e)
{
DisplayAgents();
}
public void PrioritySortCombobox_OnSelectionChanged(object? sender, RoutedEventArgs e)
{
DisplayAgents();
}
public void TypeAgentSortCombobox_OnSelectionChanged(object? sender, RoutedEventArgs e)
{
DisplayAgents();
}
public void AddAgent_OnClick(object? sender, RoutedEventArgs e)
{
AddAgentWindow attendanceButton = new AddAgentWindow();
attendanceButton.ShowDialog(this); ;
}
private async void EditMenuItem_OnClick(object? sender, RoutedEventArgs e)
{
using var ctx = new DemoAgentsContext();
if (AgentListBox.SelectedItem is AgentPresenter selectedAgentPresenter)
{
var agent = ctx.Agents.FirstOrDefault(a => a.Id == selectedAgentPresenter.Id);
EditAgentWindow editAgentWindow = new EditAgentWindow(agent);
var updatedAgent = await editAgentWindow.ShowDialog<Agent>(this);
}
DisplayAgents();
}
private async void PriorityMenuItem_OnClick(object? sender, RoutedEventArgs e)
{
if (AgentListBox.SelectedItem is AgentPresenter selectedAgentPresenter)
{
PriorityWindow priorityWindow = new PriorityWindow(selectedAgentPresenter.Id);
await priorityWindow.ShowDialog(this);
}
DisplayAgents();
}
}