/// <summary>
            /// Commits stock count journals in AX.
            /// </summary>
            /// <param name="request">The request.</param>
            /// <returns>The <see cref="StockCountJournal"/> journal.</returns>
            private static SingleEntityDataServiceResponse <StockCountJournal> CommitStockCountJournal(CommitStockCountJournalRealtimeRequest request)
            {
                var transactionClient = new TransactionService.TransactionServiceClient(request.RequestContext);
                StockCountJournal stockCountJournal = transactionClient.CommitStockCounts(request.Journal);

                return(new SingleEntityDataServiceResponse <StockCountJournal>(stockCountJournal));
            }
            /// <summary>
            /// Retrieves the Stock Count Journals from AX.
            /// </summary>
            /// <param name="inventLocationId">Pass Invent Location Id.</param>
            /// <returns>Returns the StockCountJournal list from AX.</returns>
            public PagedResult <StockCountJournal> GetStockCountJournals(string inventLocationId)
            {
                ThrowIf.Null <string>(inventLocationId, "inventoryLocationId");

                var data = this.InvokeMethod(GetInventJournalsMethodName, inventLocationId);

                IEnumerable <StockCountJournal> journals = new List <StockCountJournal>();

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

                    if (root != null)
                    {
                        journals = root.Elements("InventJournalTable").Select <XElement, StockCountJournal>(
                            (sc) =>
                        {
                            StockCountJournal scJournal = TransactionServiceClient.Parse(sc);

                            return(scJournal);
                        });
                    }
                }

                return(journals.AsPagedResult());
            }
            /// <summary>
            /// Commits the Stock count journals and transactions to AX.
            /// </summary>
            /// <param name="stockCountJournal">Pass in stock count journal.</param>
            /// <returns>Returns the stock count journal created.</returns>
            public StockCountJournal CommitStockCounts(StockCountJournal stockCountJournal)
            {
                ThrowIf.Null <StockCountJournal>(stockCountJournal, "stockCountJournal");

                // Filter stock count line that has status pending updates.
                stockCountJournal.StockCountTransactionLines = stockCountJournal.StockCountTransactionLines
                                                               .Where(stockCountLine => stockCountLine.StatusEnum == StockCountStatus.PendingUpdate).ToList();

                string importValue = TransactionServiceClient.ToXml(stockCountJournal);

                var data = this.InvokeMethod(UpdateInventJournalsMethodName, importValue);

                var 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) =>
                        {
                            var scJournalTransaction = TransactionServiceClient.ParseTransactions(scLine);

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

                stockCountJournal.StockCountTransactionLines.Clear();
                stockCountJournal.StockCountTransactionLines.AddRange(journalTransactions);

                return(stockCountJournal);
            }
            /// <summary>
            /// Parse StockCount journal xml data into object.
            /// </summary>
            /// <param name="xmlJournal">Xml format of a stock count journal.</param>
            /// <returns>Returns the StockCountJournal object.</returns>
            private static StockCountJournal Parse(XElement xmlJournal)
            {
                var journal = new StockCountJournal();

                journal.RecordId    = TransactionServiceClient.GetAttributeValue(xmlJournal, "RecId");
                journal.JournalId   = TransactionServiceClient.GetAttributeValue(xmlJournal, "JournalId");
                journal.Description = TransactionServiceClient.GetAttributeValue(xmlJournal, "Description");

                return(journal);
            }
            /// <summary>
            /// Saves the stock count journal transactions.
            /// </summary>
            /// <param name="journalId">The stock count journal identifier.</param>
            /// <param name="context">The request context.</param>
            /// <param name="transactions">A collection of stock count journal transactions.</param>
            /// <returns>
            /// The response.
            /// </returns>
            public static SaveStockCountJournalTransactionServiceResponse SaveStockCountJournalTransactions(string journalId, RequestContext context, IEnumerable <StockCountJournalTransaction> transactions)
            {
                AddUpdateStockCount(journalId, context, transactions);

                // Refresh the stock count lines from database.
                var stockCountJournalTransactionResponse = GetStockCountJournalTransactions(context, journalId);

                var stockCountJournalResponse = new StockCountJournal {
                    JournalId = journalId, StockCountTransactionLines = stockCountJournalTransactionResponse.StockCountJournalTransactions.Results
                };

                return(new SaveStockCountJournalTransactionServiceResponse(stockCountJournalResponse));
            }
            /// <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>
            /// Serialize to xml format of a stock count journal.
            /// </summary>
            /// <param name="journal">Enter the StockCountJournal object.</param>
            /// <returns>Xml format of a stock count journal.</returns>
            private static string ToXml(StockCountJournal journal)
            {
                ThrowIf.Null(journal, "journal");

                StringBuilder strOutput = new StringBuilder();

                strOutput.Append("<InventJournalTable");
                strOutput.Append(" JournalId=\"" + journal.JournalId + "\"");
                strOutput.Append(" RecId=\"" + journal.RecordId + "\"");
                strOutput.Append(" Worker=\"" + journal.Worker + "\"");
                strOutput.Append(">");

                foreach (var line in journal.StockCountTransactionLines)
                {
                    strOutput.Append(TransactionServiceClient.ToXml(line));
                }

                strOutput.Append("</InventJournalTable>");

                return(strOutput.ToString());
            }
            /// <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());
            }
            /// <summary>
            /// Create a stock count journal.
            /// </summary>
            /// <param name="inventoryLocationId">Pass Invent Location Id.</param>
            /// <param name="description">Pass journal's description.</param>
            /// <returns>Returns the StockCountJournal list from AX.</returns>
            public PagedResult <StockCountJournal> CreateStockCountJournal(string inventoryLocationId, string description)
            {
                var data = this.InvokeMethod(CreateInventoryJournalMethodName, inventoryLocationId, description);

                IEnumerable <StockCountJournal> journals = new List <StockCountJournal>();

                if (!string.IsNullOrEmpty(data[0].ToString()))
                {
                    XDocument doc = XDocument.Parse(data[0].ToString());

                    if (doc != null)
                    {
                        journals = doc.Elements("InventJournalTable").Select <XElement, StockCountJournal>(
                            (sc) =>
                        {
                            StockCountJournal scJournal = TransactionServiceClient.Parse(sc);

                            return(scJournal);
                        });
                    }
                }

                return(journals.AsPagedResult());
            }
 public Task Delete(StockCountJournal entity)
 {
     // Should use RemoveJournal() call rather than this call.
     throw new NotSupportedException();
 }
 public Task <StockCountJournal> Update(StockCountJournal entity)
 {
     return(Task.Run(() => InventoryManager.Create(CommerceRuntimeManager.Runtime).CreateOrUpdateStockCountJournal(entity)));
 }