Add product division map fallback
This commit is contained in:
@@ -135,6 +135,23 @@ public class DatabaseInitializationServiceTests : IDisposable
|
||||
Assert.Equal(sageServer.Id, india.HanaServerId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task InitializeAsync_Repairs_Spain_Manual_Import_File_To_Folder()
|
||||
{
|
||||
await PrepareSpainManualImportFilePathAsync();
|
||||
|
||||
var service = CreateService();
|
||||
await service.InitializeAsync();
|
||||
|
||||
await using var db = await _dbFactory.CreateDbContextAsync();
|
||||
var spain = Assert.Single(db.Sites, x => x.TSC == "TRSE");
|
||||
|
||||
Assert.Equal("MANUAL_EXCEL", spain.SourceSystem);
|
||||
Assert.Equal(
|
||||
"https://trafagag.sharepoint.com/sites/WorldwideBIPlatform/Import/Finance/Spanien",
|
||||
spain.ManualImportFilePath);
|
||||
}
|
||||
|
||||
private async Task PrepareLegacySitesTableAsync()
|
||||
{
|
||||
await using var db = await _dbFactory.CreateDbContextAsync();
|
||||
@@ -240,6 +257,35 @@ VALUES (
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private async Task PrepareSpainManualImportFilePathAsync()
|
||||
{
|
||||
await using var db = await _dbFactory.CreateDbContextAsync();
|
||||
|
||||
db.HanaServers.RemoveRange(db.HanaServers);
|
||||
db.Sites.RemoveRange(db.Sites);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
db.Sites.AddRange(
|
||||
new Site
|
||||
{
|
||||
Schema = "fr01_p",
|
||||
TSC = "TRFR",
|
||||
Land = "Frankreich",
|
||||
SourceSystem = "BI1",
|
||||
IsActive = true
|
||||
},
|
||||
new Site
|
||||
{
|
||||
Schema = "Spanien",
|
||||
TSC = "TRSE",
|
||||
Land = "Spanien",
|
||||
SourceSystem = "MANUAL_EXCEL",
|
||||
ManualImportFilePath = "https://trafagag.sharepoint.com/sites/WorldwideBIPlatform/Import/Finance/Spanien/Spain_Sales_2025.csv",
|
||||
IsActive = true
|
||||
});
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private async Task PrepareBrokenHanaServerForeignKeyAsync()
|
||||
{
|
||||
await using var db = await _dbFactory.CreateDbContextAsync();
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user