public async Task ResolveMappingError_Fail()
        {
            var options = TestHelper.GetDbContext("ResolveMappingError_Fail");

            var user1     = TestHelper.InsertUserDetailed(options);
            var statement = TestHelper.InsertCommissionStatement(options, user1.Organisation);

            using (var context = new DataContext(options))
            {
                var error1 = new CommissionErrorEdit
                {
                    Id = Guid.NewGuid(),
                    CommissionStatementId = statement.Id,
                    Data = new ImportCommission()
                };

                var commissionService = new CommissionService(context, null);
                var service           = new CommissionErrorService(context, commissionService, null, null, null, null, null);

                //When
                var scope  = TestHelper.GetScopeOptions(user1);
                var result = await service.ResolveMappingError(scope, error1);

                //Then
                Assert.False(result.Success);

                Assert.Equal(3, result.ValidationFailures.Count);
                Assert.Equal("'Policy' must not be empty.", result.ValidationFailures[0].ErrorMessage);
            }
        }
        public async Task Get()
        {
            var error = new CommissionErrorEdit()
            {
                Id = Guid.NewGuid(),
                CommissionStatementId = Guid.NewGuid(),
                CommissionTypeId      = Guid.NewGuid(),
                ClientId = Guid.NewGuid(),
                PolicyId = Guid.NewGuid(),
                Data     = new OneAdvisor.Model.Commission.Model.ImportCommission.ImportCommission()
                {
                    PolicyNumber       = "123",
                    AmountIncludingVAT = "50",
                    VAT = "5"
                },
            };

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

            ScopeOptions options = null;

            service.Setup(c => c.GetError(It.IsAny <ScopeOptions>(), It.Is <Guid>(m => m == error.Id)))
            .Callback((ScopeOptions scopeOptions, Guid a) => options = scopeOptions)
            .ReturnsAsync(error);

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

            var result = await controller.Get(error.Id);

            Assert.Equal(Scope.Branch, options.Scope);

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

            Assert.Same(error, returnValue);
        }
        public async Task ResolveMappingError()
        {
            var error = new CommissionErrorEdit()
            {
                Id = Guid.NewGuid(),
                CommissionStatementId = Guid.NewGuid(),
                CommissionTypeId      = Guid.NewGuid(),
                ClientId = Guid.NewGuid(),
                PolicyId = Guid.NewGuid(),
                Data     = new OneAdvisor.Model.Commission.Model.ImportCommission.ImportCommission()
                {
                    PolicyNumber       = "123",
                    AmountIncludingVAT = "50",
                    VAT = "5"
                },
            };

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

            var result = new Result()
            {
                Success = true,
                Tag     = new CommissionEdit()
                {
                    CommissionStatementId = error.CommissionStatementId,
                    PolicyId = error.PolicyId
                }
            };

            ScopeOptions        options1 = null;
            CommissionErrorEdit resolved = null;

            service.Setup(c => c.ResolveMappingError(It.IsAny <ScopeOptions>(), It.Is <CommissionErrorEdit>(e => e == error)))
            .Callback((ScopeOptions o, CommissionErrorEdit e) =>
            {
                resolved = e;
                options1 = o;
            })
            .ReturnsAsync(result);

            ScopeOptions options2 = null;

            service.Setup(c => c.AutoResolveMappingErrors(It.IsAny <ScopeOptions>(), It.Is <Guid>(m => m == error.CommissionStatementId), It.Is <Guid>(m => m == error.PolicyId)))
            .Callback((ScopeOptions o, Guid a, Guid b) =>
            {
                options2 = o;
            })
            .Returns(() => Task.CompletedTask);

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

            var actual = await controller.ResolveMappingError(error);

            Assert.Equal(Scope.Branch, options1.Scope);
            Assert.Equal(Scope.Branch, options2.Scope);
            Assert.Same(error, resolved);

            var okResult    = Assert.IsType <OkObjectResult>(actual);
            var returnValue = Assert.IsType <Result>(okResult.Value);

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

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

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

            var company1 = TestHelper.InsertCompany(options);

            var policy1 = new PolicyEntity
            {
                Id            = Guid.NewGuid(),
                Number        = Guid.NewGuid().ToString(),
                CompanyId     = company1.Id,
                ClientId      = client1.Client.Id,
                UserId        = user1.User.Id,
                NumberAliases = new List <string>()
                {
                    "987654"
                }                                               //Existing alias
            };

            var ic1 = new ImportCommission
            {
                PolicyNumber       = "123456", // Policy number is different
                CommissionTypeCode = "gap_cover",
                AmountIncludingVAT = "22",
                VAT = "33",
            };

            var err1 = new CommissionErrorEntity
            {
                Id = Guid.NewGuid(),
                CommissionStatementId = statement.Id,
                Data = ic1
            };

            using (var context = new DataContext(options))
            {
                context.CommissionError.Add(err1);

                context.Policy.Add(policy1);

                context.SaveChanges();

                var error1 = new CommissionErrorEdit
                {
                    Id = err1.Id,
                    CommissionStatementId = statement.Id,
                    PolicyId         = policy1.Id,
                    ClientId         = policy1.ClientId,
                    CommissionTypeId = Guid.NewGuid(),
                    Data             = ic1
                };

                var auditService                     = new AuditServiceMock();
                var commissionService                = new CommissionService(context, auditService);
                var clientService                    = new ClientService(context, auditService);
                var policyService                    = new PolicyService(context, auditService);
                var commissionSplitService           = new CommissionSplitService(context, auditService);
                var commissionSplitRulePolicyService = new CommissionSplitRulePolicyService(context, commissionSplitService, auditService);
                var service = new CommissionErrorService(context, commissionService, clientService, commissionSplitService, policyService, commissionSplitRulePolicyService, auditService);

                //When
                var scope  = TestHelper.GetScopeOptions(user1);
                var result = await service.ResolveMappingError(scope, error1);

                //Then
                Assert.True(result.Success);

                var actual = context.Commission.Single();

                Assert.Equal(error1.PolicyId, actual.PolicyId);
                Assert.Equal(error1.Data, actual.SourceData);

                var actualPolicy = context.Policy.Single();
                Assert.Equal(2, actualPolicy.NumberAliases.Count());
                Assert.NotNull(actualPolicy.NumberAliases.SingleOrDefault(n => n == "123456")); //New alias
                Assert.NotNull(actualPolicy.NumberAliases.SingleOrDefault(n => n == "987654")); //Existing alias
            }
        }
        public async Task ResolveMappingError_Pass_UpdateMemberDetails()
        {
            var options = TestHelper.GetDbContext("ResolveMappingError_Pass_UpdateMemberDetails");

            var user1 = TestHelper.InsertUserDetailed(options);

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

            var company1 = TestHelper.InsertCompany(options);

            var client1 = new ClientEntity
            {
                Id             = Guid.NewGuid(),
                ClientTypeId   = ClientType.CLIENT_TYPE_INDIVIDUAL,
                FirstName      = "",
                LastName       = "",
                IdNumber       = "",
                OrganisationId = user1.Organisation.Id,
                Initials       = "",
                DateOfBirth    = null,
                TaxNumber      = Guid.NewGuid().ToString()
            };

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

            var ic1 = new ImportCommission
            {
                PolicyNumber       = "123456",
                CommissionTypeCode = "gap_cover",
                AmountIncludingVAT = "22",
                VAT         = "33",
                FirstName   = "Dean",
                LastName    = "van Niekerk",
                IdNumber    = "8210035032082",
                DateOfBirth = "1982-10-03",
                Initials    = "DJ"
            };

            var err1 = new CommissionErrorEntity
            {
                Id = Guid.NewGuid(),
                CommissionStatementId = statement.Id,
                Data = ic1
            };

            using (var context = new DataContext(options))
            {
                context.Client.Add(client1);

                context.CommissionError.Add(err1);

                context.Policy.Add(policy1);

                context.SaveChanges();

                var error1 = new CommissionErrorEdit
                {
                    Id = err1.Id,
                    CommissionStatementId = statement.Id,
                    PolicyId         = policy1.Id,
                    ClientId         = policy1.ClientId,
                    CommissionTypeId = Guid.NewGuid(),
                    Data             = ic1
                };

                var auditService                     = new AuditServiceMock();
                var commissionService                = new CommissionService(context, auditService);
                var clientService                    = new ClientService(context, auditService);
                var policyService                    = new PolicyService(context, auditService);
                var commissionSplitService           = new CommissionSplitService(context, auditService);
                var commissionSplitRulePolicyService = new CommissionSplitRulePolicyService(context, commissionSplitService, auditService);
                var service = new CommissionErrorService(context, commissionService, clientService, commissionSplitService, policyService, commissionSplitRulePolicyService, auditService);

                //When
                var scope  = TestHelper.GetScopeOptions(user1);
                var result = await service.ResolveMappingError(scope, error1);

                //Then
                Assert.True(result.Success);

                var actual = context.Commission.Single();

                Assert.Equal(error1.PolicyId, actual.PolicyId);
                Assert.Equal(error1.CommissionStatementId, actual.CommissionStatementId);
                Assert.Equal(error1.CommissionTypeId, actual.CommissionTypeId);
                Assert.Equal(22, actual.AmountIncludingVAT);
                Assert.Equal(33, actual.VAT);
                Assert.Equal(error1.Data, actual.SourceData);

                var actualClient = context.Client.Single();
                Assert.Equal(ic1.Initials, actualClient.Initials);
                Assert.Equal(ic1.FirstName, actualClient.FirstName);
                Assert.Equal(ic1.LastName, actualClient.LastName);
                Assert.Equal(ic1.IdNumber, actualClient.IdNumber);
                Assert.Equal(DateTime.Parse(ic1.DateOfBirth), actualClient.DateOfBirth);
            }
        }
        public async Task ResolveMappingError_Pass()
        {
            var options = TestHelper.GetDbContext("ResolveMappingError_Pass");

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

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

            var company1 = TestHelper.InsertCompany(options);

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

            var ic1 = new ImportCommission
            {
                PolicyNumber       = "123456",
                CommissionTypeCode = "gap_cover",
                AmountIncludingVAT = "22",
                VAT = "33",

                //These should get ignored as values already exist in db
                FirstName   = "Dean",
                LastName    = "van Niekerk",
                IdNumber    = "8210035032082",
                DateOfBirth = "1982-10-03",
                Initials    = "DJ"
            };

            var err1 = new CommissionErrorEntity
            {
                Id = Guid.NewGuid(),
                CommissionStatementId = statement.Id,
                Data = ic1
            };

            var err2 = new CommissionErrorEntity
            {
                Id = Guid.NewGuid(),
                CommissionStatementId = statement.Id,
                Data = new ImportCommission()
            };

            using (var context = new DataContext(options))
            {
                context.CommissionError.Add(err1);
                context.CommissionError.Add(err2);

                context.Policy.Add(policy1);

                context.SaveChanges();

                var error1 = new CommissionErrorEdit
                {
                    Id = err1.Id,
                    CommissionStatementId = statement.Id,
                    PolicyId         = policy1.Id,
                    ClientId         = policy1.ClientId,
                    CommissionTypeId = Guid.NewGuid(),
                    Data             = ic1
                };

                var auditService                     = new AuditServiceMock();
                var commissionService                = new CommissionService(context, auditService);
                var clientService                    = new ClientService(context, auditService);
                var policyService                    = new PolicyService(context, auditService);
                var commissionSplitService           = new CommissionSplitService(context, auditService);
                var commissionSplitRulePolicyService = new CommissionSplitRulePolicyService(context, commissionSplitService, auditService);
                var service = new CommissionErrorService(context, commissionService, clientService, commissionSplitService, policyService, commissionSplitRulePolicyService, auditService);

                //When
                var scope  = TestHelper.GetScopeOptions(user1);
                var result = await service.ResolveMappingError(scope, error1);

                //Then
                Assert.True(result.Success);

                var actualError = context.CommissionError.Single();

                Assert.Equal(err2.Id, actualError.Id);

                var actual = context.Commission.Single();

                Assert.Equal(error1.PolicyId, actual.PolicyId);
                Assert.Equal(error1.CommissionStatementId, actual.CommissionStatementId);
                Assert.Equal(error1.CommissionTypeId, actual.CommissionTypeId);
                Assert.Equal(22, actual.AmountIncludingVAT);
                Assert.Equal(33, actual.VAT);
                Assert.Equal(error1.Data, actual.SourceData);

                //These details should not have changed
                var actualClient = context.Client.Single();
                Assert.Equal(client1.Client.Initials, actualClient.Initials);
                Assert.Equal(client1.Client.FirstName, actualClient.FirstName);
                Assert.Equal(client1.Client.LastName, actualClient.LastName);
                Assert.Equal(client1.Client.IdNumber, actualClient.IdNumber);
                Assert.Equal(client1.Client.DateOfBirth, actualClient.DateOfBirth);
            }
        }
예제 #7
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);
        }