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