예제 #1
0
        public async Task <IWrappedResponse> Search(BalancesSearchRequest request)
        {
            var postingAccount = await _olmaPostingAccountRepo.FindAll()
                                 .Where(p => p.Id == request.PostingAccountId)
                                 .AsNoTracking().SingleOrDefaultAsync();

            if (postingAccount == null)
            {
                return(BadRequest <BalancesSummary>(
                           ErrorHandler.Create()
                           .AddMessage(new PostingAccountNotFound())
                           .GetServiceState()));
            }

            var queryCacheTag = $"{request}{request.PostingAccountId}-{request.RefLtmsArticleId}";

            if (request.ForceBalanceCalculation)
            {
                QueryCacheManager.ExpireTag(queryCacheTag);
            }

            var queryCacheOptions = _cacheOptions.Value.QueryCache;

            var query = _ltmsBookingsRepo.FindAll()
                        .Where(b => b.AccountId == postingAccount.RefLtmsAccountId &&
                               b.ArticleId == request.RefLtmsArticleId)
                        .AsNoTracking();

            var qualityBalancesRequired = false;

            var ltmsAccount = await _ltmsAccountsRepo.FindByCondition(a => a.Id == postingAccount.RefLtmsAccountId)
                              .AsNoTracking()
                              .SingleOrDefaultAsync();

            if (ltmsAccount.AccountTypeId == "DEP" ||
                ltmsAccount.AccountTypeId == "LAG" ||
                ltmsAccount.AccountTypeId == "LDL")
            {
                qualityBalancesRequired = true;
            }

            var balancesResult = await query.GroupBy(b => b.Quality.Name)
                                 .Select(g => new {
                g.Key,
                Balances = new
                {
                    CoordinatedBalance = g.Sum(b => b.Matched ? b.Quantity : 0),
                    ProvisionalCharge  = qualityBalancesRequired ?
                                         g.Sum(b => !b.Matched && !b.IncludeInBalance && b.Quantity > 0 ? b.Quantity : 0) : 0,
                    ProvisionalCredit = qualityBalancesRequired ?
                                        g.Sum(b => !b.Matched && !b.IncludeInBalance && b.Quantity < 0 ? b.Quantity : 0) : 0,
                    UncoordinatedCharge = qualityBalancesRequired ?
                                          g.Sum(b => !b.Matched && b.IncludeInBalance && b.Quantity > 0 ? b.Quantity : 0) : 0,
                    UncoordinatedCredit = qualityBalancesRequired ?
                                          g.Sum(b => !b.Matched && b.IncludeInBalance && b.Quantity < 0 ? b.Quantity : 0) : 0,
                    ProvisionalChargeFilterd =
                        g.Sum(b => b.BookingTypeId != "POOL" && !b.Matched && !b.IncludeInBalance && b.Quantity > 0 ? b.Quantity : 0),
                    ProvisionalCreditFilterd =
                        g.Sum(b => b.BookingTypeId != "POOL" && !b.Matched && !b.IncludeInBalance && b.Quantity < 0 ? b.Quantity : 0),
                    UncoordinatedChargeFilterd =
                        g.Sum(b => b.BookingTypeId != "POOL" && !b.Matched && b.IncludeInBalance && b.Quantity > 0 ? b.Quantity : 0),
                    UncoordinatedCreditFilterd =
                        g.Sum(b => b.BookingTypeId != "POOL" && !b.Matched && b.IncludeInBalance && b.Quantity < 0 ? b.Quantity : 0)
                }
            }).FromCacheAsync(new MemoryCacheEntryOptions
            {
                AbsoluteExpiration =
                    DateTimeOffset.UtcNow.AddMinutes(queryCacheOptions.AbsoluteExpirationInMinutes),
                SlidingExpiration = TimeSpan.FromMinutes(queryCacheOptions.SlidingExpirationInMinutes)
            }, queryCacheTag);

            var balanceSummary = new BalancesSummary
            {
                IntactBalance = new BalanceOverview(),
                DefectBalance = new BalanceOverview()
            };

            if (qualityBalancesRequired)
            {
                balanceSummary.Balances = balancesResult.Where(br => br.Key != "D" && br.Key != "Schr").Select(br =>
                                                                                                               new BalanceOverview
                {
                    Name = br.Key,
                    CoordinatedBalance  = br.Balances.CoordinatedBalance.Value,
                    ProvisionalCharge   = br.Balances.ProvisionalCharge.Value,
                    ProvisionalCredit   = br.Balances.ProvisionalCredit.Value,
                    UncoordinatedCharge = br.Balances.UncoordinatedCharge.Value,
                    UncoordinatedCredit = br.Balances.UncoordinatedCredit.Value
                });
            }

            foreach (var balance in balancesResult)
            {
                if (balance.Key != "D" && balance.Key != "Schr")
                {
                    balanceSummary.IntactBalance.CoordinatedBalance  += balance.Balances.CoordinatedBalance.Value;
                    balanceSummary.IntactBalance.ProvisionalCharge   += balance.Balances.ProvisionalChargeFilterd.Value;
                    balanceSummary.IntactBalance.ProvisionalCredit   += balance.Balances.ProvisionalCreditFilterd.Value;
                    balanceSummary.IntactBalance.UncoordinatedCharge += balance.Balances.UncoordinatedChargeFilterd.Value;
                    balanceSummary.IntactBalance.UncoordinatedCredit += balance.Balances.UncoordinatedCreditFilterd.Value;
                }
                else
                {
                    balanceSummary.DefectBalance.CoordinatedBalance  += balance.Balances.CoordinatedBalance.Value;
                    balanceSummary.DefectBalance.ProvisionalCharge   += balance.Balances.ProvisionalChargeFilterd.Value;
                    balanceSummary.DefectBalance.ProvisionalCredit   += balance.Balances.ProvisionalCreditFilterd.Value;
                    balanceSummary.DefectBalance.UncoordinatedCharge += balance.Balances.UncoordinatedChargeFilterd.Value;
                    balanceSummary.DefectBalance.UncoordinatedCredit += balance.Balances.UncoordinatedCreditFilterd.Value;
                }
            }

            var postingRequestsQuery = _olmaPostingRequestRepo.FindAll()
                                       .Where(pr => pr.PostingAccountId == postingAccount.Id &&
                                              pr.Status == PostingRequestStatus.Pending &&
                                              pr.LoadCarrier.TypeId == request.LoadCarrierTypeId).AsNoTracking();

            var postingRequestBalanceCredit = postingRequestsQuery.DeferredSum(i =>
                                                                               i.Type == PostingRequestType.Credit ? i.LoadCarrierQuantity : 0).FutureValue();
            var postingRequestBalanceCharge = postingRequestsQuery.DeferredSum(i =>
                                                                               i.Type == PostingRequestType.Charge ? i.LoadCarrierQuantity : 0).FutureValue();

            balanceSummary.PostingRequestBalance = new BalanceOverview
            {
                ProvisionalCredit = postingRequestBalanceCredit.Value,
                ProvisionalCharge = postingRequestBalanceCharge.Value
            };

            return(Ok(balanceSummary));
        }
 public async Task <ActionResult <BalancesSummary> > Get([FromQuery] BalancesSearchRequest request)
 {
     return(await this._postingAccountBalancesService.Search(request).Convert <BalancesSummary>(this));
 }