Ejemplo n.º 1
0
        public async Task <List <TransactionImportFileRow> > GenerateImportFileData(IList <Operation> operations, IList <OperationPair> operationPairs)
        {
            foreach (var pair in operationPairs)
            {
                operations.Remove(pair.Operation1);
                operations.Remove(pair.Operation2);
            }

            var predictionModelData = await _transferAccountPredictor.CreatePredictionModel();

            var fileRows         = new List <TransactionImportFileRow>();
            var accountFullNames = await _context.Set <Account>().GetAccountFullNamesAsync();

            foreach (var pair in operationPairs)
            {
                string account1Name = accountFullNames.Where(q => q.Code == pair.AccountCode1).SingleOrDefault()?.FullName
                                      ?? throw new KeyNotFoundException($"Brak konta o kodzie: {pair.AccountCode1}");
                string account2Name = accountFullNames.Where(q => q.Code == pair.AccountCode2).SingleOrDefault()?.FullName
                                      ?? throw new KeyNotFoundException($"Brak konta o kodzie: {pair.AccountCode2}");

                var row = new TransactionImportFileRow()
                {
                    Account = account1Name,
                    Date    = new DateTime[] { pair.Date1, pair.Date2 }.Min(),
                    Deposit         = pair.Amount1,
                    Description     = pair.Description1,
                    Memo            = pair.Description1,
                    TransferAccount = account2Name,
                    TransferMemo    = pair.Description2
                };
                fileRows.Add(row);
            }

            string defaultTransferAccountGuid = accountFullNames.Where(q => q.Code == "DEFAULT TRANSFER ACCOUNT").SingleOrDefault()?.Guid
                                                ?? throw new KeyNotFoundException($"Brak konta o kodzie: DEFAULT TRANSFER ACCOUNT");

            foreach (var operation in operations)
            {
                var guid = predictionModelData.PredictTransferAccount(operation, defaultTransferAccountGuid);

                string account1Name = accountFullNames.Where(q => q.Code == operation.AccountCode).SingleOrDefault()?.FullName
                                      ?? throw new KeyNotFoundException($"Brak konta o kodzie: {operation.AccountCode}");
                string account2Name = accountFullNames.Where(q => q.Guid == guid).SingleOrDefault()?.FullName
                                      ?? throw new KeyNotFoundException($"Brak konta o GUID: {guid}");

                var row = new TransactionImportFileRow()
                {
                    Account         = account1Name,
                    Date            = operation.Date,
                    Deposit         = operation.Amount,
                    Description     = operation.Description,
                    TransferAccount = account2Name
                };
                fileRows.Add(row);
            }

            return(fileRows);
        }
Ejemplo n.º 2
0
        public async Task GenerateImport()
        {
            var importRows = new List <CommodityPriceImportFileRow>();

            var lastPriceDatesByNamespace = (await _context.Set <Price>().GetLastCommodityPricesDatesAsync())
                                            .GroupBy(q => q.Namespace).ToDictionary(q => q.Key, r => r.ToList());

            foreach (var lastPriceDatesInNamespace in lastPriceDatesByNamespace)
            {
                var    namespaceBinding   = _settings.Bindings.SingleOrDefault(q => q.Namespace == lastPriceDatesInNamespace.Key);
                string dataSourceTypeName = namespaceBinding?.DataSourceTypeName;

                if (dataSourceTypeName == null)
                {
                    continue;
                }

                var dataSourceType = Type.GetType(dataSourceTypeName);

                if (dataSourceType == null)
                {
                    continue;
                }

                var instantiatedObject = _serviceProvider.GetService(dataSourceType) as IPriceDataSourceForCommodityNamespace;

                var priceDataForNamespace = await instantiatedObject.GetPricesData(lastPriceDatesInNamespace.Value, _settings.BaseCurrency);

                foreach (var lastPriceDate in lastPriceDatesInNamespace.Value)
                {
                    string currencyOverride = namespaceBinding.CurrencyOverrides.FirstOrDefault(q => q.Mnemonic == lastPriceDate.Mnemonic)?.Currency;

                    importRows.AddRange(priceDataForNamespace[lastPriceDate.Mnemonic]
                                        .Where(q => q.Date > lastPriceDate.Date)
                                        .Select(r => new CommodityPriceImportFileRow()
                    {
                        Date         = r.Date,
                        Mnemonic     = r.Mnemonic,
                        Namespace    = lastPriceDatesInNamespace.Key,
                        Price        = r.Price,
                        BaseCurrency = currencyOverride ?? _settings.BaseCurrency
                    }));
                }
            }

            using (var writer = new StreamWriter(_settings.GeneratedFilename))
                using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
                {
                    await csv.WriteRecordsAsync(importRows);
                }
        }