/// <summary> /// Adds or updates reason code lines. /// </summary> /// <param name="reasonCodeLinesToUpdate">The reason code lines to update.</param> /// <param name="reasonCodeLines">The reason code lines.</param> /// <param name="transactionId">The transaction id.</param> /// <param name="parentLineId">The parent line id.</param> /// <param name="reasonCodeLineType">The reason code line type.</param> internal static void AddOrUpdateReasonCodeLinesHelper(ICollection <ReasonCodeLine> reasonCodeLinesToUpdate, IEnumerable <ReasonCodeLine> reasonCodeLines, string transactionId, string parentLineId, ReasonCodeLineType reasonCodeLineType) { var reasonCodeLinesToUpdateById = reasonCodeLinesToUpdate.ToDictionary(r => r.ReasonCodeId); foreach (ReasonCodeLine reasonCodeLine in reasonCodeLines) { // we cannot add two reason code lines with same reason code identifier // in this case, it should be an update if (string.IsNullOrWhiteSpace(reasonCodeLine.LineId) && !reasonCodeLinesToUpdateById.ContainsKey(reasonCodeLine.ReasonCodeId)) { reasonCodeLine.LineId = Guid.NewGuid().ToString("N"); ReasonCodeLine newReasonCodeLine = new ReasonCodeLine(); newReasonCodeLine.CopyFrom(reasonCodeLine); newReasonCodeLine.ParentLineId = parentLineId; newReasonCodeLine.TransactionId = transactionId; newReasonCodeLine.LineType = reasonCodeLineType; // Add new reason code line to sales tranaction. reasonCodeLinesToUpdate.Add(newReasonCodeLine); } else { // Update the corresponding reason code line if changed. ReasonCodeLine reasonCodeLineToUpdate; if (reasonCodeLinesToUpdateById.TryGetValue(reasonCodeLine.ReasonCodeId, out reasonCodeLineToUpdate)) { reasonCodeLineToUpdate.CopyPropertiesFrom(reasonCodeLine); reasonCodeLineToUpdate.IsChanged = true; } } } }
/// <summary> /// Gets the return reason code for the transaction or empty, if none. /// </summary> /// <param name="salesTransaction">The sales transaction to get the reason code from.</param> /// <param name="context">The request context.</param> /// <returns>The reason code for the transaction or empty if none.</returns> private static string GetReturnReasonCodeId(SalesTransaction salesTransaction, RequestContext context) { // transaction server expects only one reason code, so we just take it from the first line that has reason codes SalesLine firstLineWithReasonCode = salesTransaction.SalesLines.FirstOrDefault(sl => sl.ReasonCodeLines.Any()); GetReturnOrderReasonCodesDataRequest getReturnOrderReasonCodesDataRequest = new GetReturnOrderReasonCodesDataRequest(QueryResultSettings.AllRecords); ReadOnlyCollection <ReasonCode> returnOrderReasonCodes = context.Runtime.Execute <EntityDataServiceResponse <ReasonCode> >(getReturnOrderReasonCodesDataRequest, context).PagedEntityCollection.Results; ReasonCodeLine returnReasonCodeLine = firstLineWithReasonCode != null ? firstLineWithReasonCode.ReasonCodeLines.FirstOrDefault(reasonCodeLine => returnOrderReasonCodes.Any(returnOrderReasonCode => returnOrderReasonCode.ReasonCodeId == reasonCodeLine.ReasonCodeId)) : null; return((returnReasonCodeLine != null && !string.IsNullOrWhiteSpace(returnReasonCodeLine.ReasonCodeId)) ? returnReasonCodeLine.ReasonCodeId : null); }