Dashboard Bottom Sales Overview changes

This commit is contained in:
HojouFotytu 2023-12-30 14:46:45 +09:00
parent 6a364c95e7
commit bde9b98f11
4 changed files with 195 additions and 120 deletions

View File

@ -431,6 +431,31 @@ namespace Core.Main.DataObjects.PTMagicData
public double TotalCost { get; set; } public double TotalCost { get; set; }
public double SoldPrice { get; set; } public double SoldPrice { get; set; }
public double SoldValue { get; set; } public double SoldValue { get; set; }
public double TotalSales { get; set; }
}
public class StatsData
{
public double SalesToday { get; set; }
public double ProfitToday { get; set; }
public double ProfitPercToday { get; set; }
public double SalesYesterday { get; set; }
public double ProfitYesterday { get; set; }
public double ProfitPercYesterday { get; set; }
public double SalesWeek { get; set; }
public double ProfitWeek { get; set; }
public double ProfitPercWeek { get; set; }
public double SalesMonth { get; set; }
public double ProfitMonth { get; set; }
public double ProfitPercMonth { get; set; }
public double TotalProfit { get; set; }
public double TotalSales { get; set; }
public double TotalProfitPerc { get; set; }
public double FundingToday { get; set; }
public double FundingYesterday { get; set; }
public double FundingWeek { get; set; }
public double FundingMonth { get; set; }
public double FundingTotal { get; set; }
} }
public class PTStrategy public class PTStrategy

View File

@ -16,16 +16,22 @@ namespace Core.Main.DataObjects
{ {
private SummaryData _summary = null; private SummaryData _summary = null;
private Properties _properties = null; private Properties _properties = null;
private List<StatsData> _stats = null;
private List<SellLogData> _sellLog = new List<SellLogData>(); private List<SellLogData> _sellLog = new List<SellLogData>();
private List<DCALogData> _dcaLog = new List<DCALogData>(); private List<DCALogData> _dcaLog = new List<DCALogData>();
private List<BuyLogData> _buyLog = new List<BuyLogData>(); private List<BuyLogData> _buyLog = new List<BuyLogData>();
private string _ptmBasePath = ""; private string _ptmBasePath = "";
private PTMagicConfiguration _systemConfiguration = null; private PTMagicConfiguration _systemConfiguration = null;
private TransactionData _transactionData = null; private TransactionData _transactionData = null;
private DateTime _buyLogRefresh = DateTime.UtcNow, _sellLogRefresh = DateTime.UtcNow, _dcaLogRefresh = DateTime.UtcNow, _summaryRefresh = DateTime.UtcNow, _propertiesRefresh = DateTime.UtcNow; private DateTime _statsRefresh = DateTime.UtcNow,_buyLogRefresh = DateTime.UtcNow, _sellLogRefresh = DateTime.UtcNow, _dcaLogRefresh = DateTime.UtcNow, _summaryRefresh = DateTime.UtcNow, _propertiesRefresh = DateTime.UtcNow;
private volatile object _buyLock = new object(), _sellLock = new object(), _dcaLock = new object(), _summaryLock = new object(), _propertiesLock = new object(); private volatile object _statsLock = new object(),_buyLock = new object(), _sellLock = new object(), _dcaLock = new object(), _summaryLock = new object(), _propertiesLock = new object();
private TimeSpan? _offsetTimeSpan = null; private TimeSpan? _offsetTimeSpan = null;
public void DoLog(string message)
{
// Implement your logging logic here
Console.WriteLine(message);
}
// Constructor // Constructor
public ProfitTrailerData(PTMagicConfiguration systemConfiguration) public ProfitTrailerData(PTMagicConfiguration systemConfiguration)
{ {
@ -96,10 +102,35 @@ namespace Core.Main.DataObjects
return _properties; return _properties;
} }
} }
public List<StatsData> Stats
{
get
{
if (_stats == null || DateTime.UtcNow > _statsRefresh)
{
lock (_statsLock)
{
if (_stats == null || DateTime.UtcNow > _statsRefresh)
{
dynamic statsDataJson = GetDataFromProfitTrailer("/api/v2/data/stats");
JObject statsDataJObject = statsDataJson as JObject;
JObject basicSection = (JObject)statsDataJObject["basic"];
_stats = new List<StatsData> { BuildStatsData(basicSection) };
_statsRefresh = DateTime.UtcNow.AddSeconds(_systemConfiguration.GeneralSettings.Monitor.RefreshSeconds - 1);
}
}
}
return _stats;
}
}
public List<SellLogData> SellLog public List<SellLogData> SellLog
{ {
get get
{ {
if (_sellLog == null || (DateTime.UtcNow > _sellLogRefresh)) if (_sellLog == null || (DateTime.UtcNow > _sellLogRefresh))
{ {
lock (_sellLock) lock (_sellLock)
@ -109,10 +140,12 @@ namespace Core.Main.DataObjects
{ {
_sellLog.Clear(); _sellLog.Clear();
// Page through the sales data summarizing it. // Page through the sales data summarizing it.
bool exitLoop = false; bool exitLoop = false;
int pageIndex = 1; int pageIndex = 1;
// 1 record per page to allow user to set max records to retrieve
int maxPages = _systemConfiguration.GeneralSettings.Monitor.MaxSalesRecords; int maxPages = _systemConfiguration.GeneralSettings.Monitor.MaxSalesRecords;
int requestedPages = 0; int requestedPages = 0;
@ -125,6 +158,7 @@ namespace Core.Main.DataObjects
this.BuildSellLogData(sellDataPage); this.BuildSellLogData(sellDataPage);
pageIndex++; pageIndex++;
requestedPages++; requestedPages++;
Console.WriteLine($"Importing sale: {pageIndex}");
} }
else else
@ -139,42 +173,10 @@ namespace Core.Main.DataObjects
} }
} }
} }
return _sellLog; return _sellLog;
} }
} }
public List<SellLogData> SellLogToday
{
get
{
return SellLog.FindAll(sl => sl.SoldDate.Date == LocalizedTime.DateTime.Date);
}
}
public List<SellLogData> SellLogYesterday
{
get
{
return SellLog.FindAll(sl => sl.SoldDate.Date == LocalizedTime.DateTime.AddDays(-1).Date);
}
}
public List<SellLogData> SellLogLast7Days
{
get
{
return SellLog.FindAll(sl => sl.SoldDate.Date >= LocalizedTime.DateTime.AddDays(-7).Date);
}
}
public List<SellLogData> SellLogLast30Days
{
get
{
return SellLog.FindAll(sl => sl.SoldDate.Date >= LocalizedTime.DateTime.AddDays(-30).Date);
}
}
public List<DCALogData> DCALog public List<DCALogData> DCALog
{ {
@ -313,7 +315,7 @@ namespace Core.Main.DataObjects
response.Close(); response.Close();
// Parse the JSON and build the data sets
if (!arrayReturned) if (!arrayReturned)
{ {
return JObject.Parse(rawBody); return JObject.Parse(rawBody);
@ -322,6 +324,9 @@ namespace Core.Main.DataObjects
{ {
return JArray.Parse(rawBody); return JArray.Parse(rawBody);
} }
} }
private SummaryData BuildSummaryData(dynamic PTData) private SummaryData BuildSummaryData(dynamic PTData)
@ -349,6 +354,32 @@ namespace Core.Main.DataObjects
BaseUrl = PTProperties.baseUrl BaseUrl = PTProperties.baseUrl
}; };
} }
private StatsData BuildStatsData(dynamic statsDataJson)
{
return new StatsData()
{
SalesToday = statsDataJson["totalSalesToday"],
ProfitToday = statsDataJson["totalProfitToday"],
ProfitPercToday = statsDataJson["totalProfitPercToday"],
SalesYesterday = statsDataJson["totalSalesYesterday"],
ProfitYesterday = statsDataJson["totalProfitYesterday"],
ProfitPercYesterday = statsDataJson["totalProfitPercYesterday"],
SalesWeek = statsDataJson["totalSalesWeek"],
ProfitWeek = statsDataJson["totalProfitWeek"],
ProfitPercWeek = statsDataJson["totalProfitPercWeek"],
SalesMonth = statsDataJson["totalSalesThisMonth"],
ProfitMonth = statsDataJson["totalProfitThisMonth"],
ProfitPercMonth = statsDataJson["totalProfitPercThisMonth"],
TotalProfit = statsDataJson["totalProfit"],
TotalSales = statsDataJson["totalSales"],
TotalProfitPerc = statsDataJson["totalProfitPerc"],
FundingToday = statsDataJson["totalFundingToday"],
FundingYesterday = statsDataJson["totalFundingYesterday"],
FundingWeek = statsDataJson["totalFundingWeek"],
FundingMonth = statsDataJson["totalFundingThisMonth"],
FundingTotal = statsDataJson["totalFunding"]
};
}
private void BuildSellLogData(dynamic rawSellLogData) private void BuildSellLogData(dynamic rawSellLogData)
{ {
foreach (var rsld in rawSellLogData.data) foreach (var rsld in rawSellLogData.data)

View File

@ -62,7 +62,7 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-6 px-1"> <div class="col-md-5 px-1">
<div class="card-box px-2"> <div class="card-box px-2">
<div class="cdev" data-percent="100" data-duration="@Html.Raw(@Model.PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds * 1000)" data-color="#aaa,#414d59"></div> <div class="cdev" data-percent="100" data-duration="@Html.Raw(@Model.PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds * 1000)" data-color="#aaa,#414d59"></div>
<br> <br>
@ -113,46 +113,56 @@
</div> </div>
</div> </div>
<div class="col-md-6 px-1"> <div class="col-md-7 px-1">
<div class="card-box px-2"> <div class="card-box px-2">
<div class="cdev" data-percent="100" data-duration="@Html.Raw(@Model.PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds * 1000)" data-color="#aaa,#414d59"></div> <div class="cdev" data-percent="100" data-duration="@Html.Raw(@Model.PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds * 1000)" data-color="#aaa,#414d59"></div>
<br> <br>
<h4 class="m-t-0 m-b-20 header-title"><b>Sales Overview</b><small class="pull-right"><a href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)SalesAnalyzer">more</a></small></h4> <h4 class="m-t-0 m-b-20 header-title"><b>Sales Overview</b><small class="pull-right"><a href="@Html.Raw(Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl)SalesAnalyzer">more</a></small></h4>
@{ @{
double totalProfit = 0;
totalProfit = Model.PTData.SellLog.Sum(s => s.Profit);
double totalProfitFiat = Math.Round(totalProfit * Model.Summary.MainMarketPrice, 2);
double percentGain = Math.Round(totalProfit / Model.PTMagicConfiguration.GeneralSettings.Application.StartBalance * 100, 2);
string percentGainText = percentGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%";
if (Model.PTData.TransactionData.Transactions.Count > 0)
{
percentGainText = "<i class=\"fa fa-info-circle text-muted\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"You have added at least one manual transaction, so the total gain percentage cannot be calculated.\"></i>";
}
double todaysProfit = 0; var overviewStats = Model.StatsData.FirstOrDefault(); // todaysStats is a new variable
todaysProfit = Model.PTData.SellLogToday.Sum(s => s.Profit);
double todaysStartBalance = Model.PTData.GetSnapshotBalance(Model.DateTimeNow.DateTime); var todaysSales = overviewStats.SalesToday;
double todaysProfitFiat = Math.Round(todaysProfit * Model.Summary.MainMarketPrice, 2); var todaysProfit = overviewStats.ProfitToday;
double todaysPercentGain = Math.Round(todaysProfit / todaysStartBalance * 100, 2); var todaysFunding = overviewStats.FundingToday;
var todaysPercentGain = overviewStats.ProfitPercToday;
var todaysFundingGain = todaysPercentGain * ((todaysProfit - todaysFunding) / todaysProfit);
var yesterdaysSales = overviewStats.SalesYesterday;
var yesterdaysProfit = overviewStats.ProfitYesterday;
var yesterdaysFunding = overviewStats.FundingYesterday;
var yesterdaysPercentGain = overviewStats.ProfitPercYesterday;
var yesterdaysFundingGain = yesterdaysPercentGain * ((yesterdaysProfit + yesterdaysFunding) / yesterdaysProfit);
var last7DaysSales = overviewStats.SalesWeek;
var last7DaysProfit = overviewStats.ProfitWeek;
var last7DaysFunding = overviewStats.FundingWeek;
var last7DaysPercentGain = overviewStats.ProfitPercWeek;
var last7DaysFundingGain = last7DaysPercentGain * ((last7DaysProfit + last7DaysFunding) / last7DaysProfit);
var last30DaysSales = overviewStats.SalesMonth;
var last30DaysProfit = overviewStats.ProfitMonth;
var last30DaysFunding = overviewStats.FundingMonth;
var last30DaysPercentGain = overviewStats.ProfitPercMonth;
var last30DaysFundingGain = last30DaysPercentGain * ((last30DaysProfit + last30DaysFunding) / last30DaysProfit);
var totalSales = overviewStats.TotalSales;
var totalProfit = overviewStats.TotalProfit;
var totalFunding = overviewStats.FundingTotal;
var totalProfitPercent = overviewStats.TotalProfitPerc;
var totalFundingGain = totalProfitPercent * ((totalProfit + totalFunding) / totalProfit);
double todaysProfitFiat = Math.Round((todaysProfit + todaysFunding) * Model.Summary.MainMarketPrice, 2);
double yesterdaysProfitFiat = Math.Round((yesterdaysProfit + yesterdaysFunding) * Model.Summary.MainMarketPrice, 2);
double last7DaysProfitFiat = Math.Round((last7DaysProfit + last7DaysFunding) * Model.Summary.MainMarketPrice, 2);
double last30DaysProfitFiat = Math.Round((last30DaysProfit + last30DaysFunding) * Model.Summary.MainMarketPrice, 2);
double totalProfitFiat = Math.Round((totalProfit + totalFunding) * Model.Summary.MainMarketPrice, 2);
double yesterdaysProfit = 0;
yesterdaysProfit = Model.PTData.SellLogYesterday.Sum(s => s.Profit);
double yesterdaysStartBalance = Model.PTData.GetSnapshotBalance(Model.DateTimeNow.DateTime.AddDays(-1));
double yesterdaysProfitFiat = Math.Round(yesterdaysProfit * Model.Summary.MainMarketPrice, 2);
double yesterdaysPercentGain = Math.Round(yesterdaysProfit / yesterdaysStartBalance * 100, 2);
double last7DaysProfit = 0;
last7DaysProfit = Model.PTData.SellLogLast7Days.Sum(s => s.Profit);
double last7DaysStartBalance = Model.PTData.GetSnapshotBalance(Model.DateTimeNow.DateTime.AddDays(-7));
double last7DaysProfitFiat = Math.Round(last7DaysProfit * Model.Summary.MainMarketPrice, 2);
double last7DaysPercentGain = Math.Round(last7DaysProfit / last7DaysStartBalance * 100, 2);
double last30DaysProfit = 0;
last30DaysProfit = Model.PTData.SellLogLast30Days.Sum(s => s.Profit);
double last30DaysStartBalance = Model.PTData.GetSnapshotBalance(Model.DateTimeNow.DateTime.AddDays(-30));
double last30DaysProfitFiat = Math.Round(last30DaysProfit * Model.Summary.MainMarketPrice, 2);
double last30DaysPercentGain = Math.Round(last30DaysProfit / last30DaysStartBalance * 100, 2);
} }
<table class="table table-sm"> <table class="table table-sm">
<thead> <thead>
@ -160,45 +170,51 @@
<th></th> <th></th>
<th class="text-right">Sales</th> <th class="text-right">Sales</th>
<th class="text-right">Profit @Model.Summary.MainMarket</th> <th class="text-right">Profit @Model.Summary.MainMarket</th>
<th class="text-right">Profit @Model.Summary.MainFiatCurrency</th> <th class="text-right">Funding</th>
<th class="text-right">@Model.Summary.MainFiatCurrency</th>
<th class="text-right">Gain</th> <th class="text-right">Gain</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<th>Today</th> <th>Today</th>
<td class="text-right">@Model.PTData.SellLogToday.Count</td> <td class="text-right">@overviewStats.SalesToday</td>
<td class="text-right text-autocolor">@todaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td> <td class="text-right text-autocolor">@todaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
<td class="text-right text-autocolor">@Html.Raw(Model.MainFiatCurrencySymbol + todaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td> <td class="text-right text-autocolor">@todaysFunding.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
<td class="text-right text-autocolor">@todaysPercentGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td> <td class="text-right text-autocolor">@Html.Raw(todaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td>
<td class="text-right text-autocolor">@todaysFundingGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td>
</tr> </tr>
<tr> <tr>
<th>Yesterday</th> <th>Yesterday</th>
<td class="text-right">@Model.PTData.SellLogYesterday.Count</td> <td class="text-right">@yesterdaysSales</td>
<td class="text-right text-autocolor">@yesterdaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td> <td class="text-right text-autocolor">@yesterdaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
<td class="text-right text-autocolor">@Html.Raw(Model.MainFiatCurrencySymbol + yesterdaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td> <td class="text-right text-autocolor">@yesterdaysFunding.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
<td class="text-right text-autocolor">@yesterdaysPercentGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td> <td class="text-right text-autocolor">@Html.Raw(yesterdaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td>
<td class="text-right text-autocolor">@yesterdaysFundingGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td>
</tr> </tr>
<tr> <tr>
<th>Last 7 Days</th> <th>Last 7 Days</th>
<td class="text-right">@Model.PTData.SellLogLast7Days.Count</td> <td class="text-right">@last7DaysSales</td>
<td class="text-right text-autocolor">@last7DaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td> <td class="text-right text-autocolor">@last7DaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
<td class="text-right text-autocolor">@Html.Raw(Model.MainFiatCurrencySymbol + last7DaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td> <td class="text-right text-autocolor">@last7DaysFunding.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
<td class="text-right text-autocolor">@last7DaysPercentGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td> <td class="text-right text-autocolor">@Html.Raw(last7DaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td>
<td class="text-right text-autocolor">@last7DaysFundingGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td>
</tr> </tr>
<tr> <tr>
<th>Last 30 Days</th> <th>Last 30 Days</th>
<td class="text-right">@Model.PTData.SellLogLast30Days.Count</td> <td class="text-right">@last30DaysSales</td>
<td class="text-right text-autocolor">@last30DaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td> <td class="text-right text-autocolor">@last30DaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
<td class="text-right text-autocolor">@Html.Raw(Model.MainFiatCurrencySymbol + last30DaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td> <td class="text-right text-autocolor">@last30DaysFunding.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
<td class="text-right text-autocolor">@last30DaysPercentGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td> <td class="text-right text-autocolor">@Html.Raw(last30DaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td>
<td class="text-right text-autocolor">@last30DaysFundingGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td>
</tr> </tr>
<tr> <tr>
<th>Total</th> <th>Total</th>
<td class="text-right">@Model.PTData.SellLog.Count</td> <td class="text-right">@totalSales</td>
<td class="text-right text-autocolor">@totalProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td> <td class="text-right text-autocolor">@totalProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
<td class="text-right text-autocolor">@Html.Raw(Model.MainFiatCurrencySymbol + totalProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td> <td class="text-right text-autocolor">@totalFunding.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))</td>
<td class="text-right text-autocolor">@Html.Raw(percentGainText)</td> <td class="text-right text-autocolor">@Html.Raw(totalProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))</td>
<td class="text-right text-autocolor">@totalFundingGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -13,6 +13,7 @@ namespace Monitor.Pages
public class DashboardBottomModel : _Internal.BasePageModelSecureAJAX public class DashboardBottomModel : _Internal.BasePageModelSecureAJAX
{ {
public ProfitTrailerData PTData = null; public ProfitTrailerData PTData = null;
public List<StatsData> StatsData { get; set; }
public List<MarketTrend> MarketTrends { get; set; } = new List<MarketTrend>(); public List<MarketTrend> MarketTrends { get; set; } = new List<MarketTrend>();
public string TrendChartDataJSON = ""; public string TrendChartDataJSON = "";
public string ProfitChartDataJSON = ""; public string ProfitChartDataJSON = "";
@ -26,12 +27,14 @@ namespace Monitor.Pages
base.Init(); base.Init();
BindData(); BindData();
BuildAssetDistributionData(); BuildAssetDistributionData();
} }
private void BindData() private void BindData()
{ {
PTData = this.PtDataObject; PTData = this.PtDataObject;
StatsData = this.PTData.Stats;
// Cleanup temp files // Cleanup temp files
FileHelper.CleanupFilesMinutes(PTMagicMonitorBasePath + "wwwroot" + System.IO.Path.DirectorySeparatorChar + "assets" + System.IO.Path.DirectorySeparatorChar + "tmp" + System.IO.Path.DirectorySeparatorChar, 5); FileHelper.CleanupFilesMinutes(PTMagicMonitorBasePath + "wwwroot" + System.IO.Path.DirectorySeparatorChar + "assets" + System.IO.Path.DirectorySeparatorChar + "tmp" + System.IO.Path.DirectorySeparatorChar, 5);