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 PolicyQueryOptions(scope, sortColumn, sortDirection, pageSize, pageNumber, filters);
            var pagedItems   = await PolicyService.GetPolicies(queryOptions);

            return(Ok(pagedItems));
        }
        public async Task Index()
        {
            var policy = new Policy()
            {
                Id           = Guid.NewGuid(),
                ClientId     = Guid.NewGuid(),
                CompanyId    = Guid.NewGuid(),
                UserId       = Guid.NewGuid(),
                Number       = "123456",
                StartDate    = DateTime.Now,
                Premium      = 500,
                PolicyTypeId = Guid.NewGuid()
            };

            var pagedItems = new PagedItems <Policy>()
            {
                TotalItems = 1,
                Items      = new List <Policy>()
                {
                    policy
                }
            };

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

            PolicyQueryOptions queryOptions = null;

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

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

            var result = await controller.Index("StartDate", "desc", 15, 2, "Number=%123%");

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

            Assert.Equal("%123%", queryOptions.Number);

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

            Assert.Same(pagedItems, returnValue);
        }
        public async Task <ImportResult> ImportCommissions(ScopeOptions scope, Guid commissionStatementId, IEnumerable <ImportCommission> importData)
        {
            var importResult = new ImportResult();

            CommissionsToInsert      = new List <CommissionEntity>();
            CommissionErrorsToInsert = new List <CommissionErrorEntity>();

            //Scope check
            var queryOptions = new CommissionStatementQueryOptions(scope, "", "", 0, 0);

            queryOptions.CommissionStatementId = commissionStatementId;
            var statements = await _commissionStatementService.GetCommissionStatements(queryOptions);

            if (!statements.Items.Any())
            {
                return(importResult);
            }

            var statement = statements.Items.Single();

            var commissionTypes = await _commissionLookupService.GetCommissionTypes();

            var commissionTypesDictionary = BuildCommissionTypesDictionary(commissionTypes);
            var company = await _lookupService.GetCompany(statement.CompanyId);

            var policyQueryOptions = new PolicyQueryOptions(scope, "", "", 0, 0);

            policyQueryOptions.CompanyId.Add(statement.CompanyId);
            var policies         = (await _policyService.GetPolicies(policyQueryOptions)).Items.ToList();
            var policyDictionary = BuildPolicyDictionary(policies, company.CommissionPolicyNumberPrefixes.ToList());

            var commissionSplitRulesQueryOptions = new CommissionSplitRuleQueryOptions(scope, "", "", 0, 0);
            var commissionSplitRules             = (await _commissionSplitService.GetCommissionSplitRules(commissionSplitRulesQueryOptions)).Items.ToList();

            var commissionSplitRulePolicyQueryOptions = new CommissionSplitRulePolicyQueryOptions(scope, "", "", 0, 0);
            var commissionSplitRulePolicies           = (await _commissionSplitRulePolicyService.GetCommissionSplitRulePolicies(commissionSplitRulePolicyQueryOptions)).Items.ToList();

            foreach (var data in importData)
            {
                var result = ImportCommission(scope, statement, data, policyDictionary, commissionTypesDictionary, commissionSplitRules, commissionSplitRulePolicies);

                importResult.Results.Add(result);

                if (data.CommissionTypeCode == CommissionType.COMMISSION_TYPE_UNKNOWN_CODE)
                {
                    importResult.AddUnknownCommissionTypeValue(data.CommissionTypeValue);
                }
            }

            if (CommissionsToInsert.Any())
            {
                await _bulkActions.BulkInsertCommissionsAsync(_context, CommissionsToInsert);
            }

            if (CommissionErrorsToInsert.Any())
            {
                await _bulkActions.BulkInsertCommissionErrorsAsync(_context, CommissionErrorsToInsert);
            }

            await _auditService.InsertAuditLog(scope, "Import", "Commission", statement.Id,
                                               new
            {
                commissionStatementId = commissionStatementId,
                importCount           = importResult.ImportCount,
                errorCount            = importResult.ErrorCount,
                errors = importResult.Results.Where(r => !r.Success).ToList()
            }
                                               );

            return(importResult);
        }
        public async Task GetPolicies()
        {
            var options = TestHelper.GetDbContext("GetPolicies");

            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 company1 = TestHelper.InsertCompany(options);

            //Given
            var policy1 = new PolicyEntity
            {
                Id                  = Guid.NewGuid(),
                CompanyId           = company1.Id,
                ClientId            = client1.Client.Id,
                UserId              = user1.User.Id,
                Number              = "123465",
                StartDate           = DateTime.Now,
                Premium             = 500,
                PolicyTypeId        = Guid.NewGuid(),
                PolicyProductTypeId = Guid.NewGuid(),
                PolicyProductId     = Guid.NewGuid(),
                IsActive            = true,
            };

            var policy2 = new PolicyEntity
            {
                Id                  = Guid.NewGuid(),
                CompanyId           = company1.Id,
                ClientId            = client2.Client.Id,
                UserId              = user2.User.Id,
                Number              = "654321",
                PolicyTypeId        = Guid.NewGuid(),
                PolicyProductTypeId = Guid.NewGuid(),
                PolicyProductId     = Guid.NewGuid(),
                IsActive            = false,
            };

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

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

                context.SaveChanges();
            }

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

                //When
                var scope        = TestHelper.GetScopeOptions(user1);
                var queryOptions = new PolicyQueryOptions(scope, "", "", 0, 0);
                var policies     = await service.GetPolicies(queryOptions);

                //Then
                Assert.Equal(2, policies.TotalItems);
                Assert.Equal(2, policies.Items.Count());

                var actual = policies.Items.First();
                Assert.Equal(policy1.Id, actual.Id);
                Assert.Equal(policy1.ClientId, actual.ClientId);
                Assert.Equal(policy1.CompanyId, actual.CompanyId);
                Assert.Equal(policy1.Number, actual.Number);
                Assert.Equal(policy1.StartDate, actual.StartDate);
                Assert.Equal(policy1.Premium, actual.Premium);
                Assert.Equal(policy1.PolicyTypeId, actual.PolicyTypeId);
                Assert.Equal(policy1.PolicyProductTypeId, actual.PolicyProductTypeId);
                Assert.Equal(policy1.PolicyProductId, actual.PolicyProductId);
                Assert.Equal(policy1.IsActive, actual.IsActive);

                actual = policies.Items.Last();
                Assert.Equal(policy2.Id, actual.Id);
                Assert.Equal(policy2.IsActive, actual.IsActive);

                //Check scope
                scope        = TestHelper.GetScopeOptions(user1, Scope.User);
                queryOptions = new PolicyQueryOptions(scope, "", "", 0, 0);
                policies     = await service.GetPolicies(queryOptions);

                Assert.Single(policies.Items);

                actual = policies.Items.First();
                Assert.Equal(policy1.Id, actual.Id);
            }
        }
Пример #5
0
        public async Task <Result> ResolveMappingError(ScopeOptions scope, CommissionErrorEdit error)
        {
            var validator = new CommissionErrorValidator();
            var result    = validator.Validate(error).GetResult();

            if (!result.Success)
            {
                return(result);
            }

            var commission = new CommissionEdit();

            commission.PolicyId = error.PolicyId;
            commission.CommissionStatementId = error.CommissionStatementId;
            commission.CommissionTypeId      = error.CommissionTypeId;
            commission.AmountIncludingVAT    = Convert.ToDecimal(error.Data.AmountIncludingVAT);
            commission.VAT        = Convert.ToDecimal(error.Data.VAT);
            commission.SourceData = error.Data;

            var policyQueryOptions = new PolicyQueryOptions(scope, "", "", 0, 0);

            policyQueryOptions.Id = error.PolicyId;
            var policy = (await _policyService.GetPolicies(policyQueryOptions)).Items.Single();

            var commissionSplitRulesOptions = new CommissionSplitRuleQueryOptions(scope, "", "", 0, 0);
            var commissionSplitRules        = (await _commissionSplitService.GetCommissionSplitRules(commissionSplitRulesOptions)).Items.ToList();

            var commissionSplitRulePolicyQueryOptions = new CommissionSplitRulePolicyQueryOptions(scope, "", "", 0, 0);
            var commissionSplitRulePolicies           = (await _commissionSplitRulePolicyService.GetCommissionSplitRulePolicies(commissionSplitRulePolicyQueryOptions)).Items.ToList();

            var commissions = _commissionSplitService.SplitCommission(commission, policy, error.Data, commissionSplitRules, commissionSplitRulePolicies);

            foreach (var c in commissions)
            {
                result = await _commissionService.InsertCommission(scope, c);
            }

            //Update client details (if none exist)
            try
            {
                var client = await _clientService.GetClient(scope, error.ClientId.Value);

                client.FirstName   = string.IsNullOrEmpty(client.FirstName) ? error.Data.FirstName ?? "" : client.FirstName;
                client.LastName    = string.IsNullOrEmpty(client.LastName) ? error.Data.FullName ?? "" : client.LastName;
                client.LastName    = string.IsNullOrEmpty(client.LastName) ? error.Data.LastName ?? "" : client.LastName;
                client.Initials    = string.IsNullOrEmpty(client.Initials) ? error.Data.Initials ?? "" : client.Initials;
                client.DateOfBirth = !client.DateOfBirth.HasValue ? DateTime.Parse(error.Data.DateOfBirth) : client.DateOfBirth;

                if (!string.IsNullOrEmpty(error.Data.IdNumber))
                {
                    var idNumber = new IdNumber(error.Data.IdNumber);
                    if (idNumber.IsValid)
                    {
                        client.IdNumber = string.IsNullOrEmpty(client.IdNumber) ? error.Data.IdNumber : client.IdNumber;
                    }
                    else
                    {
                        client.AlternateIdNumber = string.IsNullOrEmpty(client.AlternateIdNumber) ? error.Data.IdNumber ?? "" : client.AlternateIdNumber;
                    }
                }
                await _clientService.UpdateClient(scope, client);

                //Add policy alias if policy number doesnt match policy id
                if (!policy.Number.IgnoreCaseEquals(error.Data.PolicyNumber))
                {
                    //First check if its not already and alias
                    if (!policy.NumberAliases.Any(n => n.IgnoreCaseEquals(error.Data.PolicyNumber)))
                    {
                        var policyEdit = await _policyService.GetPolicy(scope, policy.Id);

                        policyEdit.NumberAliases.Add(error.Data.PolicyNumber);
                        await _policyService.UpdatePolicy(scope, policyEdit);
                    }
                }
            }
            catch { }


            if (!result.Success)
            {
                return(result);
            }

            await DeleteError(scope, error.Id);

            result.Tag = commission;

            return(result);
        }
Пример #6
0
        public async Task <PagedItems <Policy> > GetPolicies(PolicyQueryOptions queryOptions)
        {
            var userQuery = ScopeQuery.GetUserEntityQuery(_context, queryOptions.Scope);

            var policyQuery = from policy in _context.Policy
                              select policy;

            //Apply filters ----------------------------------------------------------------------------------------
            if (!string.IsNullOrWhiteSpace(queryOptions.Number))
            {
                policyQuery = policyQuery.WherePolicyNumberEquals(queryOptions.Number);
            }
            //------------------------------------------------------------------------------------------------------

            var query = from user in userQuery
                        join policy in policyQuery
                        on user.Id equals policy.UserId
                        join client in _context.Client
                        on policy.ClientId equals client.Id
                        join company in _context.Company
                        on policy.CompanyId equals company.Id
                        select new Policy()
            {
                Id                  = policy.Id,
                ClientId            = policy.ClientId,
                Number              = policy.Number,
                CompanyId           = policy.CompanyId,
                UserId              = policy.UserId,
                Premium             = policy.Premium,
                StartDate           = policy.StartDate,
                PolicyTypeId        = policy.PolicyTypeId,
                PolicyProductTypeId = policy.PolicyProductTypeId,
                PolicyProductId     = policy.PolicyProductId,
                ClientLastName      = client.LastName,
                ClientInitials      = client.Initials,
                ClientDateOfBirth   = client.DateOfBirth,
                IsActive            = policy.IsActive,
                NumberAliases       = policy.NumberAliases,
                CompanyName         = company.Name,
            };

            //Apply filters ----------------------------------------------------------------------------------------
            if (queryOptions.Id.HasValue)
            {
                query = query.Where(m => m.Id == queryOptions.Id.Value);
            }

            if (queryOptions.ClientId.HasValue)
            {
                query = query.Where(m => m.ClientId == queryOptions.ClientId.Value);
            }

            if (queryOptions.CompanyId.Any())
            {
                query = query.Where(m => queryOptions.CompanyId.Contains(m.CompanyId));
            }

            if (queryOptions.PolicyTypeId.Any())
            {
                query = query.Where(m => queryOptions.PolicyTypeId.Contains(m.PolicyTypeId.Value));
            }

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

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

            if (queryOptions.IsActive.HasValue)
            {
                query = query.Where(m => m.IsActive == queryOptions.IsActive.Value);
            }
            //------------------------------------------------------------------------------------------------------

            var pagedItems = new PagedItems <Policy>();

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

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