コード例 #1
0
 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)})"
 };
コード例 #2
0
 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)
 };
コード例 #3
0
        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);
                    });
                }
            }
        }