public Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext == null) { throw new ArgumentNullException(nameof(bindingContext)); } var modelName = bindingContext.ModelName; // Try to fetch the value of the argument by name var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName); if (valueProviderResult == ValueProviderResult.None) { return(Task.CompletedTask); } bindingContext.ModelState.SetModelValue(modelName, valueProviderResult); var value = valueProviderResult.FirstValue; try { bindingContext.Result = ModelBindingResult.Success(DateTimeContext.Parse(value)); } catch (ArgumentException e) { bindingContext.ModelState.TryAddModelError(modelName, e.Message); } return(Task.CompletedTask); }
public EndBalance Calculate(List <Filter> filters) { if (filters == null) { return(null); } var startFilter = filters.FindStartDateFilter(nameof(TransactionDisplay.CreatedTime)); var endFilter = filters.FindEndDateFilter(nameof(TransactionDisplay.CreatedTime)); if (startFilter == null || endFilter == null) { return(null); } var transactionsAmount = Context.Transactions .ApplyTableRequestIQueryable <Transaction, TransactionDisplay, long>(CreateTableRequest(filters)) .Select(x => x.Amount) .ToList(); var startDate = DateTimeContext.Parse(startFilter.Value.ToString()); var endDate = DateTimeContext.Parse(endFilter.Value.ToString()); var totalExpenses = transactionsAmount.Where(x => x < 0).Sum(); var totalIncome = transactionsAmount.Where(x => x > 0).Sum(); var balanceOnStartDate = Context.Transactions.Where(x => x.CreatedTime <= startDate).Sum(x => x.Amount); var balanceOnEndDate = Context.Transactions.Where(x => x.CreatedTime <= endDate).Sum(x => x.Amount); var availableBalance = Context.Transactions.Sum(x => x.Amount); var filterByProjectStr = filters.SingleFilterOrDefault(nameof(TransactionDisplay.ProjectId))?.Value?.ToString(); var filterByProject = filterByProjectStr != null?long.Parse(filterByProjectStr) as long? : null; return(new EndBalance { BalanceOnStartDate = balanceOnStartDate, BalanceOnEndDate = balanceOnEndDate, AvailableBalance = availableBalance, TotalExpenses = totalExpenses, TotalIncome = totalIncome, TotalAmount = totalExpenses + totalIncome, StartDate = startDate, EndDate = endDate, ProjectsBalances = CalculateProjectsBalances(startDate, endDate, filterByProject) }); }
protected override Expression GetFilterExpression(ParameterExpression param, Filter filter) { var field = filter.Path.CreatePropertyExpression(param); ConstantExpression value = Expression.Constant(DateTimeContext.Parse(filter.Value.ToString())); DateTime?date = value.Value as DateTime?; if (date == null) { return(null); } DateTime currentDate = ((DateTime)date).Date; DateTime nextDate = currentDate.AddDays(1); switch (filter.Operator) { case FilterOperator.Equal: case FilterOperator.Contains: return(Expression.AndAlso( Expression.GreaterThanOrEqual(field, Expression.Constant(currentDate)), Expression.LessThan(field, Expression.Constant(nextDate)))); case FilterOperator.GreaterThan: return(Expression.GreaterThan(field, Expression.Constant(currentDate))); case FilterOperator.GreaterThanOrEqual: return(Expression.GreaterThanOrEqual(field, Expression.Constant(currentDate))); case FilterOperator.LessThan: return(Expression.LessThan(field, Expression.Constant(nextDate))); case FilterOperator.LessThanOrEqual: return(Expression.LessThanOrEqual(field, Expression.Constant(nextDate))); default: throw new SwitchExpressionValueException(filter.Operator); } }