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
@@ -31,6 +31,7 @@ public sealed class ManualExcelDataSourceAdapter : IDataSourceAdapter
string filePath;
string? localOutputDirectory = null;
string? sharePointUploadFolder = null;
var localManualImportPaths = new List<string>();
var tempManualImportPaths = new List<string>();
try
{
@@ -39,6 +40,12 @@ public sealed class ManualExcelDataSourceAdapter : IDataSourceAdapter
filePath = manualImportPath;
localOutputDirectory = Path.GetDirectoryName(Path.GetFullPath(manualImportPath));
}
else if (Directory.Exists(manualImportPath))
{
localManualImportPaths.AddRange(ResolveLocalManualImportFilesInFolder(manualImportPath, site));
filePath = manualImportPath;
localOutputDirectory = Path.GetFullPath(manualImportPath);
}
else if (LooksLikeSharePointReference(manualImportPath))
{
var spConfig = context.SharePointConfig
@@ -95,9 +102,15 @@ public sealed class ManualExcelDataSourceAdapter : IDataSourceAdapter
siteId: site.Id, land: site.Land, details: filePath);
var records = new List<SalesRecord>();
var readPaths = tempManualImportPaths.Count > 0 ? tempManualImportPaths : [filePath];
var readPaths = tempManualImportPaths.Count > 0
? tempManualImportPaths
: localManualImportPaths.Count > 0
? localManualImportPaths
: [filePath];
foreach (var readPath in readPaths)
records.AddRange(await _manualExcelImportService.ReadSalesRecordsAsync(readPath, site));
if (IsSpainSite(site))
records = DeduplicateSpainSalesRecords(records);
return new DataSourceFetchResult
{
Records = records,
@@ -126,6 +139,85 @@ public sealed class ManualExcelDataSourceAdapter : IDataSourceAdapter
=> LooksLikeSharePointReference(path) &&
string.IsNullOrWhiteSpace(Path.GetExtension(path.TrimEnd('/')));
private static List<string> ResolveLocalManualImportFilesInFolder(string folderPath, Site site)
{
var files = Directory.EnumerateFiles(folderPath)
.Where(IsSupportedManualImportFile)
.Where(path => !IsSpainSite(site) || IsSpainSalesFile(path))
.OrderBy(GetManualImportFileSortKey, StringComparer.OrdinalIgnoreCase)
.ThenBy(path => path, StringComparer.OrdinalIgnoreCase)
.ToList();
if (files.Count == 0)
{
var expected = IsSpainSite(site) ? "Spain_Sales*.csv" : "*.xlsx/*.csv";
throw new InvalidOperationException($"Im Ordner '{folderPath}' wurde keine passende Importdatei gefunden ({expected}).");
}
return files;
}
private static bool IsSupportedManualImportFile(string path)
{
var extension = Path.GetExtension(path);
return extension.Equals(".xlsx", StringComparison.OrdinalIgnoreCase) ||
extension.Equals(".csv", StringComparison.OrdinalIgnoreCase);
}
private static bool IsSpainSite(Site site)
=> string.Equals(site.TSC, "TRES", StringComparison.OrdinalIgnoreCase) ||
string.Equals(site.TSC, "TRSE", StringComparison.OrdinalIgnoreCase) ||
string.Equals(site.Land, "Spanien", StringComparison.OrdinalIgnoreCase) ||
string.Equals(site.Land, "Spain", StringComparison.OrdinalIgnoreCase);
private static bool IsSpainSalesFile(string path)
=> Path.GetFileName(path).StartsWith("Spain_Sales", StringComparison.OrdinalIgnoreCase) &&
Path.GetExtension(path).Equals(".csv", StringComparison.OrdinalIgnoreCase);
private static string GetManualImportFileSortKey(string path)
{
var name = Path.GetFileNameWithoutExtension(path);
var rangeIndex = name.IndexOf("_range_", StringComparison.OrdinalIgnoreCase);
if (rangeIndex >= 0)
return "1_" + name[(rangeIndex + "_range_".Length)..];
return "0_" + name;
}
private static List<SalesRecord> DeduplicateSpainSalesRecords(IEnumerable<SalesRecord> records)
{
var ordered = records.ToList();
var keyed = new Dictionary<string, SalesRecord>(StringComparer.OrdinalIgnoreCase);
var unkeyed = new List<SalesRecord>();
foreach (var record in ordered)
{
var key = BuildSpainSalesRecordKey(record);
if (string.IsNullOrWhiteSpace(key))
unkeyed.Add(record);
else
keyed[key] = record;
}
return keyed.Values.Concat(unkeyed).ToList();
}
private static string BuildSpainSalesRecordKey(SalesRecord record)
{
if (!string.IsNullOrWhiteSpace(record.SourceLineId))
return $"source:{record.SourceLineId.Trim()}";
if (!string.IsNullOrWhiteSpace(record.InvoiceNumber))
return string.Join("|",
"invoice",
record.Tsc?.Trim() ?? string.Empty,
record.InvoiceNumber.Trim(),
record.PositionOnInvoice.ToString(System.Globalization.CultureInfo.InvariantCulture),
record.Material?.Trim() ?? string.Empty);
return string.Empty;
}
private static string ResolveSharePointParentFolder(string fileReference, string siteUrl)
{
var remotePath = fileReference.Trim('/').Trim();