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); }
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); } }