Files
monorepo/LCU.Api.Internal.DataCleanUp/LCU.Api.Internal.DataCleanUp/Services/UpdatePersonForAtmHoldsService.cs
T
2026-03-13 09:28:55 -05:00

125 lines
5.5 KiB
C#

using Serilog;
using TimeZoneConverter;
using Newtonsoft.Json;
using LCU.Library.Internal.DataCleanUpModel.Models;
using LCU.Api.Internal.DataCleanUp.Models;
using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.Persons;
using LCU.Api.Internal.DataCleanUp.Configuration;
namespace LCU.Api.Internal.DataCleanUp.Services;
public class UpdatePersonForAtmHoldsService : IUpdatePersonForAtmHoldsService
{
private readonly ICoreApiWrapperService _coreApiWrapperService;
private readonly DataCleanupDefaults _dataCleanupDefaults;
private readonly DataCleanUpConfiguration _dataCleanUpConfiguration;
public UpdatePersonForAtmHoldsService(ICoreApiWrapperService coreApiWrapperService, DataCleanupDefaults dataCleanupDefaults, DataCleanUpConfiguration dataCleanUpConfiguration)
{
_coreApiWrapperService = coreApiWrapperService;
_dataCleanupDefaults = dataCleanupDefaults;
_dataCleanUpConfiguration = dataCleanUpConfiguration;
}
public async Task<DataCleanUpResult> CleanUp(DataCleanUpRequest dataCleanUpRequest)
{
Log.Information($"Starting Data CleanUp {dataCleanUpRequest.CleanUpType} at {DateTime.Now}");
var cleanUpResult = new DataCleanUpResult(dataCleanUpRequest, true, new List<string>());
try
{
var result = JsonConvert.DeserializeObject<UpdatePersonForCheckHoldRequest>(dataCleanUpRequest.DataCleanUpPayload);
var assumedTimezone = TZConvert.GetTimeZoneInfo(_dataCleanUpConfiguration.TimeZone);
DateTime? resetStartDate = result.ResetStartDate.HasValue ? TimeZoneInfo.ConvertTime((DateTime)result.ResetStartDate, assumedTimezone) : null;
DateTime? resetEndDate = result.ResetEndDate.HasValue ? TimeZoneInfo.ConvertTime((DateTime)result.ResetEndDate, assumedTimezone) : null;
var personsForUserFieldList = await _coreApiWrapperService.GetAtmCheckHoldsForPersonNumbers(resetStartDate, resetEndDate, result.FetchSize);
ArgumentNullException.ThrowIfNull(personsForUserFieldList);
Log.Information($"Data CleanUp # of Persons {personsForUserFieldList.Count()} at {DateTime.Now}");
foreach (var person in personsForUserFieldList)
{
cleanUpResult = await HandlePersonForCheckHolds(cleanUpResult, person);
}
}
catch (Exception exception)
{
Log.Error(exception, "Error while updating Person for Atm Check Holds.");
cleanUpResult.Successful = false;
cleanUpResult.ResponseStack.Add($"Error while updating Person for Atm Check Holds. " +
$"Exception:{exception}");
}
Log.Information($"Ending Data CleanUp {dataCleanUpRequest.CleanUpType} at {DateTime.Now}");
return cleanUpResult;
}
public async Task<DataCleanUpResult> HandlePersonForCheckHolds(DataCleanUpResult cleanUpResult, PersonCheckHoldsUserField person)
{
try
{
var personNumber = (int)person.PersonNumber;
var response = new PersonUserField();
var personValue = DeterminePersonUserFieldValue(person);
if (person.UserFieldExists)
{
response = await _coreApiWrapperService.UpdateAtmCheckHoldsForPersonNumbers(personNumber, personValue);
}
else
{
response = await _coreApiWrapperService.AddAtmCheckHoldsForPersonNumbers(personNumber, personValue);
}
if (response == null)
{
cleanUpResult.Successful = false;
cleanUpResult.ResponseStack.Add($"Error while updating Person { person.PersonNumber } for Atm Check Holds.");
}
}
catch(Exception exception)
{
cleanUpResult.Successful = false;
cleanUpResult.ResponseStack.Add($"Error while updating Person { person.PersonNumber } for Atm Check Holds. " +
$"Exception:{exception}");
}
return cleanUpResult;
}
public string DeterminePersonUserFieldValue(PersonCheckHoldsUserField person)
{
string personUserFieldValue = "";
var assumedTimezone = TZConvert.GetTimeZoneInfo(_dataCleanUpConfiguration.TimeZone);
DateTime checkHoldEndDateToConvert = Convert.ToDateTime(DateTime.Now.AddDays(-_dataCleanupDefaults.MemberCheckHoldsDays));
var checkHoldEndDate = TimeZoneInfo.ConvertTime(checkHoldEndDateToConvert, assumedTimezone).Date;
person.OldestActiveEffectiveDate = person.OldestActiveEffectiveDate.HasValue ? person.OldestActiveEffectiveDate.Value.Date : null;
person.RecentClosedEffectiveDate = person.RecentClosedEffectiveDate.HasValue ? person.RecentClosedEffectiveDate.Value.Date : null;
var checkHoldsUserFieldValue = new CheckHoldsUserFieldValue(person, checkHoldEndDate);
foreach (var propertyInfo in checkHoldsUserFieldValue.GetType().GetProperties())
{
if (propertyInfo.PropertyType == typeof(bool))
{
bool value = (bool)propertyInfo.GetValue(checkHoldsUserFieldValue, null);
if (value == true && propertyInfo.Name.Contains("NoValue"))
{
personUserFieldValue = "N";
break;
}
else if (value == true && propertyInfo.Name.Contains("YesValue"))
{
personUserFieldValue = "Y";
break;
};
}
}
return personUserFieldValue;
}
}