262 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| @page "/applications/{ApplicationId}"
 | |
| @using System.Net
 | |
| @using BlazorWebAssemblyVisaApiClient.Common.Exceptions
 | |
| @using BlazorWebAssemblyVisaApiClient.Components
 | |
| @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers
 | |
| @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider
 | |
| @using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models
 | |
| @using BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models
 | |
| @using VisaApiClient
 | |
| @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase
 | |
| 
 | |
| <PageTitle>Application</PageTitle>
 | |
| 
 | |
| <table class="table table-bordered table-hover table-sm">
 | |
|     <tbody>
 | |
|     <tr>
 | |
|         <td >
 | |
|             Applicant's fullname:<br/>
 | |
|             <em>@NameToString(application.Applicant.Name)</em>
 | |
|         </td>
 | |
|         <td colspan="2">
 | |
|             Date of birth:<br/>
 | |
|             <em>@application.Applicant.BirthDate.ToString("d")</em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td colspan="3">
 | |
|             Country and city of birth:<br/>
 | |
|             <em>@application.Applicant.CountryOfBirth, @application.Applicant.CityOfBirth</em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td colspan="2">
 | |
|             Citizenship:<br/>
 | |
|             <em>@application.Applicant.Citizenship</em>
 | |
|         </td>
 | |
|         <td>
 | |
|             Citizenship by birth:<br/>
 | |
|             <em>@application.Applicant.CitizenshipByBirth</em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td >
 | |
|             Gender:<br/>
 | |
|             <em>@application.Applicant.Gender.GetDisplayName()</em>
 | |
|         </td>
 | |
|         <td colspan="2">
 | |
|             Marital status:<br/>
 | |
|             <em>@(((MaritalStatusModel)application.Applicant.MaritalStatus).GetDisplayName())</em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td >
 | |
|             Father's fullname:<br/>
 | |
|             <em>@NameToString(application.Applicant.FatherName)</em>
 | |
|         </td>
 | |
|         <td colspan="2">
 | |
|             Mother's fullname:<br/>
 | |
|             <em>@NameToString(application.Applicant.MotherName)</em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td >
 | |
|             Passport number:<br/>
 | |
|             <em>@application.Applicant.Passport.Number</em>
 | |
|         </td>
 | |
|         <td >
 | |
|             Issue date:<br/>
 | |
|             <em>@application.Applicant.Passport.IssueDate.ToString("d")</em>
 | |
|         </td>
 | |
|         <td >
 | |
|             Expiration date:<br/>
 | |
|             <em>@application.Applicant.Passport.ExpirationDate.ToString("d")</em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td colspan="3">
 | |
|             Passport issuer:<br/>
 | |
|             <em>@application.Applicant.Passport.Issuer</em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td colspan="3">
 | |
|             Re-entry permission (for non-residents):<br/>
 | |
|             @if (application.Applicant.IsNonResident)
 | |
|             {
 | |
|                 <em>@(application.ReentryPermit is null ? "None" : $"{application.ReentryPermit.Number}, expires at {application.ReentryPermit.ExpirationDate:d}")</em>
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 <em>Not non-resident</em>
 | |
|             }
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td colspan="3">
 | |
|             Job title:<br/>
 | |
|             <em>@application.Applicant.JobTitle</em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td colspan="3">
 | |
|             Place of work, address, hirer's phone number:<br/>
 | |
|             <em>
 | |
|                 @((MarkupString)$"{application.Applicant.PlaceOfWork.Name}<br>Address: {AddressToString(application.Applicant.PlaceOfWork.Address)}<br>Phone num: {application.Applicant.PlaceOfWork.PhoneNum}")
 | |
|             </em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td >
 | |
|             Destination Country:<br/>
 | |
|             <em>@application.DestinationCountry</em>
 | |
|         </td>
 | |
|         <td >
 | |
|             Visa category:<br/>
 | |
|             <em>@(((VisaCategoryModel)application.VisaCategory).GetDisplayName())</em>
 | |
|         </td>
 | |
|         <td >
 | |
|             Visa:<br/>
 | |
|             <em>@(application.ForGroup ? "For group" : "Individual")</em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td >
 | |
|             Requested number of entries:<br/>
 | |
|             <em>@application.RequestedNumberOfEntries.GetDisplayName()</em>
 | |
|         </td>
 | |
|         <td colspan="2">
 | |
|             Valid for:<br/>
 | |
|             <em>@($"{application.ValidDaysRequested} days")</em>
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td colspan="3">
 | |
|             Past visas:<br/>
 | |
|             @if (application.PastVisas.Any())
 | |
|             {
 | |
|                 foreach (var visa in application.PastVisas)
 | |
|                 {
 | |
|                     <em>@($"{visa.Name} issued at {visa.IssueDate:d} and was valid until {visa.ExpirationDate:d}")</em>
 | |
|                     <br/>
 | |
|                 }
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 <em>None</em>
 | |
|             }
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td colspan="3">
 | |
|             Permission to destination Country, if transit:<br/>
 | |
|             @if (application.VisaCategory is VisaCategory.Transit)
 | |
|             {
 | |
|                 <em>@(application.PermissionToDestCountry is null ? "None" : $"Expires at {application.PermissionToDestCountry.ExpirationDate}, issued by: {application.PermissionToDestCountry.Issuer}")</em>
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 <em>Non-transit</em>
 | |
|             }
 | |
|         </td>
 | |
|     </tr>
 | |
|     <tr>
 | |
|         <td colspan="3">
 | |
|             Past visits:<br/>
 | |
|             @if (application.PastVisas.Any())
 | |
|             {
 | |
|                 foreach (var visit in application.PastVisits)
 | |
|                 {
 | |
|                     <em>@($"Visit to {visit.DestinationCountry}, entered at {visit.StartDate:d} and lasts until {visit.EndDate:d}")</em>
 | |
|                     <br/>
 | |
|                 }
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 <em>None</em>
 | |
|             }
 | |
|         </td>
 | |
|     </tr>
 | |
|     </tbody>
 | |
| </table>
 | |
| @if (currentRole == Constants.ApprovingAuthorityRole)
 | |
| {
 | |
|     <button class="btn-outline-primary" @onclick="Approve">Approve</button>
 | |
|     <button class="btn-outline-danger" @onclick="Reject">Reject</button>
 | |
|     <Status @ref="status"/>
 | |
| }
 | |
| 
 | |
| @code {
 | |
|     private VisaApplicationModel application = new();
 | |
|     private string currentRole = null!;
 | |
|     private Status status = null!;
 | |
| 
 | |
|     [Parameter] public string ApplicationId { get; set; } = null!;
 | |
| 
 | |
|     [Inject] private IUserDataProvider UserDataProvider { get; set; } = null!;
 | |
| 
 | |
|     [Inject] private NavigationManager Nav { get; set; } = null!;
 | |
| 
 | |
|     protected override async Task OnInitializedAsync()
 | |
|     {
 | |
|         try
 | |
|         {
 | |
|             var applicationId = Guid.Parse(ApplicationId);
 | |
|             currentRole = UserDataProvider.CurrentRole ?? throw new NotLoggedInException();
 | |
| 
 | |
|                 application = currentRole switch
 | |
|                 {
 | |
|                     Constants.ApplicantRole => await Client.GetApplicationForApplicantAsync(applicationId),
 | |
|                     Constants.ApprovingAuthorityRole => await Client.GetApplicationForAuthorityAsync(applicationId),
 | |
|                     _ => throw new NotLoggedInException()
 | |
|                 };
 | |
|         }
 | |
|         catch (Exception e)
 | |
|         {
 | |
| 
 | |
|             if (e is ApiException<ProblemDetails> { Result.Status: (int)HttpStatusCode.Conflict })
 | |
|             {
 | |
|                 Nav.NavigateTo("/applications");
 | |
|             }
 | |
|             ErrorHandler.Handle(e);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static string NameToString(NameModel name)
 | |
|         => $"{name.FirstName} {name.Surname} {name.Patronymic}".TrimEnd();
 | |
| 
 | |
|     private static string AddressToString(AddressModel address)
 | |
|         => $"{address.Country}, {address.City}, {address.Street} {address.Building}";
 | |
| 
 | |
|     private async void Approve()
 | |
|     {
 | |
|         try
 | |
|         {
 | |
|             status.SetMessage("Wait...");
 | |
|             await Client.SetStatusFromAuthorityAsync(application.Id, AuthorityRequestStatuses.Approved);
 | |
|             Nav.NavigateTo("/applications");
 | |
|         }
 | |
|         catch (Exception e)
 | |
|         {
 | |
|             status.SetError("Error occured.");
 | |
|             ErrorHandler.Handle(e);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private async void Reject()
 | |
|     {
 | |
|         try
 | |
|         {
 | |
|             status.SetMessage("Wait...");
 | |
|             await Client.SetStatusFromAuthorityAsync(application.Id, AuthorityRequestStatuses.Rejected);
 | |
|             Nav.NavigateTo("/applications");
 | |
|         }
 | |
|         catch (Exception e)
 | |
|         {
 | |
|             status.SetError("Error occured.");
 | |
|             ErrorHandler.Handle(e);
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 |