Files
myoffice/MyOffice.Services/Dashboard/DashboardService.cs
T
2023-08-04 20:10:57 +03:00

164 lines
4.5 KiB
C#

namespace MyOffice.Services.Dashboard;
using MyOffice.Services.Dashboard.Domain;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Core.Extensions;
using Data.Repositories.Account;
using Data.Repositories.Currency;
using MyOffice.Data.Models.Accounts;
using System.Xml.Linq;
public class DashboardService
{
private readonly IAccountRepository _accountRepository;
private readonly ICurrencyRateRepository _currencyRateRepository;
public DashboardService(
IAccountRepository accountRepository,
ICurrencyRateRepository currencyRateRepository
)
{
_accountRepository = accountRepository;
_currencyRateRepository = currencyRateRepository;
}
public DashboardData GetDashboardRestData(Guid userId)
{
var rests = _accountRepository.GetRestAtDate(userId, DateTime.UtcNow);
var result = new DashboardData
{
Balance = rests
.Where(x => (x.Type == AccountAccessTypeEnum.balance || x.Type == AccountAccessTypeEnum.credit) && x.CurrencyRate.HasValue)
.Sum(x => x.Balance * (x.CurrencyRate * x.CurrencyQuantity)),
BalanceDebit = rests
.Where(x => x.Type == AccountAccessTypeEnum.balance && x.CurrencyRate.HasValue)
.Sum(x => x.Balance * (x.CurrencyRate * x.CurrencyQuantity)),
BalanceCredit = rests
.Where(x => x.Type == AccountAccessTypeEnum.credit && x.CurrencyRate.HasValue)
.Sum(x => x.Balance * (x.CurrencyRate * x.CurrencyQuantity)),
BalanceRests = rests
.Where(x => x.Type == AccountAccessTypeEnum.balance)
.Where(x => x.CurrencyRate.HasValue && x.Balance.HasValue && x.Balance != 0)
.Select(x => new DashboardRestData
{
Id = x.Id,
Name = x.Name,
Balance = x.Balance,
CurrencyName = x.CurrencyName,
CurrencyShortName = x.CurrencyShortName,
CurrencyRate = x.CurrencyRate,
CurrencyQuantity = x.CurrencyQuantity,
})
.OrderByDescending(x => x.BalanceAtRate)
.ToList(),
};
return result;
}
public DashboardIncomeData GetDashboardIncomeData(Guid userId, DateTime from, DateTime to, Guid? category)
{
var data = category.HasValue
? _accountRepository.GetIncomeByCategory(userId, category.Value, from.ToUtc(), to.ToUtc())
: _accountRepository.GetIncomeByCategories(userId, from.ToUtc(), to.ToUtc());
data = data
.Where(x => x.Amount != 0)
.ToList();
var currencies = data
.Where(x => x.Amount != 0)
.Select(x => x.CurrencyId)
.Distinct()
.ToList();
var rates = _currencyRateRepository
.GetLastRates(userId, currencies, to.ToUtc())
.ToDictionary(x => x.Key, x => x.Value.Rate * x.Value.Quantity);
return new DashboardIncomeData
{
Data = data.Select(x => new
{
Id = x.Id.ToShort(),
Name = x.Name,
Value = (x.Amount * rates.FirstOrDefault(r => r.Key == x.CurrencyId).Value),
})
.GroupBy(x => new { x.Id, x.Name })
.Select( x => new DashboardIncomeDataItem
{
Id = x.Key.Id,
Name = x.Key.Name,
Value = x.Sum(s => s.Value),
})
.ToList(),
Details = data.Select(x => new DashboardIncomeDataItem
{
Id = x.Id.ToShort(),
Currency = x.CurrencyId,
Name = x.Name,
ValueRaw = x.Amount,
Value = (x.Amount * rates.FirstOrDefault(r => r.Key == x.CurrencyId).Value),
}).ToList()
};
}
public DashboardIncomeData GetDashboardOutcomeData(Guid userId, DateTime from, DateTime to, Guid? category)
{
var data = category.HasValue
? _accountRepository.GetOutcomeByCategory(userId, category.Value, from.ToUtc(), to.ToUtc())
: _accountRepository.GetOutcomeByCategories(userId, from.ToUtc(), to.ToUtc());
data = data
.Where(x => x.Amount != 0)
.ToList();
var currencies = data
.Where(x => x.Amount != 0)
.Select(x => x.CurrencyId)
.Distinct()
.ToList();
var rates = _currencyRateRepository
.GetLastRates(userId, currencies, to.ToUtc())
.ToDictionary(x => x.Key, x => x.Value.Rate * x.Value.Quantity);
return new DashboardIncomeData
{
Data = data.Select(x => new
{
Id = x.Id.ToShort(),
Name = x.Name,
Value = (x.Amount * rates.FirstOrDefault(r => r.Key == x.CurrencyId).Value),
})
.GroupBy(x => new { x.Id, x.Name })
.Select(x => new DashboardIncomeDataItem
{
Id = x.Key.Id,
Name = x.Key.Name,
Value = x.Sum(s => s.Value),
})
.ToList(),
Details = data.Select(x => new DashboardIncomeDataItem
{
Id = x.Id.ToShort(),
Currency = x.CurrencyId,
Name = x.Name,
ValueRaw = x.Amount,
Value = (x.Amount * rates.FirstOrDefault(r => r.Key == x.CurrencyId).Value),
}).ToList()
};
}
}