Add product division map fallback

This commit is contained in:
2026-06-10 16:17:02 +02:00
parent d1d50e9c0c
commit f23fa1662e
19 changed files with 2399 additions and 18 deletions
@@ -108,6 +108,126 @@ public class MappedSalesRecordComposerTests
Assert.Equal("HANA", result[0].DocumentType);
}
[Fact]
public void Compose_UsesFirstNonEmptyFallbackWhenPrimaryProductReferenceIsMissing()
{
var composer = new MappedSalesRecordComposer();
var site = new Site { TSC = "TRAT", Land = "Oesterreich" };
var sources = new[]
{
new SapSourceDefinition { Alias = "Z", EntitySet = "Sales", IsPrimary = true, IsActive = true },
new SapSourceDefinition { Alias = "P", EntitySet = "ProductDivisionRefSet", IsActive = true, SortOrder = 1 },
new SapSourceDefinition { Alias = "M", EntitySet = "ProductDivisionMapSet", IsActive = true, SortOrder = 2 }
};
var joins = new[]
{
new SapJoinDefinition { LeftAlias = "Z", RightAlias = "P", LeftKeys = "Matnr", RightKeys = "Matnr", IsActive = true, SortOrder = 1 },
new SapJoinDefinition { LeftAlias = "Z", RightAlias = "M", LeftKeys = "Prodh", RightKeys = "Paph1", IsActive = true, SortOrder = 2 }
};
var mappings = new[]
{
Mapping(nameof(SalesRecord.Material), "Z.Matnr"),
Mapping(nameof(SalesRecord.ProductGroup), "Z.Prodh"),
Mapping(nameof(SalesRecord.ProductHierarchyCode), "FirstNonEmpty(P.Paph1, M.Paph1)"),
Mapping(nameof(SalesRecord.ProductFamilyCode), "FirstNonEmpty(P.Wwpfa, M.Wwpfa)"),
Mapping(nameof(SalesRecord.ProductDivisionCode), "FirstNonEmpty(P.Wwpsp, M.Wwpsp)"),
Mapping(nameof(SalesRecord.ProductMappingAssigned), "FirstNonEmpty(P.IsAssigned, M.IsAssigned)")
};
var rows = new Dictionary<string, List<Dictionary<string, object?>>>(StringComparer.OrdinalIgnoreCase)
{
["Z"] =
[
new(StringComparer.OrdinalIgnoreCase)
{
["Matnr"] = "900720",
["Prodh"] = "9999"
}
],
["P"] = [],
["M"] =
[
new(StringComparer.OrdinalIgnoreCase)
{
["Paph1"] = "9999",
["Wwpfa"] = "0043",
["Wwpsp"] = "0008",
["IsAssigned"] = true
}
]
};
var result = composer.Compose(site, sources, joins, mappings, rows, "SAP");
Assert.Single(result);
Assert.Equal("900720", result[0].Material);
Assert.Equal("9999", result[0].ProductGroup);
Assert.Equal("9999", result[0].ProductHierarchyCode);
Assert.Equal("0043", result[0].ProductFamilyCode);
Assert.Equal("0008", result[0].ProductDivisionCode);
Assert.Equal("True", result[0].ProductMappingAssigned);
}
[Fact]
public void Compose_FirstNonEmptyKeepsMaterialReferenceBeforeProductHierarchyFallback()
{
var composer = new MappedSalesRecordComposer();
var site = new Site { TSC = "TRCH", Land = "Schweiz" };
var sources = new[]
{
new SapSourceDefinition { Alias = "Z", EntitySet = "Sales", IsPrimary = true, IsActive = true },
new SapSourceDefinition { Alias = "P", EntitySet = "ProductDivisionRefSet", IsActive = true, SortOrder = 1 },
new SapSourceDefinition { Alias = "M", EntitySet = "ProductDivisionMapSet", IsActive = true, SortOrder = 2 }
};
var joins = new[]
{
new SapJoinDefinition { LeftAlias = "Z", RightAlias = "P", LeftKeys = "Matnr", RightKeys = "Matnr", IsActive = true, SortOrder = 1 },
new SapJoinDefinition { LeftAlias = "Z", RightAlias = "M", LeftKeys = "Prodh", RightKeys = "Paph1", IsActive = true, SortOrder = 2 }
};
var mappings = new[]
{
Mapping(nameof(SalesRecord.ProductHierarchyCode), "FirstNonEmpty(P.Paph1, M.Paph1)"),
Mapping(nameof(SalesRecord.ProductFamilyCode), "FirstNonEmpty(P.Wwpfa, M.Wwpfa)"),
Mapping(nameof(SalesRecord.ProductDivisionCode), "FirstNonEmpty(P.Wwpsp, M.Wwpsp)")
};
var rows = new Dictionary<string, List<Dictionary<string, object?>>>(StringComparer.OrdinalIgnoreCase)
{
["Z"] =
[
new(StringComparer.OrdinalIgnoreCase)
{
["Matnr"] = "6",
["Prodh"] = "9999"
}
],
["P"] =
[
new(StringComparer.OrdinalIgnoreCase)
{
["Matnr"] = "6",
["Paph1"] = "0414",
["Wwpfa"] = "0004",
["Wwpsp"] = "0001"
}
],
["M"] =
[
new(StringComparer.OrdinalIgnoreCase)
{
["Paph1"] = "9999",
["Wwpfa"] = "0043",
["Wwpsp"] = "0008"
}
]
};
var result = composer.Compose(site, sources, joins, mappings, rows, "SAP");
Assert.Single(result);
Assert.Equal("0414", result[0].ProductHierarchyCode);
Assert.Equal("0004", result[0].ProductFamilyCode);
Assert.Equal("0001", result[0].ProductDivisionCode);
}
private static SapFieldMapping Mapping(string targetField, string sourceExpression)
=> new()
{