Files
Avalonia/PortfolioManager/Dialogs/ClosePositionDialogViewModel.cs

185 lines
3.8 KiB
C#

using System;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Rendering.Composition;
using CommunityToolkit.Mvvm.Input;
using MarketData;
using MarketData.DataAccess;
using MarketData.Generator.Interface;
using MarketData.MarketDataModel;
using MarketData.Utils;
using PortfolioManager.ViewModels;
namespace PortfolioManager.Dialogs
{
public partial class ClosePositionDialogViewModel : DialogViewModelBase
{
// private IPosition sourcePosition;
private IPurePosition sourcePosition;
private String message = String.Empty;
private bool okEnabled = false;
public ClosePositionDialogViewModel(Window dialogWindow, IPurePosition clonedPosition)
: base(dialogWindow)
{
sourcePosition = clonedPosition;
if (Utility.IsEpoch(sourcePosition.SellDate))
{
sourcePosition.SellDate = DateTime.Now.Date;
}
OkEnabled = Validate();
DisplayName = "Close Position";
}
public String Symbol
{
get { return sourcePosition.Symbol; }
}
public String CompanyName
{
get
{
CompanyProfile companyProfile = CompanyProfileDA.GetCompanyProfile(sourcePosition.Symbol);
return companyProfile.CompanyName;
}
}
public String PurchaseDate
{
get
{
return sourcePosition.PurchaseDate.ToShortDateString();
}
}
public String SellDate
{
get
{
return sourcePosition.SellDate.ToShortDateString();
}
set
{
try
{
sourcePosition.SellDate = Utility.ParseDate(value);
base.OnPropertyChanged("SellDate");
OkEnabled = Validate();
}
catch (Exception)
{
Message = "SellDate must be a valid date.";
}
}
}
public String SellPrice
{
get
{
return Utility.FormatCurrency(sourcePosition.CurrentPrice, 3);
}
set
{
try
{
sourcePosition.CurrentPrice = Utility.ParseCurrency(value);
base.OnPropertyChanged("SellPrice");
OkEnabled = Validate();
}
catch (Exception)
{
Message = "Sell price must be a valid number.";
}
}
}
[RelayCommand(CanExecute =nameof(Validate))]
public async Task OkButtonClick()
{
IsSuccess = true;
await Close();
}
[RelayCommand]
public async Task CancelButtonClick()
{
await Close();
}
public IPurePosition GetResult()
{
return sourcePosition;
}
public String Message
{
get
{
return message;
}
set
{
message = value;
base.OnPropertyChanged("Message");
}
}
public void SetMessage(String message)
{
Message = message;
}
public bool OkEnabled
{
get
{
return okEnabled;
}
set
{
okEnabled = value;
base.OnPropertyChanged("OkEnabled");
}
}
private bool Validate()
{
DateGenerator dateGenerator = new DateGenerator();
if (null == Symbol)
{
SetMessage("Invalid Symbol.");
return false;
}
if (Utility.IsEpoch(sourcePosition.PurchaseDate))
{
SetMessage("Invalid Purchase Date.");
return false;
}
if (Utility.IsEpoch(sourcePosition.SellDate))
{
SetMessage("Invalid Sell Date.");
return false;
}
if (!dateGenerator.IsMarketOpen(sourcePosition.SellDate))
{
SetMessage("Market closed on Sell Date.");
return false;
}
if (double.IsNaN(sourcePosition.CurrentPrice))
{
SetMessage("Invalid Sell Price.");
return false;
}
SetMessage("");
return true;
}
}
}