using Avalonia.Controls; using demo_trade.Data.RemoteData.Entity; using demo_trade.Domain; using demo_trade.Models; using demo_trade.UI.Presenters; using DynamicData; using ReactiveUI; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reactive; using System.Reflection.Emit; using System.Text; using System.Threading.Tasks; namespace demo_trade.ViewModels { public class OrderShowDialogViewModel : ViewModelBase { private OrderClientUseCase _orderClientUseCase; private PickupPoint _pickupPointSelected = new(); public PickupPoint PickupPointSelected { get => _pickupPointSelected; set => this.RaiseAndSetIfChanged(ref _pickupPointSelected, value); } private Models.Order? orderComplete { get; set; } = null; private string _userName = String.Empty; public string UserName{ get => _userName; set => this.RaiseAndSetIfChanged(ref _userName, value); } private int _numberOrder = 0; public int NumberOrder { get => _numberOrder; set => this.RaiseAndSetIfChanged(ref _numberOrder, value); } private int _selectedPointId = 0; public int SelectedPointId { get => _selectedPointId; set => this.RaiseAndSetIfChanged(ref _selectedPointId, value); } private List _pickupPoints = new(); public List PickupPoints { get => _pickupPoints; set => this.RaiseAndSetIfChanged(ref _pickupPoints, value); } private Decimal _orderSumValue = 0; public Decimal OrderSumValue { get => _orderSumValue; set => this.RaiseAndSetIfChanged(ref _orderSumValue, value); } public ReactiveCommand GenerateOrderCommand { get; } private ObservableCollection _productOrderList = new(); public ObservableCollection ProductOrderList { get => _productOrderList; set => this.RaiseAndSetIfChanged(ref _productOrderList, value); } public OrderShowDialogViewModel( Dictionary orderProducts, OrderClientUseCase orderClientUseCase, User? user = null) { _orderClientUseCase = orderClientUseCase; _numberOrder = _orderClientUseCase.GetNewOrderNumber(); _pickupPoints = _orderClientUseCase.GetPickupPoints(); if (user != null) { UserName = String.Format("{0} {1} {2}", user.Usersurname, user.Username, user.Userpatronymic); } GenerateOrderCommand = ReactiveCommand.Create(() => { string? clientName = null; if(!String.IsNullOrEmpty(UserName)) clientName = UserName; var resultOrder = _orderClientUseCase.GenerateNewOrder(PickupPointSelected, ProductOrderList.ToList(),OrderSumValue, clientName); if (resultOrder != null) { NumberOrder = resultOrder.Orderid + 1; orderComplete = resultOrder; } }); foreach (var item in orderProducts.Values) { ProductOrderList.Add(new OrderProductPresenter(item.Item1, item.Item2)); } this.WhenAnyValue(it => it.ProductOrderList).Subscribe(it => CalculateOrderSum()); } public void NumericChange(string ArticleProduct, int value) { ProductOrderList.First(it => it.ArticleNumber == ArticleProduct).ProductCount = value; CalculateOrderSum(); if (value == 0) { ProductOrderList.Remove(ProductOrderList.First(it => it.ArticleNumber == ArticleProduct)); return; } } public void SaveFile(string path) { if (orderComplete == null) return; Ticket ticket = new Ticket() { ClientName = orderComplete.OrderClient, OrderID = orderComplete.Orderid, OrderDate = DateOnly.FromDateTime(DateTime.Now), OrderDelivery = orderComplete.Orderdeliverydate, Products = orderComplete.ProductList, PickupPointName = orderComplete.PickupPointName, OrderSumCost = orderComplete.OrderSumCost } ; ticket.GeneratePDF(path); } private void CalculateOrderSum() { var orderSum = ProductOrderList.Sum(product => { if (product.CostWithDiscount != null) return product.CostWithDiscount * product.ProductCount; return product.ProductCount * product.Cost; }); if (orderSum != null) OrderSumValue = orderSum.Value; } } }