Skip to content

Commit

Permalink
PSP-9523 Migrate file number suffix to new field (#4510)
Browse files Browse the repository at this point in the history
* Backend model changes

* wip

* Backend model and mapping updates

* Update business logic related to File number and suffix

* Test updates

* Update api models

* Update file suffix on acquisition create and update forms

* Code fixes

* Test updates

* Backend test updates
  • Loading branch information
asanchezr authored Dec 3, 2024
1 parent 6f8ddd6 commit 9a5a616
Show file tree
Hide file tree
Showing 25 changed files with 166 additions and 137 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public AgreementReportModel(PimsAgreement agreement, ClaimsPrincipal user)
{
MinistryProject = GetMinistryProjectName(agreement.AcquisitionFile?.Project);
Product = GetMinistryProductName(agreement.AcquisitionFile?.Product);
AcquisitionNumberAndName = $"{agreement.AcquisitionFile?.FileNumber} - {agreement.AcquisitionFile?.FileName}";
AcquisitionNumberAndName = $"{agreement.AcquisitionFile?.FileNumberFormatted} - {agreement.AcquisitionFile?.FileName}";
FileCreatedDate = GetNullableDate(agreement.AcquisitionFile?.AppCreateTimestamp);
FileStatus = agreement.AcquisitionFile?.AcquisitionFileStatusTypeCodeNavigation?.Description;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ private static string GetFileNumberAndName(PimsCompensationRequisition compensat
{
if (compensationRequisition?.AcquisitionFile is not null)
{
return $"{compensationRequisition.AcquisitionFile.FileNumber} - {compensationRequisition.AcquisitionFile.FileName}";
return $"{compensationRequisition.AcquisitionFile.FileNumberFormatted} - {compensationRequisition.AcquisitionFile.FileName}";
}
else if (compensationRequisition?.Lease is not null)
{
Expand Down
7 changes: 3 additions & 4 deletions source/backend/api/Services/AcquisitionFileService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,18 @@
using System.Security.Claims;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Pims.Core.Api.Exceptions;
using Pims.Api.Helpers.Extensions;
using Pims.Api.Models.CodeTypes;
using Pims.Core.Api.Exceptions;
using Pims.Core.Exceptions;
using Pims.Core.Extensions;
using Pims.Core.Security;
using Pims.Dal.Entities;
using Pims.Dal.Entities.Extensions;
using Pims.Dal.Entities.Models;
using Pims.Dal.Exceptions;
using Pims.Dal.Helpers.Extensions;
using Pims.Dal.Repositories;
using Pims.Core.Security;
using Pims.Core.Api.Exceptions;

namespace Pims.Api.Services
{
Expand Down Expand Up @@ -108,7 +107,7 @@ public List<AcquisitionFileExportModel> GetAcquisitionFileExport(AcquisitionFilt
return acqFiles.SelectMany(file => file.PimsPropertyAcquisitionFiles.Where(fp => fp.AcquisitionFileId.Equals(file.AcquisitionFileId)).DefaultIfEmpty(), (file, fp) => (file, fp))
.Select(fileProperty => new AcquisitionFileExportModel
{
FileNumber = fileProperty.file.FileNumber ?? string.Empty,
FileNumber = fileProperty.file.FileNumberFormatted ?? string.Empty,
LegacyFileNumber = fileProperty.file.LegacyFileNumber ?? string.Empty,
FileName = fileProperty.file.FileName ?? string.Empty,
MotiRegion = fileProperty.file.RegionCodeNavigation?.Description ?? string.Empty,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Collections.Immutable;
using System.Linq;
using Mapster;
using Pims.Api.Models.Base;
using Pims.Core.Extensions;
Expand All @@ -17,8 +16,8 @@ public void Register(TypeAdapterConfig config)
.Map(dest => dest.Id, src => src.AcquisitionFileId)
.Map(dest => dest.ParentAcquisitionFileId, src => src.PrntAcquisitionFileId)
.Map(dest => dest.FileNo, src => src.FileNo)
.Map(dest => dest.FileNumber, src => src.FileNumber)
.Map(dest => dest.FileNumberSuffix, src => src.FileNumber.Split('-', System.StringSplitOptions.TrimEntries).Last())
.Map(dest => dest.FileNumber, src => src.FileNumberFormatted)
.Map(dest => dest.FileNumberSuffix, src => src.FileNoSuffix)
.Map(dest => dest.FileName, src => src.FileName)
.Map(dest => dest.LegacyFileNumber, src => src.LegacyFileNumber)
.Map(dest => dest.Project, src => src.Project)
Expand Down Expand Up @@ -52,7 +51,7 @@ public void Register(TypeAdapterConfig config)
.Map(dest => dest.AcquisitionFileId, src => src.Id)
.Map(dest => dest.PrntAcquisitionFileId, src => src.ParentAcquisitionFileId)
.Map(dest => dest.FileNo, src => src.FileNo)
.Map(dest => dest.FileNumber, src => src.FileNumber)
.Map(dest => dest.FileNoSuffix, src => src.FileNumberSuffix)
.Map(dest => dest.FileName, src => src.FileName)
.Map(dest => dest.LegacyFileNumber, src => src.LegacyFileNumber)
.Map(dest => dest.ProjectId, src => src.ProjectId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class AcquisitionFileModel : FileWithChecklistModel
/// <summary>
/// get/set - The File number Suffix.
/// </summary>
public string FileNumberSuffix { get; set; }
public short FileNumberSuffix { get; set; }

/// <summary>
/// get/set - A historical reference number of this file in a legacy system (likely PAIMS).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void Register(TypeAdapterConfig config)

config.NewConfig<Entity.PimsPropertyAcquisitionFile, AssociationModel>()
.Map(dest => dest.Id, src => src.AcquisitionFileId)
.Map(dest => dest.FileNumber, src => src.AcquisitionFile.FileNumber)
.Map(dest => dest.FileNumber, src => src.AcquisitionFile.FileNumberFormatted)
.Map(dest => dest.FileName, src => src.AcquisitionFile.FileName)
.Map(dest => dest.CreatedBy, src => src.AcquisitionFile.AppCreateUserid)
.Map(dest => dest.CreatedByGuid, src => src.AcquisitionFile.AppCreateUserGuid)
Expand Down
31 changes: 0 additions & 31 deletions source/backend/dal/Helpers/Extensions/AcquisitionFileExtensions.cs

This file was deleted.

69 changes: 19 additions & 50 deletions source/backend/dal/Repositories/AcquisitionFileRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -677,19 +677,22 @@ public PimsAcquisitionFile Add(PimsAcquisitionFile acquisitionFile)
// generate file number for "main" files
int nextFileNo = GetNextAcquisitionFileNumberSequenceValue();
acquisitionFile.FileNo = nextFileNo;
acquisitionFile.FileNumber = GenerateAcquisitionNumber(acquisitionFile.RegionCode, nextFileNo, 1);
acquisitionFile.FileNoSuffix = 1;
}
else
{
// generate file number for "sub-files"
var parentFile = Context.PimsAcquisitionFiles.AsNoTracking()
.FirstOrDefault(x => x.AcquisitionFileId == acquisitionFile.PrntAcquisitionFileId) ?? throw new KeyNotFoundException();

int nextSuffix = GetNextSubFileSuffixValue(parentFile.Internal_Id);
var nextSuffix = GetNextSubFileSuffixValue(parentFile.Internal_Id);
acquisitionFile.FileNo = parentFile.FileNo;
acquisitionFile.FileNumber = GenerateAcquisitionNumber(acquisitionFile.RegionCode, parentFile.FileNo, nextSuffix);
acquisitionFile.FileNoSuffix = nextSuffix;
}

// TODO: Remove this once the FILE_NUMBER column gets removed. We need this here because it is not nullable
acquisitionFile.FileNumber = string.Empty;

Context.PimsAcquisitionFiles.Add(acquisitionFile);
return acquisitionFile;
}
Expand All @@ -707,23 +710,10 @@ public PimsAcquisitionFile Update(PimsAcquisitionFile acquisitionFile)
var existingAcqFile = Context.PimsAcquisitionFiles
.FirstOrDefault(x => x.AcquisitionFileId == acquisitionFile.Internal_Id) ?? throw new KeyNotFoundException();

// PSP-4413 Changing the MOTI region triggers an update to the ACQ File Number
if (existingAcqFile.RegionCode != acquisitionFile.RegionCode)
{
int suffix = existingAcqFile.GetAcquisitionNumberSuffix();
if (suffix < 0)
{
throw new BusinessRuleViolationException("Cannot parse Acquisition File Number suffix.");
}
acquisitionFile.FileNo = existingAcqFile.FileNo;
acquisitionFile.FileNumber = GenerateAcquisitionNumber(acquisitionFile.RegionCode, acquisitionFile.FileNo, suffix);
}
else
{
// Make sure the frontend cannot override these auto-generated fields
acquisitionFile.FileNo = existingAcqFile.FileNo;
acquisitionFile.FileNumber = existingAcqFile.FileNumber;
}
// Make sure the frontend cannot override these auto-generated fields
acquisitionFile.FileNo = existingAcqFile.FileNo;
acquisitionFile.FileNoSuffix = existingAcqFile.FileNoSuffix;
acquisitionFile.FileNumber = existingAcqFile.FileNumber; // TODO: Remove this once the FILE_NUMBER column gets removed. We need this here because it is not nullable

// PSP-9268 Changes to Project/Product on the main file need to be propagated to all sub-files
if (existingAcqFile.ProjectId != acquisitionFile.ProjectId || existingAcqFile.ProductId != acquisitionFile.ProductId)
Expand Down Expand Up @@ -817,32 +807,6 @@ public List<PimsAcquisitionFile> GetAcquisitionSubFiles(long acquisitionFileId,
.Where(predicate).OrderBy(x => x.FileNumber).ToList();
}

/// <summary>
/// Generates a new Acquisition Number in the following format.
/// </summary>
/// <remarks>
/// <list type="bullet">
/// <item>
/// Format: YY-XXXXXXXXXXXX-ZZ
/// </item>
/// <item>
/// Prefix - (YY above) The prefix numbers for an Acquisition file correspond with the MoTI region
/// </item>
/// <item>
/// File # - (XXXXX... above) Acquisition File number is created and each file number should increase in increments of 1.
/// The digit base number is unique to the file. Do not pad the number with zeros.
/// </item>
/// <item>
/// Suffix - (ZZ above) The suffix numbers for an Acquisition file defaults to 01 for "Main Files".
/// </item>
/// </list>
/// </remarks>
/// <returns>The formatted Acquisition File Number.</returns>
private static string GenerateAcquisitionNumber(short prefix, long fileNumber, int suffix = 1)
{
return $"{prefix:00}-{fileNumber}-{suffix:00}";
}

/// <summary>
/// Get the next available value from PIMS_ACQUISITION_FILE_NO_SEQ.
/// </summary>
Expand All @@ -852,7 +816,7 @@ private int GetNextAcquisitionFileNumberSequenceValue()
return (int)_sequenceRepository.GetNextSequenceValue("dbo.PIMS_ACQUISITION_FILE_NO_SEQ");
}

private int GetNextSubFileSuffixValue(long parentAcquisitionFileId)
private short GetNextSubFileSuffixValue(long parentAcquisitionFileId)
{
// To determine the next suffix number we need to grab all sub-files (regardless of any region restriction)
var allRegions = Context.PimsRegions.AsNoTracking().Select(r => r.RegionCode).ToHashSet();
Expand All @@ -865,8 +829,8 @@ private int GetNextSubFileSuffixValue(long parentAcquisitionFileId)
}
else
{
int latestSuffix = existingSubFiles.Select(x => x.GetAcquisitionNumberSuffix()).Max();
return latestSuffix + 1;
short maxSuffix = existingSubFiles.Select(x => x.FileNoSuffix).Max();
return (short)(maxSuffix + 1);
}
}

Expand Down Expand Up @@ -909,7 +873,12 @@ private IQueryable<PimsAcquisitionFile> GetCommonAcquisitionFileQueryDeep(Acquis

if (!string.IsNullOrWhiteSpace(filter.AcquisitionFileNameOrNumber))
{
predicate = predicate.And(r => EF.Functions.Like(r.FileName, $"%{filter.AcquisitionFileNameOrNumber}%") || EF.Functions.Like(r.FileNumber, $"%{filter.AcquisitionFileNameOrNumber}%") || EF.Functions.Like(r.LegacyFileNumber, $"%{filter.AcquisitionFileNameOrNumber}%"));
var fileNumberBuilder = PredicateBuilder.New<PimsAcquisitionFile>(acq => false);
fileNumberBuilder = fileNumberBuilder.Or(r => EF.Functions.Like((r.RegionCode < 10 ? "0" : string.Empty) + r.RegionCode.ToString() + "-" + r.FileNo.ToString() + "-" + (r.FileNoSuffix < 10 ? "0" : string.Empty) + r.FileNoSuffix.ToString(), $"%{filter.AcquisitionFileNameOrNumber}%"));
fileNumberBuilder = fileNumberBuilder.Or(r => EF.Functions.Like(r.FileName, $"%{filter.AcquisitionFileNameOrNumber}%"));
fileNumberBuilder = fileNumberBuilder.Or(r => EF.Functions.Like(r.LegacyFileNumber, $"%{filter.AcquisitionFileNameOrNumber}%"));

predicate = predicate.And(fileNumberBuilder);
}

if (!string.IsNullOrWhiteSpace(filter.ProjectNameOrNumber))
Expand Down
33 changes: 33 additions & 0 deletions source/backend/entities/Partials/AcquisitionFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,39 @@ public partial class PimsAcquisitionFile : StandardIdentityBaseAppEntity<long>,
#region Properties
[NotMapped]
public override long Internal_Id { get => this.AcquisitionFileId; set => this.AcquisitionFileId = value; }

/// <summary>
/// Formatted file number assigned to the acquisition file.
/// Format follows YY-XXXXXX-ZZ where YY = MoTI region number, XXXXXX = generated integer sequence number, and ZZ = file suffix number.
/// </summary>
[NotMapped]
public string FileNumberFormatted { get => GenerateAcquisitionFileNumber(this.RegionCode, this.FileNo, this.FileNoSuffix); }
#endregion

/// <summary>
/// Generates a new Acquisition File Number in the following format.
/// </summary>
/// <remarks>
/// <list type="bullet">
/// <item>
/// Format: YY-XXXXXXXXXXXX-ZZ
/// </item>
/// <item>
/// Prefix - (YY above) The prefix numbers for an Acquisition file correspond with the MoTI region
/// </item>
/// <item>
/// File # - (XXXXX... above) Acquisition File number is created and each file number should increase in increments of 1.
/// The digit base number is unique to the file. Do not pad the number with zeros.
/// </item>
/// <item>
/// Suffix - (ZZ above) The suffix numbers for an Acquisition file defaults to 01 for "Main Files".
/// </item>
/// </list>
/// </remarks>
/// <returns>The formatted Acquisition File Number.</returns>
public static string GenerateAcquisitionFileNumber(short prefix, int fileNumber, int suffix = 1)
{
return $"{prefix:00}-{fileNumber}-{suffix:00}";
}
}
}
4 changes: 3 additions & 1 deletion source/backend/tests/core/Entities/AcquisitionFileHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,14 @@ public static Entity.PimsAcquisitionFile CreateAcquisitionFile(long? acqFileId =
FileName = name ?? "Test Acquisition File",
ConcurrencyControlNumber = 1,
};
acquisitionFile.FileNumber = "12345";
acquisitionFile.FileNo = 12345;
acquisitionFile.FileNoSuffix = 1;
acquisitionFile.AcquisitionFileStatusTypeCode = "ACTIVE";
acquisitionFile.AcquisitionFileStatusTypeCodeNavigation = statusType ?? new Entity.PimsAcquisitionFileStatusType() { Id = "ACTIVE", Description = "Active", DbCreateUserid = "test", DbLastUpdateUserid = "test" };
acquisitionFile.AcquisitionTypeCodeNavigation = acquisitionType ?? new Entity.PimsAcquisitionType() { Id = "SECTN3", DbCreateUserid = "test", DbLastUpdateUserid = "test", Description = "test" };
acquisitionFile.RegionCodeNavigation = region ?? new Entity.PimsRegion("Northern") { RegionCode = 1, ConcurrencyControlNumber = 1, DbCreateUserid = "test", DbLastUpdateUserid = "test" };
acquisitionFile.RegionCode = acquisitionFile.RegionCodeNavigation.RegionCode;
acquisitionFile.FileNumber = acquisitionFile.FileNumberFormatted; // TODO: Remove this once FILE_NUMBER column is removed from schema

return acquisitionFile;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,15 @@ public void CompensationFinancialReportModel_FileNumberAndName()
{
CompensationRequisition = new PimsCompensationRequisition()
{
AcquisitionFile = new PimsAcquisitionFile() { FileNumber = "9999", FileName = "test" },
AcquisitionFile = new PimsAcquisitionFile() { RegionCode = 1, FileNo = 9999, FileNoSuffix = 1, FileName = "test" },
},
};

// Act
var model = new CompensationFinancialReportModel(testFinancial, new CompensationFinancialReportTotalsModel(new List<PimsCompReqFinancial>()), new System.Security.Claims.ClaimsPrincipal());

// Assert
model.FileNumberAndName.Should().Be("9999 - test");
model.FileNumberAndName.Should().Be("01-9999-01 - test");
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2894,7 +2894,9 @@ public void GetAcquisitionFileExport_Success_FlatProperties()

var filter = new AcquisitionFilter();
var acquisitionFile = EntityHelper.CreateAcquisitionFile(1);
acquisitionFile.FileNumber = "10-25-2023";
acquisitionFile.FileNo = 2023;
acquisitionFile.RegionCode = 1;
acquisitionFile.FileNoSuffix = 1;
acquisitionFile.PimsPropertyAcquisitionFiles = new List<PimsPropertyAcquisitionFile>()
{
new PimsPropertyAcquisitionFile()
Expand Down Expand Up @@ -2934,8 +2936,8 @@ public void GetAcquisitionFileExport_Success_FlatProperties()
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Count());
Assert.Equal("10-25-2023", result[0].FileNumber);
Assert.Equal("10-25-2023", result[1].FileNumber);
Assert.Equal("01-2023-01", result[0].FileNumber);
Assert.Equal("01-2023-01", result[1].FileNumber);
Assert.Equal("8000", result[0].Pid);
Assert.Equal("9000", result[1].Pid);
acqFilerepository.Verify(x => x.GetAcquisitionFileExportDeep(It.IsAny<AcquisitionFilter>(), It.IsAny<HashSet<short>>(), It.IsAny<long?>()), Times.Once);
Expand Down
Loading

0 comments on commit 9a5a616

Please sign in to comment.