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

            var temp1 = new CommissionStatementTemplateEntity
            {
                Id             = Guid.NewGuid(),
                CompanyId      = Guid.NewGuid(),
                Name           = "Template 1",
                StartDate      = DateTime.Now.AddDays(-1),
                EndDate        = DateTime.Now.AddDays(1),
                BrokerSpecific = true,
                Config         = new Config()
            };

            var temp2 = new CommissionStatementTemplateEntity
            {
                Id = Guid.NewGuid()
            };

            using (var context = new DataContext(options))
            {
                context.CommissionStatementTemplate.Add(temp2);
                context.CommissionStatementTemplate.Add(temp1);

                context.SaveChanges();
            }

            using (var context = new DataContext(options))
            {
                var template = new CommissionStatementTemplateEdit
                {
                    Id             = temp1.Id,
                    CompanyId      = Guid.NewGuid(),
                    Name           = "Template 1 updated",
                    StartDate      = DateTime.Now.AddDays(-2),
                    EndDate        = DateTime.Now.AddDays(2),
                    BrokerSpecific = false,
                    Config         = GetValidConfig()
                };

                var service = new CommissionStatementTemplateService(context, null, null);

                //When
                var result = await service.UpdateTemplate(template);

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

                var actual = await context.CommissionStatementTemplate.FindAsync(temp1.Id);

                Assert.Equal(template.Name, actual.Name);
                Assert.Equal(template.CompanyId, actual.CompanyId);
                Assert.Equal(template.Config, actual.Config);
                Assert.Equal(template.StartDate.Value.Date, actual.StartDate);
                Assert.Equal(template.EndDate.Value.Date, actual.EndDate);
                Assert.Equal(template.BrokerSpecific, actual.BrokerSpecific);
            }
        }
Example #2
0
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest request,
            ILogger log)
        {
            Guid organisationId                = Guid.Parse(request.Query["organisationId"]);
            Guid commissionStatementId         = Guid.Parse(request.Query["commissionStatementId"]);
            Guid commissionStatementTemplateId = Guid.Parse(request.Query["commissionStatementTemplateId"]);

            var scope     = new ScopeOptions(organisationId, Guid.Empty, Guid.Empty, Scope.Organisation);
            var statement = await CommissionStatementService.GetCommissionStatement(scope, commissionStatementId);

            if (statement == null)
            {
                return(new NotFoundObjectResult(commissionStatementId));
            }

            var path  = new CommissionStatementPath(scope.OrganisationId, commissionStatementId);
            var files = await FileStorageService.GetFilesAsync(path);

            if (!files.Any())
            {
                return(Utils.GetBadRequestObject("Reimport failed as there are no existing statement files.", commissionStatementId.ToString()));
            }

            var queryOptions = new CommissionStatementTemplateQueryOptions("", "", 0, 0);

            queryOptions.CompanyId.Add(statement.CompanyId.Value);
            queryOptions.Date = statement.Date;

            var templates = (await CommissionStatementTemplateService.GetTemplates(queryOptions)).Items;

            if (!templates.Any(t => t.Id == commissionStatementTemplateId))
            {
                return(Utils.GetBadRequestObject("Reimport failed as the commissionStatementTemplateId is not valid.", commissionStatementTemplateId.ToString()));
            }

            var template = await CommissionStatementTemplateService.GetTemplate(commissionStatementTemplateId);

            await CommissionStatementService.DeleteCommissions(scope, commissionStatementId);

            var result = new ImportResult();

            foreach (var fileInfo in files)
            {
                using (var stream = new MemoryStream())
                {
                    await FileStorageService.GetFile(fileInfo.Url, stream);

                    var vatRate = await DirectoryLookupService.GetVATRate(statement.Date ?? DateTime.Now);

                    var reader = new CommissionImportReader(template.Config, vatRate);
                    var items  = reader.Read(stream);

                    result = await CommissionImportService.ImportCommissions(scope, commissionStatementId, items);
                }
            }

            return(new OkObjectResult(result));
        }
        public async Task GetTemplate()
        {
            var options = TestHelper.GetDbContext("GetTemplate");

            //Given
            var temp1 = new CommissionStatementTemplateEntity
            {
                Id             = Guid.NewGuid(),
                CompanyId      = Guid.NewGuid(),
                Name           = "Template 1",
                StartDate      = DateTime.Now.AddDays(-1),
                EndDate        = DateTime.Now.AddDays(1),
                BrokerSpecific = true,
                Config         = new Config()
            };

            var temp2 = new CommissionStatementTemplateEntity
            {
                Id = Guid.NewGuid()
            };

            using (var context = new DataContext(options))
            {
                context.CommissionStatementTemplate.Add(temp2);
                context.CommissionStatementTemplate.Add(temp1);

                context.SaveChanges();
            }

            using (var context = new DataContext(options))
            {
                var service = new CommissionStatementTemplateService(context, null, null);

                //When
                var actual = await service.GetTemplate(temp1.Id);

                //Then
                Assert.Equal(temp1.Id, actual.Id);
                Assert.Equal(temp1.Name, actual.Name);
                Assert.Equal(temp1.CompanyId, actual.CompanyId);
                Assert.Equal(temp1.Config, actual.Config);
                Assert.Equal(temp1.StartDate, actual.StartDate);
                Assert.Equal(temp1.EndDate, actual.EndDate);
                Assert.Equal(temp1.BrokerSpecific, actual.BrokerSpecific);
            }
        }
        public async Task <IActionResult> Import(Guid commissionStatementId, [FromQuery] Guid commissionStatementTemplateId, [FromQuery] Guid?userId)
        {
            var scope = AuthenticationService.GetScope(User);

            var file = Request.Form.Files.FirstOrDefault();

            if (file == null)
            {
                return(BadRequest());
            }

            var statement = await CommissionStatementService.GetCommissionStatement(scope, commissionStatementId);

            var template = await CommissionStatementTemplateService.GetTemplate(commissionStatementTemplateId);

            string brokerFullName = null;

            if (template.BrokerSpecific)
            {
                if (!userId.HasValue)
                {
                    return(this.BadRequestMessage("UserId required for broker specific templates."));
                }

                var user = await UserService.GetUser(scope, userId.Value);

                if (user == null)
                {
                    return(this.BadRequestMessage("Invalid UserId."));
                }

                brokerFullName = $"{user.FirstName} {user.LastName}";
            }

            var config = template.Config;

            var result = new ImportResult();

            using (var stream = file.OpenReadStream())
            {
                var vatRate = await DirectoryLookupService.GetVATRate(statement.Date ?? DateTime.Now);

                var reader = new CommissionImportReader(config, vatRate, brokerFullName);
                var items  = reader.Read(stream);

                result = await CommissionImportService.ImportCommissions(scope, commissionStatementId, items);
            }

            if (result.UnknownCommissionTypeValues.Any())
            {
                using (var stream = file.OpenReadStream())
                {
                    var attachment = GetEmailAttachment(file, stream);
                    await SendUnkownCommissionTypesEmail(result, scope, commissionStatementId, template, attachment);
                }
            }

            if (!result.Results.Any(r => r.Success))
            {
                using (var stream = file.OpenReadStream())
                {
                    var attachment = GetEmailAttachment(file, stream);
                    await SendZeroEntriesEmail(scope, commissionStatementId, template, attachment);
                }
            }

            if (result.Results.Any())
            {
                using (var stream = file.OpenReadStream())
                {
                    var path = new CommissionStatementFilePath(scope.OrganisationId, commissionStatementId, file.FileName);
                    await FileStorageService.AddFileAsync(path, stream);
                }
            }

            return(Ok(result));
        }
        public async Task <IActionResult> Reimport(Guid commissionStatementId, [FromQuery] Guid commissionStatementTemplateId, [FromQuery] Guid?userId)
        {
            var scope = AuthenticationService.GetScope(User);

            var statement = await CommissionStatementService.GetCommissionStatement(scope, commissionStatementId);

            if (statement == null)
            {
                return(NotFound());
            }

            var path         = new CommissionStatementDirectoryPath(scope.OrganisationId, commissionStatementId);
            var fileInfoList = await FileStorageService.GetFileInfoListAsync(path);

            if (!fileInfoList.Any())
            {
                return(this.BadRequestMessage("Reimport failed as there are no existing statement files."));
            }

            var queryOptions = new CommissionStatementTemplateQueryOptions("", "", 0, 0);

            queryOptions.CompanyId.Add(statement.CompanyId.Value);
            queryOptions.Date = statement.Date;

            var templates = (await CommissionStatementTemplateService.GetTemplates(queryOptions)).Items;

            if (!templates.Any(t => t.Id == commissionStatementTemplateId))
            {
                return(this.BadRequestMessage("Reimport failed as the commissionStatementTemplateId is not valid."));
            }

            var template = await CommissionStatementTemplateService.GetTemplate(commissionStatementTemplateId);

            string brokerFullName = null;

            if (template.BrokerSpecific)
            {
                if (!userId.HasValue)
                {
                    return(this.BadRequestMessage("UserId required for broker specific templates."));
                }

                var user = await UserService.GetUser(scope, userId.Value);

                if (user == null)
                {
                    return(this.BadRequestMessage("Invalid UserId."));
                }

                brokerFullName = $"{user.FirstName} {user.LastName}";
            }

            await CommissionStatementService.DeleteCommissions(scope, commissionStatementId);

            var result = new ImportResult();

            foreach (var fileInfo in fileInfoList)
            {
                using (var stream = new MemoryStream())
                {
                    await FileStorageService.GetFile(fileInfo.Url, stream);

                    var vatRate = await DirectoryLookupService.GetVATRate(statement.Date ?? DateTime.Now);

                    var reader = new CommissionImportReader(template.Config, vatRate, brokerFullName);
                    var items  = reader.Read(stream);

                    result = await CommissionImportService.ImportCommissions(scope, commissionStatementId, items);

                    if (result.UnknownCommissionTypeValues.Any())
                    {
                        stream.Position = 0;
                        using (var copy = new MemoryStream())
                        {
                            await stream.CopyToAsync(copy);

                            copy.Position = 0;

                            var attachment = GetEmailAttachmentFromCloud(fileInfo, copy);
                            await SendUnkownCommissionTypesEmail(result, scope, commissionStatementId, template, attachment);
                        }
                    }

                    if (!result.Results.Any(r => r.Success))
                    {
                        stream.Position = 0;
                        using (var copy = new MemoryStream())
                        {
                            await stream.CopyToAsync(copy);

                            copy.Position = 0;

                            var attachment = GetEmailAttachmentFromCloud(fileInfo, copy);
                            await SendZeroEntriesEmail(scope, commissionStatementId, template, attachment);
                        }
                    }
                }
            }

            return(Ok(result));
        }
        public async Task GetTemplates_DateFilter()
        {
            var options = TestHelper.GetDbContext("GetTemplates_DateFilter");

            var now = DateTime.Now.Date;

            //Given
            //Start and End in scope
            var temp1 = new CommissionStatementTemplateEntity
            {
                Id             = Guid.NewGuid(),
                CompanyId      = Guid.NewGuid(),
                Name           = "Template 1",
                StartDate      = now.AddMonths(-1),
                EndDate        = now.AddMonths(1),
                BrokerSpecific = true,
                Config         = new Config()
            };

            //Old start, old end, out of scope
            var temp2 = new CommissionStatementTemplateEntity
            {
                Id             = Guid.NewGuid(),
                CompanyId      = Guid.NewGuid(),
                Name           = "Template 2",
                StartDate      = now.AddMonths(-12),
                EndDate        = now.AddMonths(-10),
                BrokerSpecific = true,
                Config         = new Config()
            };

            //Old start, no end, in scope
            var temp3 = new CommissionStatementTemplateEntity
            {
                Id             = Guid.NewGuid(),
                CompanyId      = Guid.NewGuid(),
                Name           = "Template 3",
                StartDate      = now.AddMonths(-12),
                EndDate        = null,
                BrokerSpecific = true,
                Config         = new Config()
            };

            //Future start, no end, out of scope
            var temp4 = new CommissionStatementTemplateEntity
            {
                Id             = Guid.NewGuid(),
                CompanyId      = Guid.NewGuid(),
                Name           = "Template 4",
                StartDate      = now.AddDays(1),
                EndDate        = null,
                BrokerSpecific = true,
                Config         = new Config()
            };

            //Future end, no start, in scope
            var temp5 = new CommissionStatementTemplateEntity
            {
                Id             = Guid.NewGuid(),
                CompanyId      = Guid.NewGuid(),
                Name           = "Template 5",
                StartDate      = null,
                EndDate        = now.AddMonths(1),
                BrokerSpecific = true,
                Config         = new Config()
            };

            //Old end, no start, out of scope
            var temp6 = new CommissionStatementTemplateEntity
            {
                Id             = Guid.NewGuid(),
                CompanyId      = Guid.NewGuid(),
                Name           = "Template 6",
                StartDate      = null,
                EndDate        = now.AddMonths(-5),
                BrokerSpecific = true,
                Config         = new Config()
            };

            using (var context = new DataContext(options))
            {
                context.CommissionStatementTemplate.Add(temp1);
                context.CommissionStatementTemplate.Add(temp2);
                context.CommissionStatementTemplate.Add(temp3);
                context.CommissionStatementTemplate.Add(temp4);
                context.CommissionStatementTemplate.Add(temp5);
                context.CommissionStatementTemplate.Add(temp6);

                context.SaveChanges();
            }

            using (var context = new DataContext(options))
            {
                var service = new CommissionStatementTemplateService(context, null, null);

                //When
                var queryOptions = new CommissionStatementTemplateQueryOptions("", "", 0, 0);
                queryOptions.Date = now;
                var result = await service.GetTemplates(queryOptions);

                //Then
                Assert.Equal(3, result.TotalItems);

                var templates = result.Items.ToArray();

                Assert.Equal(3, templates.Count());

                var actual = templates[0];
                Assert.Equal(temp1.Id, actual.Id);

                actual = templates[1];
                Assert.Equal(temp3.Id, actual.Id);

                actual = templates[2];
                Assert.Equal(temp5.Id, actual.Id);
            }
        }
        public async Task UpdateUnknownCommissionTypes_CommissionErrors()
        {
            var options = TestHelper.GetDbContext("UpdateUnknownCommissionTypes_CommissionErrors");

            var user1   = TestHelper.InsertUserDetailed(options);
            var company = TestHelper.InsertCompany(options);

            var commissionType1 = TestHelper.InsertCommissionType(options);
            var commissionType2 = TestHelper.InsertCommissionType(options);

            var template1 = new CommissionStatementTemplateEntity
            {
                Id        = Guid.NewGuid(),
                CompanyId = company.Id,
                Config    = new Config()
                {
                    Sheets = new List <Sheet>()
                    {
                        new Sheet()
                        {
                            Config = new SheetConfig()
                            {
                                CommissionTypes = new CommissionTypes()
                                {
                                    Types = new List <CommissionType>()
                                    {
                                        new CommissionType()
                                        {
                                            CommissionTypeCode = commissionType1.Code, Value = "abc"
                                        },
                                        new CommissionType()
                                        {
                                            CommissionTypeCode = commissionType2.Code, Value = "xyz"
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            };

            var statement1 = new CommissionStatementEntity
            {
                Id        = Guid.NewGuid(),
                CompanyId = company.Id,
            };

            var statement2 = new CommissionStatementEntity
            {
                Id        = Guid.NewGuid(),
                CompanyId = Guid.NewGuid(),
            };

            var commission1 = new CommissionErrorEntity
            {
                Id = Guid.NewGuid(),
                CommissionTypeId      = OneAdvisor.Model.Commission.Model.Lookup.CommissionType.COMMISSION_TYPE_UNKNOWN_ID,
                CommissionStatementId = statement1.Id,
                Data = new ImportCommission()
                {
                    CommissionTypeValue = "abc"
                }
            };

            var commission2 = new CommissionErrorEntity
            {
                Id = Guid.NewGuid(),
                CommissionTypeId      = Guid.NewGuid(),
                CommissionStatementId = statement1.Id,
                Data = new ImportCommission()
                {
                    CommissionTypeValue = "abc"
                }
            };

            var commission3 = new CommissionErrorEntity
            {
                Id = Guid.NewGuid(),
                CommissionTypeId      = OneAdvisor.Model.Commission.Model.Lookup.CommissionType.COMMISSION_TYPE_UNKNOWN_ID,
                CommissionStatementId = statement1.Id,
                Data = new ImportCommission()
                {
                    CommissionTypeValue = "xyz"
                }
            };

            //Different company
            var commission4 = new CommissionErrorEntity
            {
                Id = Guid.NewGuid(),
                CommissionTypeId      = OneAdvisor.Model.Commission.Model.Lookup.CommissionType.COMMISSION_TYPE_UNKNOWN_ID,
                CommissionStatementId = statement2.Id,
                Data = new ImportCommission()
                {
                    CommissionTypeValue = "abc"
                }
            };

            using (var context = new DataContext(options))
            {
                context.CommissionStatementTemplate.Add(template1);

                context.CommissionStatement.Add(statement1);

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

                context.SaveChanges();
            }

            using (var context = new DataContext(options))
            {
                List <CommissionErrorEntity> updatedCommissionErrors = null;

                var bulkActions = new Mock <IBulkActions>(MockBehavior.Strict);
                bulkActions.Setup(c => c.BulkUpdateCommissionErrorsAsync(It.IsAny <DataContext>(), It.IsAny <IList <CommissionErrorEntity> >()))
                .Callback((DataContext dc, IList <CommissionErrorEntity> errors) =>
                {
                    updatedCommissionErrors = errors.ToList();
                })
                .Returns(Task.CompletedTask);

                var service = new CommissionStatementTemplateService(context, null, bulkActions.Object);

                //When
                await service.UpdateUnknownCommissionTypes(template1.Id);

                //Then
                Assert.Equal(2, updatedCommissionErrors.Count);
                Assert.Equal(commission1.Id, updatedCommissionErrors[0].Id);
                Assert.Equal(commissionType1.Id, updatedCommissionErrors[0].CommissionTypeId);
                Assert.Equal(commissionType1.Code, updatedCommissionErrors[0].Data.CommissionTypeCode);

                Assert.Equal(commission3.Id, updatedCommissionErrors[1].Id);
                Assert.Equal(commissionType2.Id, updatedCommissionErrors[1].CommissionTypeId);
                Assert.Equal(commissionType2.Code, updatedCommissionErrors[1].Data.CommissionTypeCode);
            }
        }
        public async Task GetDefaultConfig()
        {
            var options = TestHelper.GetDbContext("GetDefaultConfig");

            var ct1 = new CommissionTypeEntity
            {
                Id   = Guid.NewGuid(),
                Name = "Type 1",
                Code = "type_1"
            };

            var ct2 = new CommissionTypeEntity
            {
                Id   = Guid.NewGuid(),
                Name = "Type 2",
                Code = "type_2"
            };

            using (var context = new DataContext(options))
            {
                context.CommissionType.Add(ct1);
                context.CommissionType.Add(ct2);

                context.SaveChanges();
            }

            using (var context = new DataContext(options))
            {
                var lookupService = new CommissionLookupService(context);
                var service       = new CommissionStatementTemplateService(context, lookupService, null);

                //When
                var config = await service.GetDefaultConfig();

                var sheetConfig = config.Sheets.Single().Config;

                //Then
                Assert.Equal("", sheetConfig.HeaderIdentifier.Column);
                Assert.Equal("", sheetConfig.HeaderIdentifier.Value);

                var importCommissionProps = typeof(ImportCommission).GetProperties();
                var fields = sheetConfig.Fields.ToList();
                Assert.Equal(importCommissionProps.Count() - 4, fields.Count()); //minus 4 for Id, Currency, CommissionTypeValue and CommissionTypeCode
                Assert.Equal("PolicyNumber", fields[0].Name);
                Assert.Equal("A", fields[0].Column);
                Assert.Equal("AmountIncludingVAT", fields[1].Name);
                Assert.Equal("B", fields[1].Column);
                Assert.Equal("VAT", fields[2].Name);
                Assert.Equal("C", fields[2].Column);
                Assert.Equal("LastName", fields[3].Name);
                Assert.Equal("E", fields[3].Column);
                Assert.Equal("DateOfBirth", fields[4].Name);
                Assert.Equal("F", fields[4].Column);
                Assert.Equal("FirstName", fields[5].Name);
                Assert.Equal("G", fields[5].Column);
                Assert.Equal("IdNumber", fields[6].Name);
                Assert.Equal("H", fields[6].Column);
                Assert.Equal("Initials", fields[7].Name);
                Assert.Equal("I", fields[7].Column);
                Assert.Equal("FullName", fields[8].Name);
                Assert.Equal("J", fields[8].Column);
                Assert.Equal("BrokerFullName", fields[9].Name);
                Assert.Equal("K", fields[9].Column);

                Assert.Equal("D", sheetConfig.CommissionTypes.MappingTemplate);
                Assert.Equal("unknown", sheetConfig.CommissionTypes.DefaultCommissionTypeCode);
                var types = sheetConfig.CommissionTypes.Types.ToList();
                Assert.Equal("type_1", types[0].CommissionTypeCode);
                Assert.Equal("type_1", types[0].Value);
                Assert.Equal("type_2", types[1].CommissionTypeCode);
                Assert.Equal("type_2", types[1].Value);
            }
        }
        public async Task GetTemplates()
        {
            var options = TestHelper.GetDbContext("GetTemplates");

            //Given
            var temp1 = new CommissionStatementTemplateEntity
            {
                Id             = Guid.NewGuid(),
                CompanyId      = Guid.NewGuid(),
                Name           = "Template 1",
                StartDate      = DateTime.Now.AddDays(-1),
                EndDate        = DateTime.Now.AddDays(1),
                BrokerSpecific = true,
                Config         = new Config()
            };

            var temp2 = new CommissionStatementTemplateEntity
            {
                Id             = Guid.NewGuid(),
                CompanyId      = Guid.NewGuid(),
                Name           = "Template 2",
                BrokerSpecific = false,
                StartDate      = DateTime.Now.AddDays(-1),
                EndDate        = DateTime.Now.AddDays(1),
                Config         = new Config()
            };

            using (var context = new DataContext(options))
            {
                context.CommissionStatementTemplate.Add(temp1);
                context.CommissionStatementTemplate.Add(temp2);

                context.SaveChanges();
            }

            using (var context = new DataContext(options))
            {
                var service = new CommissionStatementTemplateService(context, null, null);

                //When
                var queryOptions = new CommissionStatementTemplateQueryOptions("", "", 0, 0);
                var actual       = await service.GetTemplates(queryOptions);

                //Then
                Assert.Equal(2, actual.TotalItems);

                var templates = actual.Items.ToArray();

                Assert.Equal(2, templates.Count());

                var actual1 = templates[0];
                Assert.Equal(temp1.Id, actual1.Id);
                Assert.Equal(temp1.Name, actual1.Name);
                Assert.Equal(temp1.CompanyId, actual1.CompanyId);
                Assert.Equal(temp1.StartDate, actual1.StartDate);
                Assert.Equal(temp1.EndDate, actual1.EndDate);
                Assert.Equal(temp1.BrokerSpecific, actual1.BrokerSpecific);

                var actual2 = templates[1];
                Assert.Equal(temp2.Id, actual2.Id);
                Assert.Equal(temp2.Name, actual2.Name);
                Assert.Equal(temp2.CompanyId, actual2.CompanyId);
                Assert.Equal(temp2.StartDate, actual2.StartDate);
                Assert.Equal(temp2.EndDate, actual2.EndDate);
                Assert.Equal(temp2.BrokerSpecific, actual2.BrokerSpecific);
            }
        }