public async Task <IActionResult> PullPayments(
            string storeId,
            PullPaymentState pullPaymentState,
            int skip         = 0,
            int count        = 50,
            string sortOrder = "desc"
            )
        {
            await using var ctx = _dbContextFactory.CreateContext();
            var now      = DateTimeOffset.UtcNow;
            var ppsQuery = ctx.PullPayments
                           .Include(data => data.Payouts)
                           .Where(p => p.StoreId == storeId);

            if (sortOrder != null)
            {
                switch (sortOrder)
                {
                case "desc":
                    ViewData["NextStartSortOrder"] = "asc";
                    ppsQuery = ppsQuery.OrderByDescending(p => p.StartDate);
                    break;

                case "asc":
                    ppsQuery = ppsQuery.OrderBy(p => p.StartDate);
                    ViewData["NextStartSortOrder"] = "desc";
                    break;
                }
            }

            var paymentMethods = await _payoutHandlers.GetSupportedPaymentMethods(HttpContext.GetStoreData());

            if (!paymentMethods.Any())
            {
                TempData.SetStatusMessageModel(new StatusMessageModel
                {
                    Message  = "You must enable at least one payment method before creating a pull payment.",
                    Severity = StatusMessageModel.StatusSeverity.Error
                });
                return(RedirectToAction(nameof(UIStoresController.GeneralSettings), "UIStores", new { storeId }));
            }

            var vm = this.ParseListQuery(new PullPaymentsModel
            {
                Skip        = skip,
                Count       = count,
                Total       = await ppsQuery.CountAsync(),
                ActiveState = pullPaymentState
            });

            switch (pullPaymentState)
            {
            case PullPaymentState.Active:
                ppsQuery = ppsQuery
                           .Where(
                    p => !p.Archived &&
                    (p.EndDate != null ? p.EndDate > DateTimeOffset.UtcNow : true) &&
                    p.StartDate <= DateTimeOffset.UtcNow
                    );
                break;

            case PullPaymentState.Archived:
                ppsQuery = ppsQuery.Where(p => p.Archived);
                break;

            case PullPaymentState.Expired:
                ppsQuery = ppsQuery.Where(p => DateTimeOffset.UtcNow > p.EndDate);
                break;

            case PullPaymentState.Future:
                ppsQuery = ppsQuery.Where(p => p.StartDate > DateTimeOffset.UtcNow);
                break;
            }

            var pps = (await ppsQuery
                       .Skip(vm.Skip)
                       .Take(vm.Count)
                       .ToListAsync()
                       );

            foreach (var pp in pps)
            {
                var totalCompleted = pp.Payouts.Where(p => (p.State == PayoutState.Completed ||
                                                            p.State == PayoutState.InProgress) && p.IsInPeriod(pp, now))
                                     .Select(o => o.GetBlob(_jsonSerializerSettings).Amount).Sum();
                var totalAwaiting = pp.Payouts.Where(p => (p.State == PayoutState.AwaitingPayment ||
                                                           p.State == PayoutState.AwaitingApproval) &&
                                                     p.IsInPeriod(pp, now)).Select(o => o.GetBlob(_jsonSerializerSettings).Amount).Sum();
                ;
                var ppBlob = pp.GetBlob();
                var ni     = _currencyNameTable.GetCurrencyData(ppBlob.Currency, true);
                var nfi    = _currencyNameTable.GetNumberFormatInfo(ppBlob.Currency, true);
                var period = pp.GetPeriod(now);
                vm.PullPayments.Add(new PullPaymentsModel.PullPaymentModel()
                {
                    StartDate = pp.StartDate,
                    EndDate   = pp.EndDate,
                    Id        = pp.Id,
                    Name      = ppBlob.Name,
                    Progress  = new PullPaymentsModel.PullPaymentModel.ProgressModel()
                    {
                        CompletedPercent = (int)(totalCompleted / ppBlob.Limit * 100m),
                        AwaitingPercent  = (int)(totalAwaiting / ppBlob.Limit * 100m),
                        Awaiting         = totalAwaiting.RoundToSignificant(ni.Divisibility).ToString("C", nfi),
                        Completed        = totalCompleted.RoundToSignificant(ni.Divisibility).ToString("C", nfi),
                        Limit            = _currencyNameTable.DisplayFormatCurrency(ppBlob.Limit, ppBlob.Currency),
                        ResetIn          = period?.End is DateTimeOffset nr ? ZeroIfNegative(nr - now).TimeString() : null,
                        EndIn            = pp.EndDate is DateTimeOffset end ? ZeroIfNegative(end - now).TimeString() : null,
                    },
コード例 #2
0
        public async Task <IActionResult> PullPayments(
            string storeId,
            PullPaymentState pullPaymentState,
            int skip         = 0,
            int count        = 50,
            string sortOrder = "desc"
            )
        {
            await using var ctx = _dbContextFactory.CreateContext();
            var now      = DateTimeOffset.UtcNow;
            var ppsQuery = ctx.PullPayments
                           .Include(data => data.Payouts)
                           .Where(p => p.StoreId == storeId);

            if (sortOrder != null)
            {
                switch (sortOrder)
                {
                case "desc":
                    ViewData["NextStartSortOrder"] = "asc";
                    ppsQuery = ppsQuery.OrderByDescending(p => p.StartDate);
                    break;

                case "asc":
                    ppsQuery = ppsQuery.OrderBy(p => p.StartDate);
                    ViewData["NextStartSortOrder"] = "desc";
                    break;
                }
            }

            var paymentMethods = await _payoutHandlers.GetSupportedPaymentMethods(HttpContext.GetStoreData());

            if (!paymentMethods.Any())
            {
                TempData.SetStatusMessageModel(new StatusMessageModel
                {
                    Message  = "You must enable at least one payment method before creating a pull payment.",
                    Severity = StatusMessageModel.StatusSeverity.Error
                });
                return(RedirectToAction(nameof(UIStoresController.Dashboard), "UIStores", new { storeId }));
            }

            var vm = this.ParseListQuery(new PullPaymentsModel
            {
                Skip = skip, Count = count, ActiveState = pullPaymentState
            });

            switch (pullPaymentState)
            {
            case PullPaymentState.Active:
                ppsQuery = ppsQuery
                           .Where(
                    p => !p.Archived &&
                    (p.EndDate != null ? p.EndDate > DateTimeOffset.UtcNow : true) &&
                    p.StartDate <= DateTimeOffset.UtcNow
                    );
                break;

            case PullPaymentState.Archived:
                ppsQuery = ppsQuery.Where(p => p.Archived);
                break;

            case PullPaymentState.Expired:
                ppsQuery = ppsQuery.Where(p => DateTimeOffset.UtcNow > p.EndDate);
                break;

            case PullPaymentState.Future:
                ppsQuery = ppsQuery.Where(p => p.StartDate > DateTimeOffset.UtcNow);
                break;
            }

            var pps = await ppsQuery
                      .Skip(vm.Skip)
                      .Take(vm.Count)
                      .ToListAsync();

            vm.PullPayments.AddRange(pps.Select(pp =>
            {
                var blob = pp.GetBlob();
                return(new PullPaymentsModel.PullPaymentModel()
                {
                    StartDate = pp.StartDate,
                    EndDate = pp.EndDate,
                    Id = pp.Id,
                    Name = blob.Name,
                    AutoApproveClaims = blob.AutoApproveClaims,
                    Progress = _pullPaymentService.CalculatePullPaymentProgress(pp, now),
                    Archived = pp.Archived
                });
            }));

            return(View(vm));
        }