From 995f111c204f64ba42cf79999c04058013199d18 Mon Sep 17 00:00:00 2001 From: Matthias Sebastian Sort Date: Tue, 8 Apr 2025 10:12:21 +0200 Subject: [PATCH] Added logic in HandleProductLanguageId function so it takes value from column mapping when it HasScriptWithValue. --- ...aIntegration.Providers.EcomProvider.csproj | 2 +- src/EcomDestinationWriter.cs | 64 +++++++++++-------- 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/Dynamicweb.DataIntegration.Providers.EcomProvider.csproj b/src/Dynamicweb.DataIntegration.Providers.EcomProvider.csproj index 200b03a..8beb525 100644 --- a/src/Dynamicweb.DataIntegration.Providers.EcomProvider.csproj +++ b/src/Dynamicweb.DataIntegration.Providers.EcomProvider.csproj @@ -1,6 +1,6 @@  - 10.9.1 + 10.9.2 1.0.0.0 Ecom Provider Ecom Provider diff --git a/src/EcomDestinationWriter.cs b/src/EcomDestinationWriter.cs index eb881b0..885e352 100644 --- a/src/EcomDestinationWriter.cs +++ b/src/EcomDestinationWriter.cs @@ -47,7 +47,7 @@ internal class EcomDestinationWriter : BaseSqlWriter private List> _rowsWithMissingGroups = new List>(); internal const string EcomProductsMissingGroupsErrorMessage = "Failed at importing EcomProducts rows with missing Groups"; - private Dictionary> Mappings = new Dictionary>(StringComparer.OrdinalIgnoreCase); + private Dictionary> Mappings = new Dictionary>(StringComparer.OrdinalIgnoreCase); private Dictionary> DestinationColumnMappings = new Dictionary>(StringComparer.OrdinalIgnoreCase); private Dictionary> SourceColumnMappings = new Dictionary>(); @@ -183,7 +183,7 @@ private void InitMappings() var mappingColumns = mapping.GetColumnMappings(); ColumnMappingsByMappingId.Add(mapping.GetId(), mappingColumns); InitMappingsByTableName(mapping); - InitColumnMappings(mapping, mappingColumns); + InitColumnMappings(mapping, mappingColumns); } } @@ -244,7 +244,7 @@ internal void CreateTempTables() if (DestinationColumnMappings.TryGetValue(table.Name, out Dictionary? columnMappingDictionary)) { - List destColumns = new List(); + List destColumns = new List(); foreach (Column column in columnMappingDictionary.Values) { destColumns.Add((SqlColumn)column); @@ -330,42 +330,42 @@ internal void CreateTempTables() case "EcomProducts": break; case "EcomGroups": - EnsureDestinationColumns(currentTable, null, destColumns, ["GroupID", "GroupLanguageID", "GroupName"]); + EnsureDestinationColumns(currentTable, null, destColumns, ["GroupID", "GroupLanguageID", "GroupName"]); CreateTempTable(table.SqlSchema, table.Name, TempTableName, destColumns, logger); AddTableToDataset(destColumns, table.Name); break; case "EcomVariantGroups": - EnsureDestinationColumns(currentTable, null, destColumns, ["VariantGroupID", "VariantGroupLanguageID", "VariantGroupName"]); + EnsureDestinationColumns(currentTable, null, destColumns, ["VariantGroupID", "VariantGroupLanguageID", "VariantGroupName"]); CreateTempTable(table.SqlSchema, table.Name, TempTableName, destColumns, logger); AddTableToDataset(destColumns, table.Name); break; case "EcomVariantsOptions": - EnsureDestinationColumns(currentTable, null, destColumns, ["VariantOptionID", "VariantOptionLanguageID", "VariantOptionName"]); + EnsureDestinationColumns(currentTable, null, destColumns, ["VariantOptionID", "VariantOptionLanguageID", "VariantOptionName"]); CreateTempTable(table.SqlSchema, table.Name, TempTableName, destColumns, logger); AddTableToDataset(destColumns, table.Name); break; case "EcomManufacturers": - EnsureDestinationColumns(currentTable, null, destColumns, ["ManufacturerID", "ManufacturerName"]); + EnsureDestinationColumns(currentTable, null, destColumns, ["ManufacturerID", "ManufacturerName"]); CreateTempTable(table.SqlSchema, table.Name, TempTableName, destColumns, logger); AddTableToDataset(destColumns, table.Name); break; case "EcomProductsRelated": - EnsureDestinationColumns(currentTable, null, destColumns, ["ProductRelatedProductID", "ProductRelatedProductRelID", "ProductRelatedGroupID", "ProductRelatedProductRelVariantID"]); + EnsureDestinationColumns(currentTable, null, destColumns, ["ProductRelatedProductID", "ProductRelatedProductRelID", "ProductRelatedGroupID", "ProductRelatedProductRelVariantID"]); CreateTempTable(table.SqlSchema, table.Name, TempTableName, destColumns, logger); AddTableToDataset(destColumns, table.Name); break; case "EcomLanguages": - EnsureDestinationColumns(currentTable, null, destColumns, ["LanguageID", "LanguageCode2", "LanguageName", "LanguageNativeName"]); + EnsureDestinationColumns(currentTable, null, destColumns, ["LanguageID", "LanguageCode2", "LanguageName", "LanguageNativeName"]); CreateTempTable(table.SqlSchema, table.Name, TempTableName, destColumns, logger); AddTableToDataset(destColumns, table.Name); break; case "EcomVariantOptionsProductRelation": - EnsureDestinationColumns(currentTable, null, destColumns, ["VariantOptionsProductRelationProductID", "VariantOptionsProductRelationVariantID"]); + EnsureDestinationColumns(currentTable, null, destColumns, ["VariantOptionsProductRelationProductID", "VariantOptionsProductRelationVariantID"]); CreateTempTable(table.SqlSchema, table.Name, TempTableName, destColumns, logger); AddTableToDataset(destColumns, table.Name); break; case "EcomProductCategoryFieldValue": - EnsureDestinationColumns(currentTable, null, destColumns, ["FieldValueFieldId", "FieldValueFieldCategoryId", "FieldValueProductId", "FieldValueProductVariantId", "FieldValueProductLanguageId", "FieldValueValue"]); + EnsureDestinationColumns(currentTable, null, destColumns, ["FieldValueFieldId", "FieldValueFieldCategoryId", "FieldValueProductId", "FieldValueProductVariantId", "FieldValueProductLanguageId", "FieldValueValue"]); CreateTempTable(table.SqlSchema, table.Name, TempTableName, destColumns, logger); AddTableToDataset(destColumns, table.Name); break; @@ -374,42 +374,42 @@ internal void CreateTempTables() } //Create product group relation temp table - var relationTable = GetTable("EcomGroupProductRelation", currentTables); - var groupProductRelationColumns = new List(); + var relationTable = GetTable("EcomGroupProductRelation", currentTables); + var groupProductRelationColumns = new List(); EnsureDestinationColumns(relationTable, null, groupProductRelationColumns, ["GroupProductRelationGroupId", "GroupProductRelationProductId", "GroupProductRelationSorting", "GroupProductRelationIsPrimary"]); CreateTempTable(null, "EcomGroupProductRelation", TempTableName, groupProductRelationColumns, logger); AddTableToDataset(groupProductRelationColumns, "EcomGroupProductRelation"); //create product variantgroup relation temp table - List variantGroupProductRelation = new List(); + List variantGroupProductRelation = new List(); relationTable = GetTable("EcomVariantgroupProductRelation", currentTables); EnsureDestinationColumns(relationTable, null, variantGroupProductRelation, ["VariantgroupProductRelationProductID", "VariantgroupProductRelationVariantGroupID", "VariantgroupProductRelationID", "VariantGroupProductRelationSorting"]); CreateTempTable(null, "EcomVariantgroupProductRelation", TempTableName, variantGroupProductRelation, logger); AddTableToDataset(variantGroupProductRelation, "EcomVariantgroupProductRelation"); //Create ShopGroupRelation temp table - List shopGroupRelations = new List(); + List shopGroupRelations = new List(); relationTable = GetTable("EcomShopGroupRelation", currentTables); EnsureDestinationColumns(relationTable, null, shopGroupRelations, ["ShopGroupShopID", "ShopGroupGroupID", "ShopGroupRelationsSorting"]); CreateTempTable(null, "EcomShopGroupRelation", TempTableName, shopGroupRelations, logger); AddTableToDataset(shopGroupRelations, "EcomShopGroupRelation"); //Create Shop relation table - List shops = new List(); + List shops = new List(); relationTable = GetTable("EcomShops", currentTables); EnsureDestinationColumns(relationTable, null, shops, ["ShopID", "ShopName"]); CreateTempTable(null, "EcomShops", TempTableName, shops, logger); AddTableToDataset(shops, "EcomShops"); //Create Product-relatedGroup temp table - List productsRelatedGroups = new List(); + List productsRelatedGroups = new List(); relationTable = GetTable("EcomProductsRelatedGroups", currentTables); EnsureDestinationColumns(relationTable, null, productsRelatedGroups, ["RelatedGroupID", "RelatedGroupName", "RelatedGroupLanguageID"]); CreateTempTable(null, "EcomProductsRelatedGroups", TempTableName, productsRelatedGroups, logger); AddTableToDataset(productsRelatedGroups, "EcomProductsRelatedGroups"); //Create EcomGroupRelations temp table - List groupRelations = new List(); + List groupRelations = new List(); relationTable = GetTable("EcomGroupRelations", currentTables); EnsureDestinationColumns(relationTable, null, groupRelations, ["GroupRelationsGroupID", "GroupRelationsParentID", "GroupRelationsSorting"]); CreateTempTable(null, "EcomGroupRelations", TempTableName, groupRelations, logger); @@ -427,7 +427,7 @@ private void EnsureConnectionIsOpen() private Table GetTable(string tableName, TableCollection tables) { var currentTable = tables.FirstOrDefault(t => string.Equals(t.Name, tableName, StringComparison.OrdinalIgnoreCase)); - Ensure.NotNull(currentTable, $"Can not find the table: {tableName} in the database schema"); + Ensure.NotNull(currentTable, $"Can not find the table: {tableName} in the database schema"); return currentTable; } @@ -1127,7 +1127,7 @@ public void Write(Dictionary row, Mapping mapping, bool discardD case "EcomDetails": WriteDetails(row, columnMappings, dataRow); break; - case "EcomAssortmentPermissions": + case "EcomAssortmentPermissions": if (!WriteAssortments(row, columnMappings, dataRow, mappingColumns, mapping)) { return; @@ -1244,7 +1244,7 @@ private bool WriteProducts(Dictionary row, Mapping mapping, Dict if (existingProductRow != null) { - dataRow["ProductVariantCounter"] = existingProductRow["ProductVariantCounter"]; + dataRow["ProductVariantCounter"] = existingProductRow["ProductVariantCounter"]; } //Find groups, create if missing, add relations @@ -1548,10 +1548,18 @@ private string HandleProductLanguageId(Dictionary row, Dictionar ColumnMapping? column = null; columnMappings.TryGetValue("ProductLanguageID", out column); string productLanguageID = _defaultLanguageId; - if (column != null && column.Active && !column.HasScriptWithValue && column.SourceColumn != null && !string.IsNullOrEmpty(Converter.ToString(row[column.SourceColumn.Name]))) + if (column != null && column.Active) { - productLanguageID = GetLanguageID(row[column.SourceColumn.Name].ToString()); - row[column.SourceColumn.Name] = productLanguageID; + if (column.HasScriptWithValue) + { + productLanguageID = GetLanguageID(column.GetScriptValue()); + dataRow["ProductLanguageID"] = productLanguageID; + } + else if (!column.HasScriptWithValue && column.SourceColumn != null && !string.IsNullOrEmpty(Converter.ToString(row[column.SourceColumn.Name]))) + { + productLanguageID = GetLanguageID(row[column.SourceColumn.Name].ToString()); + row[column.SourceColumn.Name] = productLanguageID; + } } else { @@ -3049,7 +3057,7 @@ public int DeleteExcessFromMainTable(string shop, SqlTransaction transaction, Di { sqlCommand.Transaction = transaction; var mapping = mappings.Values.FirstOrDefault(); - if (mapping is null) + if (mapping is null) return 0; string extraConditions = GetExtraConditions(mapping, shop, null); @@ -3683,7 +3691,7 @@ public void UpdateVariantFieldsInProducts() { var ecomVariantOptionsProductRelationTables = FindDataTablesStartingWithName("EcomVariantOptionsProductRelation"); if (DataToWrite.Tables.Contains("EcomVariantgroupProductrelation") && ecomVariantOptionsProductRelationTables.Count() > 0) - { + { bool variantCounterColExist = productsDataTable.Columns.Contains("ProductVariantCounter"); if (!variantCounterColExist) @@ -3698,7 +3706,7 @@ public void UpdateVariantFieldsInProducts() foreach (DataRow row in tableRows.Values.SelectMany(c => c)) { string productId = row["ProductID"].ToString() ?? ""; - string langId = row["ProductLanguageID"].ToString() ?? ""; + string langId = row["ProductLanguageID"].ToString() ?? ""; //Check if it is already existing product row and it has filled variants counter fileds - skip it if ((row["ProductVariantCounter"] == System.DBNull.Value || row["ProductVariantCounter"].ToString() == "0") && variantCounterColExist) { @@ -3792,7 +3800,7 @@ public void UpdateFieldsInExistingProductsWithVariantIDs(string keyColumn, Mappi newRow.ItemArray = (object?[])row.ItemArray.Clone(); } newRow["ProductVariantID"] = variantInfo.Item1; - newRow["ProductVariantCounter"] = variantInfo.Item2; + newRow["ProductVariantCounter"] = variantInfo.Item2; rowsToAdd.Add(newRow); } }