Support Spain sales delta folder sync

This commit is contained in:
2026-06-05 06:40:31 +02:00
parent 195b430836
commit 825e8063a0
9 changed files with 279 additions and 25 deletions
@@ -113,6 +113,7 @@ public class SharePointUploadService : ISharePointUploadService
var normalizedSiteUrl = Normalize(siteUrl);
var normalizedReference = Normalize(folderReference);
var normalizedTsc = Normalize(siteTsc).ToUpperInvariant();
var isSpainImport = IsSpainManualImport(normalizedTsc, normalizedReference);
if (string.IsNullOrWhiteSpace(normalizedReference))
throw new InvalidOperationException("SharePoint-Ordnerreferenz fehlt.");
@@ -136,16 +137,41 @@ public class SharePointUploadService : ISharePointUploadService
var allCandidates = children?.Value?
.Where(item => item.File is not null)
.Where(item => IsSupportedManualImportFile(item.Name))
.Where(item => MatchesTsc(item.Name, normalizedTsc))
.Select(item => new
.Where(item => isSpainImport ? IsSpainSalesFile(item.Name) : MatchesTsc(item.Name, normalizedTsc))
.Select(item =>
{
Item = item,
FileDate = TryParseDatedSiteFileName(item.Name, normalizedTsc, out var fileDate) ? fileDate : (DateTime?)null,
AnnualYear = TryParseAnnualSiteFileName(item.Name, normalizedTsc, out var annualYear) ? annualYear : (int?)null,
SnapshotDate = TryParseSnapshotDate(item.Name, out var snapshotDate) ? snapshotDate : (DateTime?)null
var hasSpainRange = TryParseSpainSalesRangeFileName(item.Name, out var rangeStart, out var rangeEnd);
return new
{
Item = item,
FileDate = TryParseDatedSiteFileName(item.Name, normalizedTsc, out var fileDate) ? fileDate : (DateTime?)null,
SpainRangeStart = hasSpainRange ? rangeStart : (DateTime?)null,
SpainRangeEnd = hasSpainRange ? rangeEnd : (DateTime?)null,
AnnualYear = TryParseAnnualSiteFileName(item.Name, normalizedTsc, out var annualYear) ? annualYear : (int?)null,
SnapshotDate = TryParseSnapshotDate(item.Name, out var snapshotDate) ? snapshotDate : (DateTime?)null
};
})
.ToList() ?? [];
if (isSpainImport)
{
var spainCandidates = allCandidates
.OrderBy(x => x.SpainRangeStart is null ? 0 : 1)
.ThenBy(x => x.SpainRangeStart ?? DateTime.MinValue)
.ThenBy(x => x.SpainRangeEnd ?? DateTime.MinValue)
.ThenBy(x => x.Item.Name, StringComparer.OrdinalIgnoreCase)
.ToList();
if (spainCandidates.Count == 0)
throw new InvalidOperationException($"Im SharePoint-Ordner '{folderPath}' wurde keine Spain_Sales*.csv gefunden.");
return spainCandidates
.Select(x => new SharePointFileReference(
string.Join("/", folderPath.Trim('/'), x.Item.Name).Trim('/'),
x.Item.LastModifiedDateTime))
.ToList();
}
if (preferredYear is not null)
{
var annual = allCandidates
@@ -315,6 +341,39 @@ public class SharePointUploadService : ISharePointUploadService
Regex.IsMatch(nameWithoutExtension, $@"(^|[^A-Z0-9]){Regex.Escape(normalizedTsc)}([^A-Z0-9]|$)", RegexOptions.IgnoreCase);
}
private static bool IsSpainManualImport(string normalizedTsc, string folderReference)
=> string.Equals(normalizedTsc, "TRES", StringComparison.OrdinalIgnoreCase) ||
string.Equals(normalizedTsc, "TRSE", StringComparison.OrdinalIgnoreCase) ||
folderReference.Contains("Spanien", StringComparison.OrdinalIgnoreCase) ||
folderReference.Contains("Spain", StringComparison.OrdinalIgnoreCase);
private static bool IsSpainSalesFile(string? fileName)
=> Path.GetFileName(fileName ?? string.Empty).StartsWith("Spain_Sales", StringComparison.OrdinalIgnoreCase) &&
Path.GetExtension(fileName ?? string.Empty).Equals(".csv", StringComparison.OrdinalIgnoreCase);
private static bool TryParseSpainSalesRangeFileName(string? fileName, out DateTime rangeStart, out DateTime rangeEnd)
{
rangeStart = default;
rangeEnd = default;
var nameWithoutExtension = Path.GetFileNameWithoutExtension(fileName ?? string.Empty);
var match = Regex.Match(nameWithoutExtension, @"^Spain_Sales_range_(?<from>\d{8})_to_(?<to>\d{8})$", RegexOptions.IgnoreCase);
if (!match.Success)
return false;
return DateTime.TryParseExact(
match.Groups["from"].Value,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out rangeStart) &&
DateTime.TryParseExact(
match.Groups["to"].Value,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out rangeEnd);
}
private static bool TryParseDatedSiteFileName(string? fileName, string normalizedTsc, out DateTime fileDate)
{
fileDate = default;