Пример #1
0
 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());
 }
Пример #2
0
        //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);
        }
Пример #3
0
        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");
        }