/// <summary>
            /// Parse xml StockCount journal transaction data into object.
            /// </summary>
            /// <param name="xmlJournalTransaction">Xml format of a stock count journal Transaction.</param>
            /// <returns>Returns the StockCountJournalTransactions object.</returns>
            private static StockCountJournalTransaction ParseTransactions(XElement xmlJournalTransaction)
            {
                var    journalTransaction = new StockCountJournalTransaction();
                string recId = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "RecId");

                // Set default values for those not existing in AX
                journalTransaction.RecordId            = string.IsNullOrEmpty(recId) ? 0 : long.Parse(recId);
                journalTransaction.OperationType       = 0;
                journalTransaction.Quantity            = 0;
                journalTransaction.CountedDate         = DateTime.UtcNow;
                journalTransaction.StatusEnum          = StockCountStatus.Unchanged;
                journalTransaction.ItemId              = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "ItemId");
                journalTransaction.ItemName            = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "EcoResProductName");
                journalTransaction.InventDimId         = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "InventDimId");
                journalTransaction.Counted             = Convert.ToDecimal(TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "Counted"));
                journalTransaction.InventBatchId       = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "InventBatchId");
                journalTransaction.WarehouseLocationId = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "WmsLocationId");
                journalTransaction.WarehousePalletId   = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "WmsPalletId");
                journalTransaction.InventSiteId        = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "InventSiteId");
                journalTransaction.InventLocationId    = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "InventLocationId");
                journalTransaction.ConfigId            = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "ConfigId");
                journalTransaction.InventSizeId        = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "InventSizeId");
                journalTransaction.InventColorId       = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "InventColorId");
                journalTransaction.InventStyleId       = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "InventStyleId");
                journalTransaction.InventSerialId      = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "InventSerialId");
                journalTransaction.TrackingGuid        = new Guid(TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "Guid"));
                journalTransaction.UpdatedInAx         = Convert.ToBoolean(TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "UpdatedInAx"));
                journalTransaction.Message             = TransactionServiceClient.GetAttributeValue(xmlJournalTransaction, "Message");

                return(journalTransaction);
            }
            /// <summary>
            /// Serialize to xml format of a SC journal transaction.
            /// </summary>
            /// <param name="journalTransaction">Enter the StockCountJournal transaction object.</param>
            /// <returns>Xml format of a SC journal transaction.</returns>
            private static string ToXml(StockCountJournalTransaction journalTransaction)
            {
                ThrowIf.Null(journalTransaction, "journalTransaction");

                XElement inventJournalTrans = new XElement(
                    "InventJournalTrans",
                    new XAttribute("RecId", journalTransaction.RecordId),
                    new XAttribute("ItemId", journalTransaction.ItemId ?? string.Empty),
                    new XAttribute("EcoResProductName", journalTransaction.ItemName ?? string.Empty),
                    new XAttribute("InventDimId", journalTransaction.InventDimId ?? string.Empty),
                    new XAttribute("Counted", journalTransaction.Quantity),
                    new XAttribute("InventBatchId", journalTransaction.InventBatchId ?? string.Empty),
                    new XAttribute("WmsLocationId", journalTransaction.WarehouseLocationId ?? string.Empty),
                    new XAttribute("WmsPalletId", journalTransaction.WarehousePalletId ?? string.Empty),
                    new XAttribute("InventSiteId", journalTransaction.InventSiteId ?? string.Empty),
                    new XAttribute("InventLocationId", journalTransaction.InventLocationId ?? string.Empty),
                    new XAttribute("ConfigId", journalTransaction.ConfigId ?? string.Empty),
                    new XAttribute("InventSizeId", journalTransaction.InventSizeId ?? string.Empty),
                    new XAttribute("InventColorId", journalTransaction.InventColorId ?? string.Empty),
                    new XAttribute("InventStyleId", journalTransaction.InventStyleId ?? string.Empty),
                    new XAttribute("InventSerialId", journalTransaction.InventSerialId ?? string.Empty),
                    new XAttribute("Guid", journalTransaction.TrackingGuid));

                return(inventJournalTrans.ToString());
            }
            /// <summary>
            /// Retrieves Stock Count journal Transactions from AX.
            /// </summary>
            /// <param name="journalId">Pass JournalId.</param>
            /// <param name="inventLocationId">Pass Invent Location Id.</param>
            /// <returns>Returns the StockCount journal Transactions.</returns>
            public PagedResult <StockCountJournalTransaction> GetStockCountJournalsTransaction(string journalId, string inventLocationId)
            {
                ThrowIf.Null <string>(journalId, "journalId");
                ThrowIf.Null <string>(inventLocationId, "inventoryLocationId");

                var data = this.InvokeMethod(GetInventJournalTransactionMethodName, journalId, inventLocationId);

                IEnumerable <StockCountJournalTransaction> journalTransactions = new List <StockCountJournalTransaction>();

                if (!string.IsNullOrWhiteSpace(data[0].ToString()))
                {
                    XDocument doc  = XDocument.Parse(data[0].ToString());
                    XElement  root = doc.Elements("InventJournalTable").FirstOrDefault();

                    if (root != null)
                    {
                        journalTransactions = root.Elements("InventJournalTrans").Select <XElement, StockCountJournalTransaction>(
                            (scLine) =>
                        {
                            StockCountJournalTransaction scJournalTransaction = TransactionServiceClient.ParseTransactions(scLine);

                            return(scJournalTransaction);
                        }).ToList <StockCountJournalTransaction>();
                    }
                }

                return(journalTransactions.AsPagedResult());
            }
            /// <summary>
            /// Creates the <see cref="StockCountJournal"/> object to commit to AX.
            /// </summary>
            /// <param name="context">The request context.</param>
            /// <param name="journalId">The journal identifier.</param>
            /// <returns>
            /// The stock count journal with transaction lines to be committed to AX.
            /// </returns>
            private static StockCountJournal ConstructAxStockJournal(RequestContext context, string journalId)
            {
                ChannelConfiguration channelConfiguration = context.GetChannelConfiguration();

                var dataRequest = new GetStockCountDataRequest
                {
                    TransactionRecordsOnly = true,
                    JournalId           = journalId,
                    QueryResultSettings = QueryResultSettings.AllRecords
                };

                var currentScDbTransactions = context.Runtime.Execute <EntityDataServiceResponse <StockCountJournalTransaction> >(dataRequest, context).PagedEntityCollection.Results;

                StockCountJournal stockCountJournal = new StockCountJournal();

                stockCountJournal.JournalId = journalId;

                foreach (var currScDbTran in currentScDbTransactions)
                {
                    StockCountJournalTransaction journalTransaction = new StockCountJournalTransaction();

                    journalTransaction.RecordId         = currScDbTran.RecordId;
                    journalTransaction.ItemId           = currScDbTran.ItemId;
                    journalTransaction.ItemName         = currScDbTran.ItemName;
                    journalTransaction.Counted          = currScDbTran.Counted;
                    journalTransaction.Quantity         = currScDbTran.Quantity;
                    journalTransaction.ConfigId         = currScDbTran.ConfigId;
                    journalTransaction.TrackingGuid     = currScDbTran.TrackingGuid;
                    journalTransaction.InventColorId    = currScDbTran.InventColorId;
                    journalTransaction.InventSizeId     = currScDbTran.InventSizeId;
                    journalTransaction.InventStyleId    = currScDbTran.InventStyleId;
                    journalTransaction.InventDimId      = currScDbTran.InventDimId;
                    journalTransaction.InventSiteId     = currScDbTran.InventSiteId;
                    journalTransaction.InventLocationId = channelConfiguration.InventLocation;
                    journalTransaction.Status           = currScDbTran.Status;

                    stockCountJournal.StockCountTransactionLines.Add(journalTransaction);
                }

                return(stockCountJournal);
            }
            /// <summary>
            /// Commits the StockCount transactions to AX.
            /// </summary>
            /// <param name="context">The request context.</param>
            /// <param name="journalId">The journal identifier.</param>
            /// <param name="transactions">A collection of stock count transactions to commit to AX.</param>
            /// <returns>The response object.</returns>
            public static CommitStockCountTransactionsServiceResponse CommitStockCountTransactions(RequestContext context, string journalId, IEnumerable <StockCountJournalTransaction> transactions)
            {
                // Save the StockCount transactions into DB before commiting to AX.
                AddUpdateStockCount(journalId, context, transactions);

                var stockCountJournal                 = ConstructAxStockJournal(context, journalId);
                var commitStockCountsRequest          = new CommitStockCountJournalRealtimeRequest(stockCountJournal);
                StockCountJournal commitedStockCounts = context.Execute <SingleEntityDataServiceResponse <StockCountJournal> >(commitStockCountsRequest).Entity;

                var removeStockCountTrans = new List <StockCountJournalTransaction>();

                if (commitedStockCounts != null)
                {
                    foreach (var transactionLine in stockCountJournal.StockCountTransactionLines)
                    {
                        StockCountJournalTransaction updatedLine = commitedStockCounts.StockCountTransactionLines
                                                                   .FirstOrDefault(
                            line => string.Equals(
                                line.TrackingGuid.ToString(),
                                transactionLine.TrackingGuid.ToString(),
                                StringComparison.OrdinalIgnoreCase) &&
                            line.UpdatedInAx);

                        if (updatedLine != null)
                        {
                            removeStockCountTrans.Add(updatedLine);
                        }
                    }
                }

                // This deletes both the journals and transactions.
                var deleteDataRequest = new DeleteStockCountJournalsDataRequest(commitedStockCounts.JournalId);

                context.Runtime.Execute <NullResponse>(deleteDataRequest, context);

                return(new CommitStockCountTransactionsServiceResponse());
            }