public async Task HandleAsync_UserIsNotAuthorized_ThrowsSecurityException_AndDoesNotUseDataAccess() { A.CallTo(() => authorization.EnsureCanAccessInternalArea()).Throws <SecurityException>(); await Assert.ThrowsAsync <SecurityException>(() => Handler().HandleAsync(A.Dummy <GetAatfAeActiveComplianceYears>())); A.CallTo(() => dataAccess.Get()).MustNotHaveHappened(); }
public AuthorizationBuilder AllowInternalAreaAccess() { A.CallTo(() => fake.EnsureCanAccessInternalArea()).DoesNothing(); A.CallTo(() => fake.EnsureCanAccessInternalArea(A <bool> ._)).DoesNothing(); A.CallTo(() => fake.CheckCanAccessInternalArea()).Returns(true); A.CallTo(() => fake.CheckCanAccessInternalArea(A <bool> ._)).Returns(true); return(this); }
public async Task <SchemeData> HandleAsync(GetSchemeById request) { authorization.EnsureCanAccessInternalArea(); var scheme = await dataAccess.GetSchemeOrDefault(request.SchemeId); if (scheme == null) { string message = string.Format("No scheme was found with id \"{0}\".", request.SchemeId); throw new ArgumentException(message); } var schemeData = mapper.Map <Scheme, SchemeData>(scheme); var complianceYearsWithSubmittedMemberUploads = await dataAccess.GetComplianceYearsWithSubmittedMemberUploads(request.SchemeId); var complianceYearsWithSubmittedDataReturns = await dataAccess.GetComplianceYearsWithSubmittedDataReturns(request.SchemeId); var schemeDownloadsByYears = mapper.Map <Core.Scheme.SchemeDataAvailability>( Domain.Scheme.SchemeDataAvailability.Create( complianceYearsWithSubmittedMemberUploads, complianceYearsWithSubmittedDataReturns)); schemeData.SchemeDataAvailability = schemeDownloadsByYears; schemeData.CanEdit = authorization.CheckUserInRole(Roles.InternalAdmin); return(schemeData); }
public async Task <ManagePendingCharges> HandleAsync(Requests.Charges.FetchPendingCharges message) { authorization.EnsureCanAccessInternalArea(true); UKCompetentAuthority authority = await dataAccess.FetchCompetentAuthority(message.Authority); IReadOnlyList <MemberUpload> memberUploads = await dataAccess.FetchSubmittedNonInvoicedMemberUploadsAsync(authority); var groups = memberUploads.GroupBy(mu => new { mu.Scheme, mu.ComplianceYear }); List <PendingCharge> pendingCharges = new List <PendingCharge>(); foreach (var group in groups) { PendingCharge pendingCharge = new PendingCharge() { SchemeName = group.Key.Scheme.SchemeName, SchemeApprovalNumber = group.Key.Scheme.ApprovalNumber, ComplianceYear = group.Key.ComplianceYear.Value, TotalGBP = group.Sum(p => p.TotalCharges), SubmittedDate = group.FirstOrDefault().SubmittedDate.Value }; pendingCharges.Add(pendingCharge); } var managePendingCharges = new ManagePendingCharges { PendingCharges = pendingCharges, CanUserIssueCharges = authorization.CheckUserInRole(Roles.InternalAdmin) }; return(managePendingCharges); }
public async Task <Guid> HandleAsync(UpdateUser query) { authorization.EnsureCanAccessInternalArea(); authorization.EnsureUserInRole(Roles.InternalAdmin); var user = await userManager.FindByIdAsync(query.UserId); if (user == null) { throw new ArgumentException(string.Format("Could not find a user with id {0}", query.UserId)); } user.FirstName = query.FirstName; user.Surname = query.LastName; var result = await userManager.UpdateAsync(user); if (!result.Succeeded) { string message = "User update failed."; throw new Exception(message); } return(new Guid(user.Id)); }
public async Task <List <SchemeData> > HandleAsync(GetMemberRegistrationSchemesByComplianceYear request) { authorization.EnsureCanAccessInternalArea(); Func <Scheme, bool> filter; switch (request.Filter) { case FilterType.Approved: filter = s => s.SchemeStatus == SchemeStatus.Approved; break; case FilterType.ApprovedOrWithdrawn: filter = s => (s.SchemeStatus == SchemeStatus.Approved) || (s.SchemeStatus == SchemeStatus.Withdrawn); break; default: throw new NotSupportedException(); } List <string> schemes = await schemeDataAccess.GetMemberRegistrationSchemesByComplianceYear(request.ComplianceYear); return(context.Schemes .Where(t => schemes.Contains(t.SchemeName)) .Where(filter) .OrderBy(s => s.SchemeName) .Select(s => schemeMap.Map(s)) .ToList()); }
public async Task <CSVFileData> HandleAsync(GetUkNonObligatedWeeeReceivedDataCsv request) { authorization.EnsureCanAccessInternalArea(); if (request.ComplianceYear == 0) { var message = $"Compliance year cannot be \"{request.ComplianceYear}\"."; throw new ArgumentException(message); } var items = await context.StoredProcedures.GetUkNonObligatedWeeeReceivedByComplianceYear(request.ComplianceYear); var csvWriter = csvWriterFactory.Create <UkNonObligatedWeeeReceivedData>(); csvWriter.DefineColumn(ReportConstants.QuarterColumnHeading, i => i.Quarter); csvWriter.DefineColumn(ReportConstants.CategoryColumnHeading, i => i.Category); csvWriter.DefineColumn(ReportConstants.NonObligatedColumnHeading, i => i.TotalNonObligatedWeeeReceived); csvWriter.DefineColumn(ReportConstants.NonObligatedDcfColumnHeading, i => i.TotalNonObligatedWeeeReceivedFromDcf); var fileContent = csvWriter.Write(items); var fileName = $"{request.ComplianceYear}_UK non-obligated WEEE received at AATFs_{SystemTime.UtcNow:ddMMyyyy_HHmm}.csv"; return(new CSVFileData { FileContent = fileContent, FileName = fileName }); }
public async Task <CSVFileData> HandleAsync(FetchInvoiceRunCsv message) { authorization.EnsureCanAccessInternalArea(); var items = await context.StoredProcedures.SpgInvoiceRunChargeBreakdown(message.InvoiceRunId); var csvWriter = csvWriterFactory.Create <PCSChargesCSVData>(); csvWriter.DefineColumn(@"Scheme name", i => i.SchemeName); csvWriter.DefineColumn(@"Compliance year", i => i.ComplianceYear); csvWriter.DefineColumn(@"Submission date and time (GMT)", i => i.SubmissionDate.ToString("dd/MM/yyyy HH:mm:ss")); csvWriter.DefineColumn(@"Producer name", i => i.ProducerName); csvWriter.DefineColumn(@"PRN", i => i.PRN); csvWriter.DefineColumn(@"Charge value (GBP)", i => i.ChargeValue); csvWriter.DefineColumn(@"Charge band", i => i.ChargeBandType); csvWriter.DefineColumn(@"Reg. Off. or PPoB country", i => i.RegOfficeOrPBoBCountry); csvWriter.DefineColumn(@"Includes annual charge", i => i.HasAnnualCharge); string fileContent = csvWriter.Write(items); var invoiceRun = await commonDataAccess.FetchInvoiceRunAsync(message.InvoiceRunId); string fileName = string.Format("invoicerun_{0}_{1}.csv", invoiceRun.CompetentAuthority.Abbreviation, invoiceRun.IssuedDate.ToString("ddMMyyyy")); return(new CSVFileData { FileContent = fileContent, FileName = fileName }); }
public async Task <List <SchemeData> > HandleAsync(Requests.Admin.GetSchemes request) { authorization.EnsureCanAccessInternalArea(); List <Scheme> schemes = await dataAccess.GetSchemes(); Func <Scheme, bool> filter; switch (request.Filter) { case Requests.Admin.GetSchemes.FilterType.Approved: filter = s => s.SchemeStatus == SchemeStatus.Approved; break; case Requests.Admin.GetSchemes.FilterType.ApprovedOrWithdrawn: filter = s => (s.SchemeStatus == SchemeStatus.Approved) || (s.SchemeStatus == SchemeStatus.Withdrawn); break; default: throw new NotSupportedException(); } return(schemes .Where(filter) .OrderBy(s => s.SchemeName) .Select(s => schemeMap.Map(s)) .ToList()); }
public async Task <Guid> HandleAsync(UpdateCompetentAuthorityUserRoleAndStatus query) { authorization.EnsureCanAccessInternalArea(); authorization.EnsureUserInRole(Roles.InternalAdmin); var competentAuthorityUser = await dataAccess.GetCompetentAuthorityUser(query.Id); if (competentAuthorityUser == null) { string message = string.Format( "No competent authority user was found with ID \"{0}\".", query.Id); throw new InvalidOperationException(message); } if (userContext != null && userContext.UserId.ToString() == competentAuthorityUser.UserId) { throw new InvalidOperationException(string.Format("Error for user with Id '{0}': Users cannot change their own status or role", userContext.UserId)); } var role = await dataAccess.GetRoleOrDefaultAsync(query.RoleName); if (role == null) { throw new InvalidOperationException(string.Format("Invalid role name {0}", query.RoleName)); } await dataAccess.UpdateUserRoleAndStatus(competentAuthorityUser, role, query.UserStatus); return(competentAuthorityUser.CompetentAuthorityId); }
public async Task <List <LocalAreaData> > HandleAsync(GetLocalAreas query) { authorization.EnsureCanAccessInternalArea(); var localareas = await context.LocalAreas.OrderBy(c => c.Name).ToListAsync(); return(localareas.Select(mapper.Map).ToList()); }
public async Task <IList <PanAreaData> > HandleAsync(GetPanAreas message) { authorization.EnsureCanAccessInternalArea(); var panareas = await context.PanAreas.OrderBy(c => c.Name).ToArrayAsync(); return(panareas.Select(mapper.Map).ToArray()); }
public async Task <bool> HandleAsync(IsProducerRegisteredForComplianceYear request) { authorization.EnsureCanAccessInternalArea(); var producerRegistrations = await registeredProducerDataAccess.GetProducerRegistrations(request.RegistrationNumber, request.ComplianceYear); return(producerRegistrations.Any()); }
public async Task <bool> HandleAsync(CheckApprovalNumberIsUnique message) { authorization.EnsureCanAccessInternalArea(); authorization.EnsureUserInRole(Roles.InternalAdmin); var existing = await dataAccess.FetchByApprovalNumber(message.ApprovalNumber, message.ComplianceYear); return(existing != null); }
public async Task <CanApprovalDateBeChangedFlags> HandleAsync(CheckAatfApprovalDateChange message) { authorization.EnsureCanAccessInternalArea(); authorization.EnsureUserInRole(Roles.InternalAdmin); var aatf = await aatfDataAccess.GetDetails(message.AatfId); return(await getAatfApprovalDateChangeStatus.Validate(aatf, message.NewApprovalDate)); }
public async Task <CSVFileData> HandleAsync(GetDataReturnSubmissionEeeChangesCsv message) { authorization.EnsureCanAccessInternalArea(); var changes = await dataAccess.GetChanges(message.CurrentDataReturnVersionId, message.PreviousDataReturnVersionId); csvWriter.DefineColumn("Producer name", i => i.ProducerName); csvWriter.DefineColumn("PRN", i => i.ProducerRegistrationNumber); csvWriter.DefineColumn("Compliance year", i => i.ComplianceYear); csvWriter.DefineColumn("Date / Time (GMT) of submission", i => i.SubmissionDate); csvWriter.DefineColumn("Quarter", i => i.Quarter); csvWriter.DefineColumn("Change type", i => i.ChangeType); csvWriter.DefineColumn("Cat1 B2C (t)", i => i.Cat1B2C); csvWriter.DefineColumn("Cat2 B2C (t)", i => i.Cat2B2C); csvWriter.DefineColumn("Cat3 B2C (t)", i => i.Cat3B2C); csvWriter.DefineColumn("Cat4 B2C (t)", i => i.Cat4B2C); csvWriter.DefineColumn("Cat5 B2C (t)", i => i.Cat5B2C); csvWriter.DefineColumn("Cat6 B2C (t)", i => i.Cat6B2C); csvWriter.DefineColumn("Cat7 B2C (t)", i => i.Cat7B2C); csvWriter.DefineColumn("Cat8 B2C (t)", i => i.Cat8B2C); csvWriter.DefineColumn("Cat9 B2C (t)", i => i.Cat9B2C); csvWriter.DefineColumn("Cat10 B2C (t)", i => i.Cat10B2C); csvWriter.DefineColumn("Cat11 B2C (t)", i => i.Cat11B2C); csvWriter.DefineColumn("Cat12 B2C (t)", i => i.Cat12B2C); csvWriter.DefineColumn("Cat13 B2C (t)", i => i.Cat13B2C); csvWriter.DefineColumn("Cat14 B2C (t)", i => i.Cat14B2C); csvWriter.DefineColumn("Cat1 B2B (t)", i => i.Cat1B2B); csvWriter.DefineColumn("Cat2 B2B (t)", i => i.Cat2B2B); csvWriter.DefineColumn("Cat3 B2B (t)", i => i.Cat3B2B); csvWriter.DefineColumn("Cat4 B2B (t)", i => i.Cat4B2B); csvWriter.DefineColumn("Cat5 B2B (t)", i => i.Cat5B2B); csvWriter.DefineColumn("Cat6 B2B (t)", i => i.Cat6B2B); csvWriter.DefineColumn("Cat7 B2B (t)", i => i.Cat7B2B); csvWriter.DefineColumn("Cat8 B2B (t)", i => i.Cat8B2B); csvWriter.DefineColumn("Cat9 B2B (t)", i => i.Cat9B2B); csvWriter.DefineColumn("Cat10 B2B (t)", i => i.Cat10B2B); csvWriter.DefineColumn("Cat11 B2B (t)", i => i.Cat11B2B); csvWriter.DefineColumn("Cat12 B2B (t)", i => i.Cat12B2B); csvWriter.DefineColumn("Cat13 B2B (t)", i => i.Cat13B2B); csvWriter.DefineColumn("Cat14 B2B (t)", i => i.Cat14B2B); var fileContent = csvWriter.Write(changes.CsvData); var fileName = string.Format("{0}_Q{1}_{2}_EEEDataChanges_{3:ddMMyyyy_HHmm}.csv", changes.ComplianceYear, changes.Quarter, changes.SchemeApprovalNumber, changes.CurrentSubmissionDate); return(new CSVFileData { FileContent = fileContent, FileName = fileName }); }
public async Task <List <SchemeData> > HandleAsync(GetSchemes message) { authorization.EnsureCanAccessInternalArea(); var schemes = await dataAccess.GetCompleteSchemes(); return(schemes.Select(s => schemeMap.Map(s)) .OrderBy(sd => sd.Name) .ToList()); }
public async Task <List <AatfSubmissionHistoryData> > HandleAsync(GetAatfSubmissionHistory message) { authorization.EnsureCanAccessInternalArea(); var submissionHistoryItems = await getAatfSubmissionHistoryDataAccess.GetItemsAsync(message.AatfId); return(submissionHistoryItems.Select(s => mapper.Map <AatfSubmissionHistory, AatfSubmissionHistoryData>(s)).OrderByDescending(s => s.ComplianceYear) .ThenByDescending(s => s.Quarter) .ThenByDescending(s => s.SubmittedDate) .ToList()); }
public async Task <List <Role> > HandleAsync(GetRoles message) { authorization.EnsureCanAccessInternalArea(); authorization.EnsureUserInRole(Roles.InternalAdmin); return(await weeeContext.Roles .Select(r => new Role { Name = r.Name, Description = r.Description }) .ToListAsync()); }
public async Task <CSVFileData> HandleAsync(GetAatfObligatedData request) { authorization.EnsureCanAccessInternalArea(); if (request.ComplianceYear == 0) { var message = $"Compliance year cannot be \"{request.ComplianceYear}\"."; throw new ArgumentException(message); } var aatf = await aatfDataAccess.GetAatfById(request.AatfId); var obligatedData = await weeContext.StoredProcedures.GetAatfObligatedCsvData(request.ReturnId, request.ComplianceYear, request.Quarter, request.AatfId); //Remove the Id columns if (obligatedData != null) { if (obligatedData.Columns.Contains("AatfId")) { obligatedData.Columns.Remove("AatfId"); } if (obligatedData.Columns.Contains("ReturnId")) { obligatedData.Columns.Remove("ReturnId"); } if (obligatedData.Columns.Contains("Q")) { obligatedData.Columns.Remove("Q"); } if (obligatedData.Columns.Contains("CategoryId")) { obligatedData.Columns.Remove("CategoryId"); } if (obligatedData.Columns.Contains("TonnageType")) { obligatedData.Columns.Remove("TonnageType"); } } var fileName = string.Format("{1}_{2}_{4}_Full data_{3:ddMMyyyy}_{3:HHmm}.csv", aatf.Name, request.ComplianceYear, (QuarterType)request.Quarter, SystemTime.UtcNow, aatf.ApprovalNumber); string fileContent = DataTableCsvHelper.DataTableToCsv(obligatedData); return(new CSVFileData { FileContent = fileContent, FileName = fileName }); }
public async Task<List<SchemeData>> HandleAsync(Requests.Admin.GetSchemesByOrganisationId request) { authorization.EnsureCanAccessInternalArea(); List<Scheme> schemes = await dataAccess.GetSchemes(); return schemes .Where(s => s.OrganisationId == request.OrganisationId && s.SchemeStatus.Value != (int)SchemeStatus.Pending) .OrderBy(s => s.SchemeName) .Select(s => schemeMap.Map(s)) .ToList(); }
public async Task <List <AatfDataList> > HandleAsync(GetAatfsByOrganisationId message) { authorization.EnsureCanAccessInternalArea(); var aatfs = await dataAccess.GetAatfs(); return(aatfs .OrderBy(a => a.Name) .Where(s => s.Organisation.Id == message.OrganisationId) .Select(s => aatfmap.Map(s)) .ToList()); }
public async void WhenUserIsUnauthorised_ShouldNotGetProducerRegistrations() { A.CallTo(() => weeeAuthorization.EnsureCanAccessInternalArea()) .Throws <SecurityException>(); var request = new IsProducerRegisteredForComplianceYear("ABC12345", 2016); await Assert.ThrowsAsync <SecurityException>(() => IsProducerRegisteredForComplianceYearHandler().HandleAsync(request)); A.CallTo(() => registeredProducerDataAccess.GetProducerRegistration(A <Guid> ._)) .MustNotHaveHappened(); }
public async Task <AatfContactData> HandleAsync(GetAatfContact message) { authorization.EnsureCanAccessInternalArea(); var contact = await dataAccess.GetContact(message.AatfId); var result = mapper.Map(contact); result.CanEditContactDetails = authorization.CheckUserInRole(Roles.InternalAdmin); return(result); }
public async Task <AatfDeletionData> HandleAsync(CheckAatfCanBeDeleted message) { authorization.EnsureCanAccessInternalArea(); authorization.EnsureUserInRole(Roles.InternalAdmin); var aatf = await aatfDataAccess.GetDetails(message.AatfId); var aatfDeletion = await getAatfDeletionStatus.Validate(aatf.Id); var organisationDeletion = await getOrganisationDeletionStatus.Validate(aatf.Organisation.Id, aatf.ComplianceYear, aatf.FacilityType); return(new AatfDeletionData(organisationDeletion, aatfDeletion)); }
public async Task <IReadOnlyList <SchemeData> > HandleAsync(Requests.Charges.FetchSchemesWithInvoices message) { authorization.EnsureCanAccessInternalArea(); UKCompetentAuthority authority = await dataAccess.FetchCompetentAuthority(message.Authority); IEnumerable <MemberUpload> invoicedMemberUploads = await dataAccess.FetchInvoicedMemberUploadsAsync(authority); return(invoicedMemberUploads .GroupBy(s => new { s.Scheme.Id, s.Scheme.SchemeName, s.Scheme }) .Select(s => schemeMap.Map(s.Key.Scheme)) .OrderBy(x => x.SchemeName).ToList()); }
public async Task <Core.Shared.UserStatus> HandleAsync(GetAdminUserStatus request) { authorization.EnsureCanAccessInternalArea(false); var adminUser = await dataAccess.GetAdminUserOrDefault(new Guid(request.UserId)); if (adminUser == null) { string message = string.Format("No user was found with id \"{0}\".", request.UserId); throw new ArgumentException(message); } return(userMap.Map(adminUser.UserStatus)); }
public async Task <bool> HandleAsync(CompleteOrganisationAdmin message) { authorization.EnsureCanAccessInternalArea(); authorization.EnsureUserInRole(Roles.InternalAdmin); Organisation organisation = await dataAccess.FetchOrganisationAsync(message.OrganisationId); organisation.OrganisationStatus = OrganisationStatus.Complete; await dataAccess.SaveAsync(); return(true); }
public async Task <CSVFileData> HandleAsync(GetProducerPublicRegisterCSV request) { authorization.EnsureCanAccessInternalArea(); if (request.ComplianceYear == 0) { string message = string.Format("Compliance year cannot be \"{0}\".", request.ComplianceYear); throw new ArgumentException(message); } var items = await context.StoredProcedures.SpgProducerPublicRegisterCSVDataByComplianceYear( request.ComplianceYear); CsvWriter <ProducerPublicRegisterCSVData> csvWriter = csvWriterFactory.Create <ProducerPublicRegisterCSVData>(); csvWriter.DefineColumn(@"Producer name", i => i.ProducerName); csvWriter.DefineColumn(@"Producer trading name", i => i.TradingName); csvWriter.DefineColumn(@"Obligation type", i => i.ObligationType); csvWriter.DefineColumn(@"Registered office address / principal place of business", i => !string.IsNullOrEmpty(i.CompanyName) ? ConcatAddress(new[] { i.ROAPrimaryName, i.ROASecondaryName, i.ROAStreet, i.ROATown, i.ROALocality, i.ROAAdministrativeArea, i.ROACountry, i.ROAPostCode }) : ConcatAddress(new[] { i.PPOBPrimaryName, i.PPOBSecondaryName, i.PPOBStreet, i.PPOBTown, i.PPOBLocality, i.PPOBAdministrativeArea, i.PPOBCountry, i.PPOBPostcode })); csvWriter.DefineColumn(@"Registered office phone number", i => !string.IsNullOrEmpty(i.CompanyName) ? i.ROATelephone : string.Empty, true); csvWriter.DefineColumn(@"Registered office email address", i => !string.IsNullOrEmpty(i.CompanyName) ? i.ROAEmail : string.Empty); csvWriter.DefineColumn(@"Producer registration number (PRN)", i => i.PRN); csvWriter.DefineColumn(@"Producer compliance scheme (PCS) name", i => i.SchemeName); csvWriter.DefineColumn(@"PCS operator name", i => i.SchemeOperator); csvWriter.DefineColumn(@"PCS registered office", i => ConcatAddress(new[] { i.CSROAAddress1, i.CSROAAddress2, i.CSROATownOrCity, i.CSROACountyOrRegion, i.CSROACountry, i.CSROAPostcode })); csvWriter.DefineColumn(@"Overseas producer name and address", i => ConcatAddress(new[] { i.OPNAName, i.OPNAPrimaryName, i.OPNASecondaryName, i.OPNAStreet, i.OPNATown, i.OPNALocality, i.OPNAAdministrativeArea, i.OPNACountry, i.OPNAPostCode })); csvWriter.DefineColumn(@"Compliance year", i => i.ComplianceYear.ToString()); string fileContent = csvWriter.Write(items); var fileName = string.Format("{0}_producerpublicregister_{1:ddMMyyyy_HHmm}.csv", request.ComplianceYear, DateTime.UtcNow); return(new CSVFileData { FileContent = fileContent, FileName = fileName }); }
public async Task <CSVFileData> HandleAsync(GetPcsAatfComparisonData request) { authorization.EnsureCanAccessInternalArea(); if (request.ComplianceYear == 0) { var message = $"Compliance year cannot be \"{request.ComplianceYear}\"."; throw new ArgumentException(message); } var items = await context.StoredProcedures.GetPcsAatfComparisonDataCsvData(request.ComplianceYear, request.Quarter, request.ObligationType); var csvWriter = csvWriterFactory.Create <PcsAatfComparisonDataCsvData>(); csvWriter.DefineColumn(@"Compliance year", i => i.ComplianceYear); csvWriter.DefineColumn(@"Quarter", i => i.QuarterValue); csvWriter.DefineColumn(@"Obligation type", i => i.ObligationType); csvWriter.DefineColumn(@"Category", i => i.Category); csvWriter.DefineColumn(@"PCS name", i => i.SchemeNameValue); csvWriter.DefineColumn(@"PCS approval number", i => i.PcsApprovalNumber); csvWriter.DefineColumn(@"PCS appropriate authority", i => i.PcsAbbreviation); csvWriter.DefineColumn(@"AATF name", i => i.AatfName); csvWriter.DefineColumn(@"AATF approval number", i => i.AatfApprovalNumber); csvWriter.DefineColumn(@"AATF appropriate authority", i => i.AatfAbbreviation); csvWriter.DefineColumn(@"PCS report (t)", i => i.PcsTonnage); csvWriter.DefineColumn(@"AATF report(t)", i => i.AatfTonnage); csvWriter.DefineColumn(@"Discrepancy between PCS and AATF reports (t)", i => i.DifferenceTonnage); var fileContent = csvWriter.Write(items); var fileNameParameters = string.Empty; if (request.Quarter != null) { fileNameParameters += $"_Q{request.Quarter}"; } if (!string.IsNullOrWhiteSpace(request.ObligationType)) { fileNameParameters += $"_{request.ObligationType}"; } var fileName = $"{request.ComplianceYear}{fileNameParameters}_PCS v AATF WEEE data comparison_{SystemTime.UtcNow:ddMMyyyy_HHmm}.csv"; return(new CSVFileData { FileContent = fileContent, FileName = fileName }); }