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