From 8c3b00c75cad8f739d9ce6d9586c47688864247b Mon Sep 17 00:00:00 2001 From: Bob Hodgetts Date: Tue, 8 Jul 2025 15:52:18 +0100 Subject: [PATCH] bug fix and imporovements to HMRC exchange rate update --- .../Logic/Account/CurrencyService.cs | 79 +++++++++---------- 1 file changed, 36 insertions(+), 43 deletions(-) diff --git a/src/bnhtrade.Core/Logic/Account/CurrencyService.cs b/src/bnhtrade.Core/Logic/Account/CurrencyService.cs index e58b1fb..b8d929a 100644 --- a/src/bnhtrade.Core/Logic/Account/CurrencyService.cs +++ b/src/bnhtrade.Core/Logic/Account/CurrencyService.cs @@ -268,45 +268,6 @@ namespace bnhtrade.Core.Logic.Account } } - private DateTime GetHmrcMaxPeriodAvaible() - { - // HMRC monthly exchange rates are published on the penultimate Thursday of the month before - // For some leeeeeeeeway we'll use the penultimate Friday - - // find penultimate Friday for current month - var ukTimeNow = new Logic.Utilities.DateTime().ConvertUtcToUk(DateTime.UtcNow); - var monthDayCount = DateTime.DaysInMonth(ukTimeNow.Year, ukTimeNow.Month); - var thisMonthPenultimateFriday = DateTime.SpecifyKind(new DateTime(ukTimeNow.Year, ukTimeNow.Month, monthDayCount), DateTimeKind.Unspecified); - int count = 0; - int fridayCount = 0; - while (count != 15) - { - if (thisMonthPenultimateFriday.DayOfWeek == DayOfWeek.Friday) - { - fridayCount++; - if (fridayCount == 2) - { - break; - } - } - thisMonthPenultimateFriday = thisMonthPenultimateFriday.AddDays(-1); - count++; - } - - if (count == 15) - { - throw new Exception("Something went wrong here ErrorID:ef7f5d8f-0f7b-4014-aa65-421ecd5d7367"); - } - - var mostRecentPeriodAvaible = DateTime.SpecifyKind(new DateTime(ukTimeNow.Year, ukTimeNow.Month, 1), DateTimeKind.Unspecified); ; - if (ukTimeNow >= thisMonthPenultimateFriday) - { - mostRecentPeriodAvaible = mostRecentPeriodAvaible.AddMonths(1); - } - - return mostRecentPeriodAvaible; - } - public void UpdateHmrcExchageRates() { Init(); @@ -381,16 +342,48 @@ namespace bnhtrade.Core.Logic.Account } // check if retrival from hmrc is required - var hmrcMaxMonthAvaible = GetHmrcMaxPeriodAvaible(); - if (hmrcMonthToRetrive.Year == hmrcMaxMonthAvaible.Year && hmrcMonthToRetrive.Month > hmrcMaxMonthAvaible.Month) + // find penultimate Friday for current month + var ukTimeNow = new Logic.Utilities.DateTime().ConvertUtcToUk(DateTime.UtcNow); + var monthDayCount = DateTime.DaysInMonth(ukTimeNow.Year, ukTimeNow.Month); + var thisMonthPenultimateFriday = DateTime.SpecifyKind(new DateTime(ukTimeNow.Year, ukTimeNow.Month, monthDayCount), DateTimeKind.Unspecified); + int dayCount = 0; + int fridayCount = 0; + while (dayCount < 15) + { + if (thisMonthPenultimateFriday.DayOfWeek == DayOfWeek.Friday) + { + fridayCount++; + if (fridayCount == 2) + { + break; + } + } + thisMonthPenultimateFriday = thisMonthPenultimateFriday.AddDays(-1); + dayCount++; + } + + if (dayCount == 15) + { + throw new Exception("Something went wrong here ErrorID:ef7f5d8f-0f7b-4014-aa65-421ecd5d7367"); + } + + var mostRecentPeriodAvaible = DateTime.SpecifyKind(new DateTime(ukTimeNow.Year, ukTimeNow.Month, 1), DateTimeKind.Unspecified); ; + if (ukTimeNow >= thisMonthPenultimateFriday) + { + mostRecentPeriodAvaible = mostRecentPeriodAvaible.AddMonths(1); + } + + if (hmrcMonthToRetrive.Year >= mostRecentPeriodAvaible.Year && hmrcMonthToRetrive.Month > mostRecentPeriodAvaible.Month) { // nothing to retrive - _log.LogInformation("Exchange rates curretly up to date, exiting."); + int days = (thisMonthPenultimateFriday - DateTime.UtcNow).Days; + _log.LogInformation($"Exchange rates up to date, next HMRC update in {days} days for {hmrcMonthToRetrive.ToString("MMM yyyy")}."); + _log.LogInformation($"Stopping update database HMRC exchange rates."); return; } // get info from hmrc and insert data in db - while (hmrcMonthToRetrive <= hmrcMaxMonthAvaible) + while (hmrcMonthToRetrive <= mostRecentPeriodAvaible) { count = 0;