public async Task <IActionResult> Index(string sortColumn, string sortDirection, int pageSize = 0, int pageNumber = 0, string filters = null)
        {
            var scope = AuthenticationService.GetScope(User);

            var queryOptions = new CommissionQueryOptions(scope, sortColumn, sortDirection, pageSize, pageNumber, filters);

            var commissions = await CommissionService.GetCommissions(queryOptions);

            return(Ok(commissions));
        }
        public async Task Index()
        {
            var commission = new OneAdvisor.Model.Commission.Model.Commission.Commission()
            {
                Id = Guid.NewGuid(),
                AmountIncludingVAT = 100,
                VAT = 20,
                CommissionStatementId = Guid.NewGuid(),
                CommissionTypeId      = Guid.NewGuid(),
                PolicyId     = Guid.NewGuid(),
                PolicyNumber = "123456",
                UserId       = Guid.NewGuid()
            };

            var pagedItems = new PagedCommissions()
            {
                TotalItems            = 1,
                SumAmountIncludingVAT = 300,
                SumVAT = 400,
                Items  = new List <OneAdvisor.Model.Commission.Model.Commission.Commission>()
                {
                    commission
                }
            };

            var service     = new Mock <ICommissionService>();
            var authService = TestHelper.MockAuthenticationService(Scope.Branch);

            CommissionQueryOptions queryOptions = null;

            service.Setup(c => c.GetCommissions(It.IsAny <CommissionQueryOptions>()))
            .Callback((CommissionQueryOptions options) => queryOptions = options)
            .ReturnsAsync(pagedItems);

            var controller = new CommissionsController(service.Object, authService.Object);

            var result = await controller.Index("policyNumber", "desc", 15, 2, $"commissionTypeId={commission.CommissionTypeId}");

            Assert.Equal(Scope.Branch, queryOptions.Scope.Scope);
            Assert.Equal("policyNumber", queryOptions.SortOptions.Column);
            Assert.Equal(SortDirection.Descending, queryOptions.SortOptions.Direction);
            Assert.Equal(15, queryOptions.PageOptions.Size);
            Assert.Equal(2, queryOptions.PageOptions.Number);

            Assert.Equal(commission.CommissionTypeId, queryOptions.CommissionTypeId.Single());

            var okResult    = Assert.IsType <OkObjectResult>(result);
            var returnValue = Assert.IsType <PagedCommissions>(okResult.Value);

            Assert.Same(pagedItems, returnValue);
        }
        public async Task GetCommissions()
        {
            var options = TestHelper.GetDbContext("GetCommissions");

            var user1   = TestHelper.InsertUserDetailed(options);
            var user2   = TestHelper.InsertUserDetailed(options, user1.Organisation);
            var client1 = TestHelper.InsertClient(options, user1.Organisation);
            var client2 = TestHelper.InsertClient(options, user1.Organisation);

            var user3   = TestHelper.InsertUserDetailed(options);
            var client3 = TestHelper.InsertClient(options, user3.Organisation);

            var statement1 = TestHelper.InsertCommissionStatement(options, user1.Organisation);
            var statement2 = TestHelper.InsertCommissionStatement(options, user1.Organisation);

            var policy1 = new PolicyEntity
            {
                Id        = Guid.NewGuid(),
                Number    = Guid.NewGuid().ToString(),
                CompanyId = statement1.CompanyId,
                ClientId  = client1.Client.Id,
                UserId    = user1.User.Id
            };

            var policy2 = new PolicyEntity
            {
                Id        = Guid.NewGuid(),
                CompanyId = statement1.CompanyId,
                ClientId  = client2.Client.Id,
                UserId    = user2.User.Id
            };

            var policy3 = new PolicyEntity
            {
                Id        = Guid.NewGuid(),
                CompanyId = statement1.CompanyId,
                ClientId  = client3.Client.Id,
                UserId    = user3.User.Id
            };

            //Given
            var commission1 = new CommissionEntity
            {
                Id                    = Guid.NewGuid(),
                PolicyId              = policy1.Id,
                CommissionTypeId      = Guid.NewGuid(),
                AmountIncludingVAT    = 100,
                VAT                   = 10,
                CommissionStatementId = statement1.Id,
                UserId                = user1.User.Id,
            };

            var commission2 = new CommissionEntity
            {
                Id                    = Guid.NewGuid(),
                PolicyId              = policy2.Id,
                CommissionTypeId      = Guid.NewGuid(),
                AmountIncludingVAT    = 200,
                VAT                   = 20,
                CommissionStatementId = statement1.Id,
                UserId                = user2.User.Id,
            };

            var commission3 = new CommissionEntity
            {
                Id                    = Guid.NewGuid(),
                PolicyId              = policy2.Id,
                CommissionTypeId      = Guid.NewGuid(),
                AmountIncludingVAT    = 300,
                VAT                   = 30,
                CommissionStatementId = statement1.Id,
                UserId                = user2.User.Id,
            };

            var commission4 = new CommissionEntity
            {
                Id                    = Guid.NewGuid(),
                PolicyId              = policy3.Id,
                CommissionTypeId      = Guid.NewGuid(),
                AmountIncludingVAT    = 40,
                VAT                   = 400,
                CommissionStatementId = statement2.Id,
                UserId                = user3.User.Id,
            };

            using (var context = new DataContext(options))
            {
                context.Policy.Add(policy1);
                context.Policy.Add(policy2);
                context.Policy.Add(policy3);

                context.Commission.Add(commission1);
                context.Commission.Add(commission2);
                context.Commission.Add(commission3);
                context.Commission.Add(commission4);

                context.SaveChanges();
            }

            using (var context = new DataContext(options))
            {
                var auditService = new AuditServiceMock();
                var service      = new CommissionService(context, auditService);

                //When
                var scope        = TestHelper.GetScopeOptions(user1);
                var queryOptions = new CommissionQueryOptions(scope, "", "", 0, 0);
                var commissions  = await service.GetCommissions(queryOptions);

                //Then
                Assert.Equal(3, commissions.TotalItems);
                Assert.Equal(3, commissions.Items.Count());

                Assert.Equal(600, commissions.SumAmountIncludingVAT);
                Assert.Equal(60, commissions.SumVAT);

                var items  = commissions.Items.ToList();
                var actual = items[0];
                Assert.Equal(commission1.Id, actual.Id);
                Assert.Equal(commission1.PolicyId, actual.PolicyId);
                Assert.Equal(commission1.CommissionTypeId, actual.CommissionTypeId);
                Assert.Equal(commission1.AmountIncludingVAT, actual.AmountIncludingVAT);
                Assert.Equal(commission1.VAT, actual.VAT);
                Assert.Equal(commission1.CommissionStatementId, actual.CommissionStatementId);
                Assert.Equal(policy1.Number, actual.PolicyNumber);

                Assert.Equal(statement1.Date, actual.CommissionStatementDate);
                Assert.Equal(client1.Client.LastName, actual.PolicyClientLastName);
                Assert.Equal(client1.Client.Initials, actual.PolicyClientInitials);
                Assert.Equal(client1.Client.DateOfBirth, actual.PolicyClientDateOfBirth);
                Assert.Equal(statement1.CompanyId, actual.PolicyCompanyId);

                actual = items[1];
                Assert.Equal(commission2.Id, actual.Id);

                actual = items[2];
                Assert.Equal(commission3.Id, actual.Id);

                //Check scope
                scope        = TestHelper.GetScopeOptions(user1, Scope.User);
                queryOptions = new CommissionQueryOptions(scope, "", "", 0, 0);
                commissions  = await service.GetCommissions(queryOptions);

                Assert.Single(commissions.Items);

                actual = commissions.Items.First();
                Assert.Equal(commission1.Id, actual.Id);
            }
        }
Пример #4
0
        public async Task <PagedCommissions> GetCommissions(CommissionQueryOptions queryOptions)
        {
            var userQuery = ScopeQuery.GetUserEntityQuery(_context, queryOptions.Scope);

            var query = from commission in _context.Commission
                        join user in userQuery
                        on commission.UserId equals user.Id
                        join policy in _context.Policy
                        on commission.PolicyId equals policy.Id
                        join client in _context.Client
                        on policy.ClientId equals client.Id
                        join statement in _context.CommissionStatement
                        on commission.CommissionStatementId equals statement.Id
                        select new OneAdvisor.Model.Commission.Model.Commission.Commission()
            {
                Id = commission.Id,
                CommissionStatementId = commission.CommissionStatementId,
                PolicyId           = commission.PolicyId,
                CommissionTypeId   = commission.CommissionTypeId,
                AmountIncludingVAT = commission.AmountIncludingVAT,
                VAT                     = commission.VAT,
                UserId                  = commission.UserId,
                BranchId                = user.BranchId,
                PolicyNumber            = policy.Number,
                CommissionStatementDate = statement.Date,
                PolicyCompanyId         = policy.CompanyId,
                PolicyClientLastName    = client.LastName,
                PolicyClientInitials    = client.Initials,
                PolicyClientDateOfBirth = client.DateOfBirth,
                SplitGroupId            = commission.SplitGroupId,
                PolicyTypeId            = policy.PolicyTypeId,
            };

            //Apply filters ----------------------------------------------------------------------------------------
            if (queryOptions.CommissionStatementId.HasValue)
            {
                query = query.Where(c => c.CommissionStatementId == queryOptions.CommissionStatementId);
            }

            if (queryOptions.UserId.Any())
            {
                query = query.Where(c => queryOptions.UserId.Contains(c.UserId));
            }

            if (queryOptions.BranchId.Any())
            {
                query = query.Where(c => queryOptions.BranchId.Contains(c.BranchId));
            }

            if (queryOptions.CommissionTypeId.Any())
            {
                query = query.Where(c => queryOptions.CommissionTypeId.Contains(c.CommissionTypeId));
            }

            if (queryOptions.PolicyCompanyId.Any())
            {
                query = query.Where(c => queryOptions.PolicyCompanyId.Contains(c.PolicyCompanyId));
            }

            if (!string.IsNullOrWhiteSpace(queryOptions.PolicyNumber))
            {
                query = query.Where(m => EF.Functions.Like(m.PolicyNumber, queryOptions.PolicyNumber));
            }

            if (!string.IsNullOrWhiteSpace(queryOptions.PolicyClientLastName))
            {
                query = query.Where(m => EF.Functions.Like(m.PolicyClientLastName, queryOptions.PolicyClientLastName));
            }

            if (queryOptions.StartDate.HasValue)
            {
                query = query.Where(c => c.CommissionStatementDate >= queryOptions.StartDate.Value.Date);
            }

            if (queryOptions.EndDate.HasValue)
            {
                query = query.Where(c => c.CommissionStatementDate <= queryOptions.EndDate.Value.Date);
            }
            //------------------------------------------------------------------------------------------------------

            var pagedItems = new PagedCommissions();

            //Get total items
            pagedItems.TotalItems = await query.CountAsync();

            //Aggregations
            var aggQuery = from commission in query
                           select new
            {
                SumAmountIncludingVAT = query.Select(c => (decimal?)c.AmountIncludingVAT).Sum(),
                SumVAT = query.Select(c => (decimal?)c.VAT).Sum(),
            };

            var aggregates = await aggQuery.FirstOrDefaultAsync();

            if (aggregates != null)
            {
                pagedItems.SumAmountIncludingVAT = aggregates.SumAmountIncludingVAT.Value;
                pagedItems.SumVAT = aggregates.SumVAT.Value;
            }

            //Ordering
            query = query.OrderBy(queryOptions.SortOptions.Column, queryOptions.SortOptions.Direction);

            //Paging
            pagedItems.Items = await query.TakePage(queryOptions.PageOptions.Number, queryOptions.PageOptions.Size).ToListAsync();

            return(pagedItems);
        }