public Task Update(ApiKey key, ICollection <ApiKeyEntity> entities) { foreach (var entity in entities) { var existing = key.ApiKeyEntities.SingleOrDefault(e => e.EntityId == entity.EntityId); if (existing != null) { entity.Id = existing.Id; key.ApiKeyEntities.Remove(existing); } key.ApiKeyEntities.Add(entity); } foreach (var entity in key.ApiKeyEntities.Where(entity => entities.All(e => e.EntityId != entity.EntityId))) { key.ApiKeyEntities.Remove(entity); } return(repository.SaveChangesAsync()); }
//private static void processAssetQuantity(Asset asset) { // var totalQuantity = asset.ActualQuantity + asset.MarketQuantity; // var diff = totalQuantity - asset.Quantity; // if (totalQuantity == 0) { // asset.MaterialCost = 0; // asset.BrokerFees = 0; // } else if (diff != 0) { // var total = diff * asset.LatestAverageCost; // asset.MaterialCost += total; // asset.BrokerFees += total * (decimal)ApplicationHelper.BrokerFeeRate; // asset.UnaccountedQuantity += diff; // } // asset.Quantity = totalQuantity; //} public async Task <int> UpdateTransactionsAsync() { _trace.TraceEvent(TraceEventType.Start, 0, "StartUpdateTransactions"); long latest = await getLatestTransactionId().ConfigureAwait(false); _trace.TraceEvent(TraceEventType.Verbose, 0, "Latest transaction ID: " + latest); List <Transaction> transactions = (await _eveApiService.GetNewTransactionsAsync(ApplicationHelper.ActiveEntity.ApiKeys.First(), ApplicationHelper.ActiveEntity, latest).ConfigureAwait(false)).ToList(); _trace.TraceEvent(TraceEventType.Verbose, 0, "Fetched transactions: " + transactions.Count); using (EveProfiteerRepository db = CreateDb()) { List <Asset> assets = await db.Context.Assets.Where(asset => asset.ApiKeyEntity_Id == ApplicationHelper.ActiveEntity.Id) .ToListAsync() .ConfigureAwait(false); var changedAssets = processTransactionsAsync(transactions, assets); foreach (Asset asset in changedAssets) { //transactions.Remove(asset.LastBuyTransaction); //transactions.Remove(asset.LastSellTransaction); if (db.Context.Entry(asset).State == EntityState.Detached) { db.Context.Assets.Add(asset); } else { db.Context.Entry(asset).State = EntityState.Modified; } } transactions = db.Context.Transactions.AddRange(transactions).ToList(); await db.SaveChangesAsync(); } _trace.TraceEvent(TraceEventType.Stop, 0, "CompleteUpdateTransactions"); return(transactions.Count); }
public async Task ProcessAllTransactionsAsync() { // delete current assets _trace.TraceEvent(TraceEventType.Start, 0, "StartProcessAllTransactions"); using (EveProfiteerRepository db = CreateDb()) { db.Context.Configuration.AutoDetectChangesEnabled = false; db.Context.Configuration.ValidateOnSaveEnabled = false; List <Asset> oldAssets = await db.Context.Assets.Where(asset => asset.ApiKeyEntity_Id == ApplicationHelper.ActiveEntity.Id) .ToListAsync() .ConfigureAwait(false); db.Context.Assets.RemoveRange(oldAssets); oldAssets.ForEach(e => db.Context.Entry(e).State = EntityState.Deleted); _trace.TraceEvent(TraceEventType.Verbose, 0, "Deleting Assets: " + oldAssets.Count); await db.Context.SaveChangesAsync().ConfigureAwait(false); } // reset and reprocess transactions in batches int batch = 0; var assets = new List <Asset>(); while (true) { using (EveProfiteerRepository db = CreateDb()) { db.Context.Configuration.AutoDetectChangesEnabled = false; db.Context.Configuration.ValidateOnSaveEnabled = false; IOrderedQueryable <Transaction> query = db.Context.Transactions.AsNoTracking() .Where(t => t.ApiKeyEntity_Id == ApplicationHelper.ActiveEntity.Id) .OrderBy(e => e.TransactionDate); List <Transaction> transactions = await query.Skip(batch * 5000).Take(5000).ToListAsync().ConfigureAwait(false); if (!transactions.Any()) { break; } foreach (Transaction transaction in transactions) { transaction.PerpetualAverageCost = 0; transaction.UnaccountedQuantity = 0; transaction.TaxLiability = 0; transaction.CogsBrokerFees = 0; transaction.CogsMaterialCost = 0; transaction.PostTransactionStock = 0; db.Context.Entry(transaction).State = EntityState.Modified; } _trace.TraceEvent(TraceEventType.Verbose, 0, "Processing batch: {0}", batch); //transactions.ForEach(e => db.Context.Entry(e).State = EntityState.Modified); processTransactionsAsync(transactions, assets); _trace.TraceEvent(TraceEventType.Verbose, 0, "Saving: {0}", transactions.Count()); await db.Context.SaveChangesAsync().ConfigureAwait(false); ++batch; } } // save assets using (EveProfiteerRepository db = CreateDb()) { foreach (Asset asset in assets) { if (asset.LastBuyTransaction != null) { asset.LastBuyTransactionId = asset.LastBuyTransaction.Id; asset.LastBuyTransaction = null; } if (asset.LastSellTransaction != null) { asset.LastSellTransactionId = asset.LastSellTransaction.Id; asset.LastSellTransaction = null; } db.Context.Assets.Add(asset); } _trace.TraceEvent(TraceEventType.Verbose, 0, "Saving Assets: {0}", assets.Count()); await db.SaveChangesAsync().ConfigureAwait(false); } _trace.TraceEvent(TraceEventType.Stop, 0, "CompleteProcessAllTransactions"); }