diff --git a/src/Spd.Manager.Printing/Configurer.cs b/src/Spd.Manager.Printing/Configurer.cs index c2126a30e..599d3bc1e 100644 --- a/src/Spd.Manager.Printing/Configurer.cs +++ b/src/Spd.Manager.Printing/Configurer.cs @@ -14,6 +14,7 @@ public void Configure(ConfigurationContext configurationServices) configurationServices.Services.AddScoped(); configurationServices.Services.AddScoped(); configurationServices.Services.AddScoped(); + configurationServices.Services.AddScoped(); } } } \ No newline at end of file diff --git a/src/Spd.Manager.Printing/Documents/TransformationStrategies/BizLicencePrintingTransformStrategy.cs b/src/Spd.Manager.Printing/Documents/TransformationStrategies/BizLicencePrintingTransformStrategy.cs new file mode 100644 index 000000000..8454f81cd --- /dev/null +++ b/src/Spd.Manager.Printing/Documents/TransformationStrategies/BizLicencePrintingTransformStrategy.cs @@ -0,0 +1,114 @@ +using AutoMapper; +using Spd.Resource.Repository; +using Spd.Resource.Repository.Biz; +using Spd.Resource.Repository.Licence; +using Spd.Resource.Repository.PersonLicApplication; +using Spd.Resource.Repository.ServiceTypes; +using Spd.Resource.Repository.WorkerLicenceCategory; +using Spd.Utilities.Printing.BCMailPlus; +using Spd.Utilities.Shared.Exceptions; +using System.Net; +using System.Text.Json.Serialization; + +namespace Spd.Manager.Printing.Documents.TransformationStrategies; + +internal class BizLicencePrintingTransformStrategy( + ILicenceRepository licRepository, + IServiceTypeRepository serviceTypeRepository, + IWorkerLicenceCategoryRepository workerLicenceCategoryRepository, + IBizRepository bizRepository, + IMapper mapper) + : BcMailPlusTransformStrategyBase(Jobs.BusinessLicense) +{ + protected override async Task CreateDocument(BizLicencePrintingTransformRequest request, CancellationToken cancellationToken) + { + LicenceListResp lics = await licRepository.QueryAsync(new LicenceQry() { LicenceId = request.LicenceId }, cancellationToken); + if (lics == null || !lics.Items.Any()) + throw new ApiException(HttpStatusCode.BadRequest, "No licence found for the licenceId"); + LicenceResp lic = lics.Items.First(); + if (lic.WorkerLicenceTypeCode != WorkerLicenceTypeEnum.SecurityBusinessLicence) + throw new ApiException(HttpStatusCode.BadRequest, "The licence is not a business licence."); + + BizLicencePrintingJson bizLicJson = mapper.Map(lic); + var serviceTypeListResp = await serviceTypeRepository.QueryAsync( + new ServiceTypeQry(null, Enum.Parse(bizLicJson.LicenceType)), cancellationToken); + bizLicJson.LicenceType = serviceTypeListResp.Items.First().ServiceTypeName; + if (lic.WorkerLicenceTypeCode == WorkerLicenceTypeEnum.SecurityBusinessLicence) + bizLicJson.LicenceCategories = await GetCategoryNamesAsync(lic.CategoryCodes, cancellationToken); + + BizResult? biz = await bizRepository.GetBizAsync((Guid)lic.LicenceHolderId, cancellationToken); + mapper.Map(biz, bizLicJson); + + return bizLicJson; + } + + private async Task> GetCategoryNamesAsync(IEnumerable categoryTypeEnums, CancellationToken ct) + { + List names = new(); + foreach (WorkerCategoryTypeEnum categoryTypeEnum in categoryTypeEnums) + { + var listResult = await workerLicenceCategoryRepository.QueryAsync( + new WorkerLicenceCategoryQry(null, categoryTypeEnum), + ct); + names.Add(listResult.Items.First().WorkerCategoryTypeName); + } + return names; + } +} + +public record BizLicencePrintingTransformRequest(Guid LicenceId) : DocumentTransformRequest; + +public record BizLicencePrintingJson +{ + [JsonPropertyName("licenceNumber")] + public string LicenceNumber { get; set; } = null!; + + [JsonPropertyName("licenceType")] + public string LicenceType { get; set; } = null!; //Armoured Vehicle Permit, Body Armour Permit, Security Worker Licence, Security Business Licence + + [JsonPropertyName("photo")] + public string Photo { get; set; } = null!; //only apply to personal licence, no photo for biz licence + + [JsonPropertyName("licenceCategories")] + public IEnumerable LicenceCategories { get; set; } = Enumerable.Empty();//["Security Guard", "Locksmith"], only has value for swl and biz licence + + [JsonPropertyName("applicantName")] + public string ApplicantName { get; set; } = null!; //we guess it is biz legal name + + [JsonPropertyName("doingBusinessAsName")] + public string? DoingBusinessAsName { get; set; } //only apply to biz licence + + [JsonPropertyName("issuedDate")] + public string? IssuedDate { get; set; } //yyyy-MM-dd + + [JsonPropertyName("expiryDate")] + public string? ExpiryDate { get; set; } //yyyy-MM-dd + + [JsonPropertyName("mailingAddress1")] + public string? MailingAddress1 { get; set; } + + [JsonPropertyName("mailingAddress2")] + public string? MailingAddress2 { get; set; } + + [JsonPropertyName("city")] + public string? City { get; set; } + + [JsonPropertyName("provinceState")] + public string? ProvinceState { get; set; } + + [JsonPropertyName("postalCode")] + public string? PostalCode { get; set; } + + [JsonPropertyName("country")] + public string? Country { get; set; } + + [JsonPropertyName("branchOffices")] + public IEnumerable BranchOffices { get; set; } = Enumerable.Empty(); //only apply to biz licence + + [JsonPropertyName("conditions")] + public IEnumerable Conditions { get; set; } = Enumerable.Empty(); //only apply to personal licence, no conditions for biz licence + + [JsonPropertyName("SPD_CARD")] + public SPD_CARD? SPD_CARD { get; set; } //only apply to personal licence, no spd_card for biz licence +} + diff --git a/src/Spd.Manager.Printing/Documents/TransformationStrategies/Mappings.cs b/src/Spd.Manager.Printing/Documents/TransformationStrategies/Mappings.cs index ca00a48c0..d41a8a8de 100644 --- a/src/Spd.Manager.Printing/Documents/TransformationStrategies/Mappings.cs +++ b/src/Spd.Manager.Printing/Documents/TransformationStrategies/Mappings.cs @@ -1,5 +1,6 @@ using AutoMapper; using Spd.Resource.Repository.Application; +using Spd.Resource.Repository.Biz; using Spd.Resource.Repository.Contact; using Spd.Resource.Repository.Licence; using Spd.Resource.Repository.Org; @@ -67,6 +68,40 @@ public Mappings() .ForMember(d => d.Height, opt => opt.MapFrom(s => GetHeightStr(s))) .ForMember(d => d.Weight, opt => opt.MapFrom(s => GetWeightStr(s))) .ForMember(d => d.CardType, opt => opt.MapFrom(s => "SECURITY-WORKER-AND-ARMOUR")); + + CreateMap() + .ForMember(d => d.ApplicantName, opt => opt.Ignore()) + .ForMember(d => d.LicenceNumber, opt => opt.MapFrom(s => s.LicenceNumber)) + .ForMember(d => d.LicenceType, opt => opt.MapFrom(s => s.WorkerLicenceTypeCode)) + .ForMember(d => d.IssuedDate, opt => opt.MapFrom(s => DateTime.Now.ToString("yyyy-MM-dd"))) + .ForMember(d => d.ExpiryDate, opt => opt.MapFrom(s => s.ExpiryDate.ToString("yyyy-MM-dd"))) + .ForMember(d => d.LicenceCategories, opt => opt.MapFrom(s => s.CategoryCodes)); + + CreateMap() + .ForMember(d => d.ApplicantName, opt => opt.MapFrom(s => s.BizLegalName)) + .ForMember(d => d.LicenceNumber, opt => opt.Ignore()) + .ForMember(d => d.LicenceType, opt => opt.Ignore()) + .ForMember(d => d.IssuedDate, opt => opt.Ignore()) + .ForMember(d => d.ExpiryDate, opt => opt.Ignore()) + .ForMember(d => d.Photo, opt => opt.Ignore()) + .ForMember(d => d.Conditions, opt => opt.Ignore()) + .ForMember(d => d.LicenceCategories, opt => opt.Ignore()) + .ForMember(d => d.DoingBusinessAsName, opt => opt.MapFrom(s => s.BizName)) + .ForMember(d => d.MailingAddress1, opt => opt.MapFrom(s => s.MailingAddress == null ? null : s.MailingAddress.AddressLine1)) + .ForMember(d => d.MailingAddress2, opt => opt.MapFrom(s => s.MailingAddress == null ? null : s.MailingAddress.AddressLine2)) + .ForMember(d => d.City, opt => opt.MapFrom(s => s.MailingAddress == null ? null : s.MailingAddress.City)) + .ForMember(d => d.ProvinceState, opt => opt.MapFrom(s => s.MailingAddress == null ? null : s.MailingAddress.Province)) + .ForMember(d => d.Country, opt => opt.MapFrom(s => s.MailingAddress == null ? null : s.MailingAddress.Country)) + .ForMember(d => d.PostalCode, opt => opt.MapFrom(s => s.MailingAddress == null ? null : s.MailingAddress.PostalCode)) + .ForMember(d => d.BranchOffices, opt => opt.MapFrom(s => s.BranchAddresses)); + + CreateMap() + .ForMember(d => d.MailingAddress1, opt => opt.MapFrom(s => s.AddressLine1)) + .ForMember(d => d.MailingAddress2, opt => opt.MapFrom(s => s.AddressLine2)) + .ForMember(d => d.City, opt => opt.MapFrom(s => s.City)) + .ForMember(d => d.ProvinceState, opt => opt.MapFrom(s => s.Province)) + .ForMember(d => d.Country, opt => opt.MapFrom(s => s.Country)) + .ForMember(d => d.PostalCode, opt => opt.MapFrom(s => s.PostalCode)); } private string GetHeightStr(LicenceApplicationResp resp) diff --git a/src/Spd.Manager.Printing/PrintingManager.cs b/src/Spd.Manager.Printing/PrintingManager.cs index ff9b86061..525a3fa76 100644 --- a/src/Spd.Manager.Printing/PrintingManager.cs +++ b/src/Spd.Manager.Printing/PrintingManager.cs @@ -137,12 +137,16 @@ private static DocumentTransformRequest CreateDocumentTransformRequest(EventResp if (eventResp.EventTypeEnum == EventTypeEnum.BCMPBodyArmourPermitPrinting && (eventResp.RegardingObjectId == null || eventResp.RegardingObjectName != "spd_licence")) throw new ApiException(System.Net.HttpStatusCode.BadRequest, "LicenceId cannot be null if it is BCMPBodyArmourPermitPrinting"); + if (eventResp.EventTypeEnum == EventTypeEnum.BCMPBusinessLicencePrinting && (eventResp.RegardingObjectId == null || eventResp.RegardingObjectName != "spd_licence")) + throw new ApiException(System.Net.HttpStatusCode.BadRequest, "LicenceId cannot be null if it is BCMPBusinessLicencePrinting"); + return eventResp.EventTypeEnum switch { - EventTypeEnum.BCMPScreeningFingerprintPrinting => new FingerprintLetterTransformRequest((Guid)eventResp.RegardingObjectId), + EventTypeEnum.BCMPScreeningFingerprintPrinting => new FingerprintLetterTransformRequest(eventResp.RegardingObjectId.Value), EventTypeEnum.BCMPSecurityWorkerLicencePrinting => new PersonalLicencePrintingTransformRequest((Guid)eventResp.RegardingObjectId), EventTypeEnum.BCMPBodyArmourPermitPrinting => new PersonalLicencePrintingTransformRequest((Guid)eventResp.RegardingObjectId), EventTypeEnum.BCMPArmouredVehiclePermitPrinting => new PersonalLicencePrintingTransformRequest((Guid)eventResp.RegardingObjectId), + EventTypeEnum.BCMPBusinessLicencePrinting => new BizLicencePrintingTransformRequest((Guid)eventResp.RegardingObjectId), _ => throw new NotImplementedException() }; }