From f921e7967152366b506d6948ca6dc710b20d1dd6 Mon Sep 17 00:00:00 2001 From: Bob Hodgetts Date: Wed, 29 Apr 2026 19:16:33 +0100 Subject: [PATCH] improvement to settlement report marketplace inference --- .../AmazonSettlementRepository.cs | 188 +++++++++--------- 1 file changed, 95 insertions(+), 93 deletions(-) diff --git a/src/bnhtrade.Core/Data/Database/Repository/Implementation/AmazonSettlementRepository.cs b/src/bnhtrade.Core/Data/Database/Repository/Implementation/AmazonSettlementRepository.cs index ccfe64a..4de7b75 100644 --- a/src/bnhtrade.Core/Data/Database/Repository/Implementation/AmazonSettlementRepository.cs +++ b/src/bnhtrade.Core/Data/Database/Repository/Implementation/AmazonSettlementRepository.cs @@ -369,7 +369,7 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation // /// - /// Update the settlement report marketplace name by settlement Id (not table id) + /// Update the settlement report marketplace name by settlement Id (not row id) /// /// Settlement id (not table/record id) of the settlement to update /// marketplace name @@ -433,13 +433,13 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation /// Takes a Settlement Report flat file from Amazon and imports it into the database. /// /// path to the Amazon report flat file - /// The unique Amazon SP-API report id (not settlement id) + /// The unique Amazon SP-API report id (not settlement id) /// - public bool CreateAmazonSettlements(string filePath, string reportId) + public bool CreateAmazonSettlements(string filePath, string spapiReportId) { int settlementReportId = 0; - string settlementRef = ""; - bool marketPlaceUpdated = false; + string settlementRef = null; + string marketplaceName = null; decimal settlementAmount = 0m; int lineNumber = 2; int lineSkip = 0; @@ -479,17 +479,17 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation int indexQuantityPurchased = Array.IndexOf(headers, "quantity-purchased"); int indexPromotionId = Array.IndexOf(headers, "promotion-id"); - string currency = ""; + string currency = null; string fileRow; while ((fileRow = reader.ReadLine()) != null) { Console.Write("\rParsing record: " + lineNumber); //split line into array - string[] items = fileRow.Split('\t'); - if (items.Length != columnCount) + string[] rowArray = fileRow.Split('\t'); + if (rowArray.Length != columnCount) { - // skip line + // skip line, check settlement total at the end lineSkip = lineSkip + 1; _log.LogWarning( "Line #" + lineNumber + " skipped due to no enough element in row.", @@ -498,28 +498,25 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation } else if (lineNumber == 2) { - // check if settlement has already been imported + settlementRef = rowArray[indexSettlementId]; + currency = rowArray[indexCurrency]; + settlementAmount = decimal.Parse(rowArray[indexTotalAmount].Replace(",", ".")); + // check if settlement has already been imported using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand) { cmd.CommandText = "SELECT COUNT(*) FROM tblImportAmazonSettlementReport WHERE [settlement-id]=@settlementId;"; cmd.Transaction = _transaction as SqlTransaction; - cmd.Parameters.AddWithValue("@settlementId", items[indexSettlementId]); + cmd.Parameters.AddWithValue("@settlementId", rowArray[indexSettlementId]); int recordCount = (int)cmd.ExecuteScalar(); if (recordCount > 0) { - SetSpapiReportId(items[indexSettlementId], reportId); + SetSpapiReportId(rowArray[indexSettlementId], spapiReportId); _log.LogInformation("Settlement report already imported, skipping..."); return true; } } - //set currencyId - //currencyId = GeneralQueries.GetCurrencyId(items[5]); - - //set currency - currency = items[indexCurrency]; - settlementAmount = decimal.Parse(items[indexTotalAmount].Replace(",", ".")); // insert using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand) @@ -543,61 +540,38 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation ,@depositDate ,@settlementotalAmounttId ,@currency - ,@reportId + ,@spapiReportId );"; - // add parameters - if (indexSettlementId == -1 || items[indexSettlementId].Length == 0) { cmd.Parameters.AddWithValue("@settlementId", DBNull.Value); } - else - { - settlementRef = items[indexSettlementId]; - cmd.Parameters.AddWithValue("@settlementId", settlementRef); - } - var parseDateTime = new Core.Logic.Utilities.DateTime(); - if (indexSettlementStartDate == -1 || items[indexSettlementStartDate].Length == 0) { cmd.Parameters.AddWithValue("@settlementStartDate", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@settlementStartDate", parseDateTime.ParseIsoDateTimeString(items[indexSettlementStartDate])); } - - if (indexSettlementEndDate == -1 || items[indexSettlementEndDate].Length == 0) { cmd.Parameters.AddWithValue("@settlementEndDate", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@settlementEndDate", parseDateTime.ParseIsoDateTimeString(items[indexSettlementEndDate])); } - - if (indexDepositDate == -1 || items[indexDepositDate].Length == 0) { cmd.Parameters.AddWithValue("@depositDate", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@depositDate", parseDateTime.ParseIsoDateTimeString(items[indexDepositDate])); } - - if (indexTotalAmount == -1 || items[indexTotalAmount].Length == 0) { cmd.Parameters.AddWithValue("@totalAmount", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@settlementotalAmounttId", settlementAmount); } - - if (string.IsNullOrWhiteSpace(reportId)) { cmd.Parameters.AddWithValue("@reportId", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@reportId", reportId); } - + // add parameters + cmd.Parameters.AddWithValue("@settlementId", rowArray[indexSettlementId]); + cmd.Parameters.AddWithValue("@settlementStartDate", parseDateTime.ParseIsoDateTimeString(rowArray[indexSettlementStartDate])); + cmd.Parameters.AddWithValue("@settlementEndDate", parseDateTime.ParseIsoDateTimeString(rowArray[indexSettlementEndDate])); + cmd.Parameters.AddWithValue("@depositDate", parseDateTime.ParseIsoDateTimeString(rowArray[indexDepositDate])); + cmd.Parameters.AddWithValue("@settlementotalAmounttId", settlementAmount); + if (string.IsNullOrWhiteSpace(spapiReportId)) { cmd.Parameters.AddWithValue("@spapiReportId", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@spapiReportId", spapiReportId); } cmd.Parameters.AddWithValue("@currency", currency); - //if (currencyId == -1) { sqlCommand.Parameters.AddWithValue("@currencyId", DBNull.Value); } - //else { sqlCommand.Parameters.AddWithValue("@currencyId", currencyId); } - //execute and retrive id settlementReportId = (int)cmd.ExecuteScalar(); - } } else { - //update market place name in main table, if required - if (marketPlaceUpdated == false && settlementReportId > 0 && items[indexMarketplaceName].Length > 1) + // attempt to retrieve marketplace name for header table + if (rowArray[indexMarketplaceName].Length > 1 && settlementReportId > 0) { - using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand) + if (marketplaceName == null) { - cmd.Transaction = _transaction as SqlTransaction; - cmd.CommandText = @" - UPDATE tblImportAmazonSettlementReport - SET [marketplace-name]=@MarketplaceName - WHERE ImportAmazonSettlementReportID=@ImportAmazonSettlementReportID;"; - cmd.Parameters.AddWithValue("@MarketplaceName", items[indexMarketplaceName]); - cmd.Parameters.AddWithValue("@ImportAmazonSettlementReportID", settlementReportId); - - cmd.ExecuteNonQuery(); - marketPlaceUpdated = true; + marketplaceName = rowArray[indexMarketplaceName]; + } + else if (marketplaceName != rowArray[indexMarketplaceName]) + { + _log.LogError("Marketplace name '" + rowArray[indexMarketplaceName] + "' on line " + lineNumber + + " is different from marketplace name '" + marketplaceName + "' on previous line. This shouldn't be possible!"); } } @@ -620,67 +594,95 @@ namespace bnhtrade.Core.Data.Database.Repository.Implementation cmd.Parameters.AddWithValue("@currency", currency); - if (indexTransactionType == -1 || items[indexTransactionType].Length == 0) { cmd.Parameters.AddWithValue("@TransactionType", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@TransactionType", items[indexTransactionType]); } + if (indexTransactionType == -1 || rowArray[indexTransactionType].Length == 0) { cmd.Parameters.AddWithValue("@TransactionType", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@TransactionType", rowArray[indexTransactionType]); } - if (indexOrderId == -1 || items[indexOrderId].Length == 0) { cmd.Parameters.AddWithValue("@orderRef", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@orderRef", items[indexOrderId]); } + if (indexOrderId == -1 || rowArray[indexOrderId].Length == 0) { cmd.Parameters.AddWithValue("@orderRef", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@orderRef", rowArray[indexOrderId]); } - if (indexMerchantOrderId == -1 || items[indexMerchantOrderId].Length == 0) { cmd.Parameters.AddWithValue("@merchantOrderRef", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@merchantOrderRef", items[indexMerchantOrderId]); } + if (indexMerchantOrderId == -1 || rowArray[indexMerchantOrderId].Length == 0) { cmd.Parameters.AddWithValue("@merchantOrderRef", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@merchantOrderRef", rowArray[indexMerchantOrderId]); } - if (indexAdjustmentId == -1 || items[indexAdjustmentId].Length == 0) { cmd.Parameters.AddWithValue("@AdjustmentRef", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@AdjustmentRef", items[indexAdjustmentId]); } + if (indexAdjustmentId == -1 || rowArray[indexAdjustmentId].Length == 0) { cmd.Parameters.AddWithValue("@AdjustmentRef", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@AdjustmentRef", rowArray[indexAdjustmentId]); } - if (indexShipmentId == -1 || items[indexShipmentId].Length == 0) { cmd.Parameters.AddWithValue("@ShipmentRef", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@ShipmentRef", items[indexShipmentId]); } + if (indexShipmentId == -1 || rowArray[indexShipmentId].Length == 0) { cmd.Parameters.AddWithValue("@ShipmentRef", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@ShipmentRef", rowArray[indexShipmentId]); } - if (indexMarketplaceName == -1 || items[indexMarketplaceName].Length == 0) { cmd.Parameters.AddWithValue("@MarketplaceName", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@MarketplaceName", items[indexMarketplaceName]); } + if (indexMarketplaceName == -1 || rowArray[indexMarketplaceName].Length == 0) { cmd.Parameters.AddWithValue("@MarketplaceName", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@MarketplaceName", rowArray[indexMarketplaceName]); } - if (indexAmountType == -1 || items[indexAmountType].Length == 0) { cmd.Parameters.AddWithValue("@AmountType", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@AmountType", items[indexAmountType]); } + if (indexAmountType == -1 || rowArray[indexAmountType].Length == 0) { cmd.Parameters.AddWithValue("@AmountType", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@AmountType", rowArray[indexAmountType]); } - if (indexAmountDescription == -1 || items[indexAmountDescription].Length == 0) { cmd.Parameters.AddWithValue("@AmountDescription", DBNull.Value); } + if (indexAmountDescription == -1 || rowArray[indexAmountDescription].Length == 0) { cmd.Parameters.AddWithValue("@AmountDescription", DBNull.Value); } else { - string amountDescription = items[indexAmountDescription]; + string amountDescription = rowArray[indexAmountDescription]; if (amountDescription.Length > 100) { amountDescription = amountDescription.Substring(0, 100); } cmd.Parameters.AddWithValue("@AmountDescription", amountDescription); } - if (indexAmount == -1 || items[indexAmount].Length == 0) { cmd.Parameters.AddWithValue("@Amount", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@Amount", decimal.Parse(items[indexAmount].Replace(",", "."))); } + if (indexAmount == -1 || rowArray[indexAmount].Length == 0) { cmd.Parameters.AddWithValue("@Amount", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@Amount", decimal.Parse(rowArray[indexAmount].Replace(",", "."))); } - if (indexFulfillmentId == -1 || items[indexFulfillmentId].Length == 0) { cmd.Parameters.AddWithValue("@FulfillmentRef", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@FulfillmentRef", items[indexFulfillmentId]); } + if (indexFulfillmentId == -1 || rowArray[indexFulfillmentId].Length == 0) { cmd.Parameters.AddWithValue("@FulfillmentRef", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@FulfillmentRef", rowArray[indexFulfillmentId]); } - if (indexPostedDateTime == -1 || items[indexPostedDateTime].Length == 0) { cmd.Parameters.AddWithValue("@PostedDateTimeUTC", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@PostedDateTimeUTC", new Logic.Utilities.DateTime().ParseIsoDateTimeString(items[indexPostedDateTime])); } + if (indexPostedDateTime == -1 || rowArray[indexPostedDateTime].Length == 0) { cmd.Parameters.AddWithValue("@PostedDateTimeUTC", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@PostedDateTimeUTC", new Logic.Utilities.DateTime().ParseIsoDateTimeString(rowArray[indexPostedDateTime])); } - if (indexOrderItemCode == -1 || items[indexOrderItemCode].Length == 0) { cmd.Parameters.AddWithValue("@OrderItemCode", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@OrderItemCode", long.Parse(items[indexOrderItemCode])); } + if (indexOrderItemCode == -1 || rowArray[indexOrderItemCode].Length == 0) { cmd.Parameters.AddWithValue("@OrderItemCode", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@OrderItemCode", long.Parse(rowArray[indexOrderItemCode])); } - if (indexMerchantOrderItemId == -1 || items[indexMerchantOrderItemId].Length == 0) { cmd.Parameters.AddWithValue("@MerchantOrderItemRef", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@MerchantOrderItemRef", long.Parse(items[indexMerchantOrderItemId])); } + if (indexMerchantOrderItemId == -1 || rowArray[indexMerchantOrderItemId].Length == 0) { cmd.Parameters.AddWithValue("@MerchantOrderItemRef", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@MerchantOrderItemRef", long.Parse(rowArray[indexMerchantOrderItemId])); } - if (indexMerchantAdjustmentItemId == -1 || items[indexMerchantAdjustmentItemId].Length == 0) { cmd.Parameters.AddWithValue("@MerchantAdjustmentItemRef", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@MerchantAdjustmentItemRef", items[indexMerchantAdjustmentItemId]); } + if (indexMerchantAdjustmentItemId == -1 || rowArray[indexMerchantAdjustmentItemId].Length == 0) { cmd.Parameters.AddWithValue("@MerchantAdjustmentItemRef", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@MerchantAdjustmentItemRef", rowArray[indexMerchantAdjustmentItemId]); } - if (indexSku == -1 || items[indexSku].Length == 0) { cmd.Parameters.AddWithValue("@SkuNumber", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@SkuNumber", items[indexSku]); } + if (indexSku == -1 || rowArray[indexSku].Length == 0) { cmd.Parameters.AddWithValue("@SkuNumber", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@SkuNumber", rowArray[indexSku]); } - if (indexQuantityPurchased == -1 || items[indexQuantityPurchased].Length == 0) { cmd.Parameters.AddWithValue("@QuantityPurchased", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@QuantityPurchased", int.Parse(items[indexQuantityPurchased])); } + if (indexQuantityPurchased == -1 || rowArray[indexQuantityPurchased].Length == 0) { cmd.Parameters.AddWithValue("@QuantityPurchased", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@QuantityPurchased", int.Parse(rowArray[indexQuantityPurchased])); } - if (indexPromotionId == -1 || items[indexPromotionId].Length == 0) { cmd.Parameters.AddWithValue("@PromotionRef", DBNull.Value); } - else { cmd.Parameters.AddWithValue("@PromotionRef", items[indexPromotionId]); } + if (indexPromotionId == -1 || rowArray[indexPromotionId].Length == 0) { cmd.Parameters.AddWithValue("@PromotionRef", DBNull.Value); } + else { cmd.Parameters.AddWithValue("@PromotionRef", rowArray[indexPromotionId]); } cmd.ExecuteNonQuery(); } } lineNumber = lineNumber + 1; } + // end of filestream reading + + // if we haven't gotten the marketplace name from the line items, attempt to infer from currency + if (marketplaceName == null && settlementReportId > 0) + { + if (currency == "GBP") + { + marketplaceName = MarketPlaceEnum.AmazonUK.GetMarketplaceUrl(); + marketplaceName = char.ToUpper(marketplaceName[0]) + marketplaceName.Substring(1); + } + } + + // finally, if we have it, add marketplace name to main table + if (marketplaceName != null && settlementReportId > 0) + { + using (SqlCommand cmd = _connection.CreateCommand() as SqlCommand) + { + cmd.Transaction = _transaction as SqlTransaction; + cmd.CommandText = @" + UPDATE tblImportAmazonSettlementReport + SET [marketplace-name]=@MarketplaceName + WHERE ImportAmazonSettlementReportID=@ImportAmazonSettlementReportID;"; + cmd.Parameters.AddWithValue("@MarketplaceName", marketplaceName); + cmd.Parameters.AddWithValue("@ImportAmazonSettlementReportID", settlementReportId); + + cmd.ExecuteNonQuery(); + } + } } //final check - settlement amount matches sum of inserted settlement lines