Excel export

This commit is contained in:
2024-09-29 21:01:35 +03:00
parent e8fd8523aa
commit 188a5a14d3
16 changed files with 411 additions and 10 deletions

View File

@@ -61,4 +61,6 @@ public class ApplicantModel
/// <inheritdoc cref="Applicant.IsNonResident" />
[Required]
public bool IsNonResident { get; set; }
public override string ToString() => Name.ToString();
}

View File

@@ -16,4 +16,6 @@ public class NameModel
[MaxLength(ConfigurationConstraints.NameLength)]
public string? Patronymic { get; set; }
public override string ToString() => $"{FirstName} {Surname} {Patronymic}".TrimEnd();
}

View File

@@ -23,5 +23,9 @@ public interface IVisaApplicationRequestsHandler
/// Sets application status to closed
Task HandleCloseRequestAsync(Guid applicationId, CancellationToken cancellationToken);
/// Sets application status to approved or rejected
Task SetApplicationStatusFromAuthorityAsync(Guid applicationId, AuthorityRequestStatuses status, CancellationToken cancellationToken);
/// Returns stream with file with formatted application data to download
Task<Stream> ApplicationToStreamAsync(Guid applicationId, CancellationToken cancellationToken);
}

View File

@@ -17,7 +17,8 @@ public class VisaApplicationRequestsHandler(
IUnitOfWork unitOfWork,
IMapper mapper,
IDateTimeProvider dateTimeProvider,
IUserIdProvider userIdProvider) : IVisaApplicationRequestsHandler
IUserIdProvider userIdProvider,
IEntityWriter entityWriter) : IVisaApplicationRequestsHandler
{
async Task<List<VisaApplicationPreview>> IVisaApplicationRequestsHandler.GetPendingAsync(CancellationToken cancellationToken)
{
@@ -34,7 +35,8 @@ public class VisaApplicationRequestsHandler(
return mapper.Map<List<VisaApplicationPreview>>(visaApplications);
}
async Task<VisaApplicationModel> IVisaApplicationRequestsHandler.GetApplicationForApplicantAsync(Guid id, CancellationToken cancellationToken)
/// <summary> <inheritdoc cref="IVisaApplicationRequestsHandler.GetApplicationForApplicantAsync"/> </summary>
public async Task<VisaApplicationModel> GetApplicationForApplicantAsync(Guid id, CancellationToken cancellationToken)
{
var applicant = await applicants.FindByUserIdAsync(userIdProvider.GetUserId(), cancellationToken);
var application = await applications.GetByApplicantAndApplicationIdAsync(applicant.Id, id, cancellationToken);
@@ -104,4 +106,10 @@ public class VisaApplicationRequestsHandler(
await unitOfWork.SaveAsync(cancellationToken);
}
async Task<Stream> IVisaApplicationRequestsHandler.ApplicationToStreamAsync(Guid applicationId, CancellationToken cancellationToken)
{
var application = await GetApplicationForApplicantAsync(applicationId, cancellationToken);
return await entityWriter.WriteEntityToStream(application, cancellationToken);
}
}

View File

@@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations;
using System.Text;
using ApplicationLayer.Services.Applicants.Models;
using Domains.VisaApplicationDomain;
@@ -33,8 +34,7 @@ public class VisaApplicationModel
/// <inheritdoc cref="VisaApplication.PermissionToDestCountry" />
public PermissionToDestCountryModel? PermissionToDestCountry { get; set; }
[Required]
public List<PastVisitModel> PastVisits { get; set; } = null!;
[Required] public List<PastVisitModel> PastVisits { get; set; } = null!;
/// <inheritdoc cref="VisaApplication.VisaCategory" />
[Required]
@@ -55,4 +55,35 @@ public class VisaApplicationModel
/// <inheritdoc cref="VisaApplication.ValidDaysRequested" />
[Required]
public int ValidDaysRequested { get; set; }
public string ForGroupToString() => ForGroup ? "For group" : "Individual";
public string PastVisasToString()
{
var stringBuilder = new StringBuilder();
foreach (var visa in PastVisas)
{
stringBuilder.AppendLine($"{visa.Name} issued at {visa.IssueDate.ToShortDateString()} and valid for {visa.ExpirationDate.ToShortDateString()}");
}
return stringBuilder.ToString();
}
public string PastVisitsToString()
{
var stringBuilder = new StringBuilder();
foreach (var visit in PastVisits)
{
stringBuilder.AppendLine($"Visit to {visit.DestinationCountry} started at {visit.StartDate.ToShortDateString()} and ends {visit.EndDate.ToShortDateString()}");
}
return stringBuilder.ToString();
}
public string PermissionToDestCountryToString()
{
return VisaCategory is VisaCategory.Transit
? $"Issued by{PermissionToDestCountry!.Issuer}, expires at {PermissionToDestCountry.ExpirationDate.ToShortDateString()}"
: "Non-transit";
}
}

View File

@@ -0,0 +1,7 @@
namespace ApplicationLayer.Services.VisaApplications.NeededServices
{
public interface IEntityWriter
{
Task<Stream> WriteEntityToStream(object entity, CancellationToken cancellationToken);
}
}