public static CalculatedResult FromMoney(MoneyColumnMetadataJsModel h, MoneyStateModel money, double adjustment) => new CalculatedResult(h) { Money = money, _ccy = money.Ccy, _adjustment = adjustment, _value = money.Amount, _tooltip = money.Description != null ? $"{money.Description} + {adjustment.ToString(CultureInfo.CurrentCulture)}" : $"{(money.Amount).ToString(CultureInfo.CurrentCulture)}({money.Amount.ToString(CultureInfo.CurrentCulture)} + {adjustment.ToString(CultureInfo.CurrentCulture)})" };
public static CalculatedResult FromMoney(MoneyColumnMetadataModel h, MoneyStateModel money) => new CalculatedResult { Ccy = money.Ccy, Column = h, Money = money, Value = money.Amount, Tooltip = money.Amount.ToString(CultureInfo.CurrentCulture) };
public void ScrapeImpl(String name, Action <GenericScraper, ScraperConfigurationModel> action, [CallerMemberName] string caller = null) { if (!Startup.IsProduction) { return; } var scrapeConfig = _objectRepository.Set <ScraperConfigurationModel>().FirstOrDefault(v => v.ScraperName == name); var scraper = _scrapers.FirstOrDefault(v => v.ProviderName == name); if (scrapeConfig == null || scraper == null) { _logger.LogInformation($"Not enabled scraper {name}"); return; } lock (_chrome) { _chrome.Reset(); try { _logger.LogInformation($"Scraping {name} {caller}"); action(scraper, scrapeConfig); } catch (Exception ex) { _logger.LogError(ex, $"Failed to get state for {scraper.ProviderName}..."); throw; } finally { _chrome.Reset(); } } // default strategy - generated money statements from diff between states. foreach (var column in _objectRepository.Set <MoneyColumnMetadataModel>().Where(v => v.AutogenerateStatements)) { var payments = _objectRepository.Set <PaymentModel>() .Where(v => v.Column == column) .ToList(); var models = _objectRepository.Set <MoneyStateModel>() .Where(v => v.Column == column) .OrderBy(v => v.When) .ToList(); if (models.Any()) { var emptyModel = new MoneyStateModel { Amount = 0, Ccy = models.First().Ccy, Column = models.First().Column, When = models.First().When.AddDays(-1) }; models.Insert(0, emptyModel); models.Aggregate((a, b) => { var delta = b.Amount - a.Amount; var matchingPayments = payments .Where(v => v.Column == column && v.When >= a.When && v.When <= b.When).ToList(); delta -= matchingPayments.Sum(v => v.Amount); delta = Math.Round(delta * 100, MidpointRounding.AwayFromZero) / 100; if (Math.Abs(delta) >= 0.01) { var when = a.When + (b.When - a.When) / 2; var kind = delta > 0 ? PaymentKind.Income : PaymentKind.Expense; var paymentModel = payments.FirstOrDefault(v => v.Column == column && v.When >= a.When && v.When <= b.When && v.Autogenerated); if (paymentModel == null) { paymentModel = new PaymentModel(when, "Коррекция баланса " + column.Provider + " " + column.AccountName, delta, kind, a.Ccy, "N/A-" + DateTime.Now.Ticks, column); _objectRepository.Add(paymentModel); } else { paymentModel.Amount += delta; } paymentModel.Autogenerated = true; } return(b); }); } } }