/// <summary>
            /// Get item availabilities by requested item quantities.
            /// </summary>
            /// <param name="request">The request.</param>
            /// <returns><see cref="NullResponse"/> object.</returns>
            private NullResponse DeleteStockCountJournals(DeleteStockCountJournalsDataRequest request)
            {
                var dataManager = new StockCountDataManager(request.RequestContext);

                dataManager.DeleteStockCountJournals(request.JournalIds);

                return(new NullResponse());
            }
            /// <summary>
            /// Deletes the stock count journal in channel and AX databases.
            /// </summary>
            /// <param name="context">The request context.</param>
            /// <param name="journalId">The journal identifier.</param>
            /// <returns>
            /// An empty response object.
            /// </returns>
            public static DeleteStockCountServiceResponse DeleteStockCountJournal(RequestContext context, string journalId)
            {
                // Delete the specified stock count journal as well as its journal transation(s) in AX database
                var deleteJournalRealtimeRequest = new DeleteStockCountJournalRealtimeRequest(journalId);

                context.Execute <NullResponse>(deleteJournalRealtimeRequest);

                // Delete the specified stock count journal as well as its journal transation(s) in channel database
                var deleteDataRequest = new DeleteStockCountJournalsDataRequest(journalId);

                context.Execute <NullResponse>(deleteDataRequest);

                return(new DeleteStockCountServiceResponse());
            }
            /// <summary>
            /// Syncs StockCount journal from AX.
            /// </summary>
            /// <param name="context">The request context.</param>
            /// <returns>The response.</returns>
            public static SyncStockCountJournalsFromAxServiceResponse SyncStockCountJournalFromAx(RequestContext context)
            {
                var stockCountJournals = GetStockCountJournalsFromAx(context);

                // Remove stock count journals that are not available on AX anymore.
                var journalsToRemoved = GetUnusedJournals(context, stockCountJournals);
                var dataRequest       = new DeleteStockCountJournalsDataRequest(journalsToRemoved.Select(journal => journal.JournalId));

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

                AddUpdateStockCountJournal(context, stockCountJournals);

                // Get all the stock count journals from RetailServer database and send the dataset to client.
                var stockDataRequest = new GetStockCountDataRequest {
                    QueryResultSettings = QueryResultSettings.AllRecords
                };
                var currentJournals = context.Runtime.Execute <EntityDataServiceResponse <StockCountJournal> >(stockDataRequest, context).PagedEntityCollection;

                return(new SyncStockCountJournalsFromAxServiceResponse(currentJournals));
            }
            /// <summary>
            /// Creates the StockCount Journal in AX
            /// If the StockCount creation is successful, it syncs the changes from AX to RetailServer tables.
            /// It deletes all the journals that are saved locally.
            /// </summary>
            /// <param name="context">The request context.</param>
            /// <param name="description">The journal description.</param>
            /// <returns>
            /// The stock count journal response.
            /// </returns>
            public static CreateStockCountJournalServiceResponse CreateStockCountJournal(RequestContext context, string description)
            {
                var channelConfiguration = context.GetChannelConfiguration();

                var createStockCountJournalRealtimeRequest = new CreateStockCountJournalRealtimeRequest(channelConfiguration.InventLocation, description);
                var createdStockCountJournal = context.Execute <EntityDataServiceResponse <StockCountJournal> >(createStockCountJournalRealtimeRequest).PagedEntityCollection.Results;

                var stockCountJournalsRequest = new GetStockCountJournalsRealtimeRequest(channelConfiguration.InventLocation);
                var stockCountJournalList     = context.Execute <EntityDataServiceResponse <StockCountJournal> >(stockCountJournalsRequest).PagedEntityCollection.Results;

                AddUpdateStockCountJournal(context, stockCountJournalList);

                var stockCountListToDelete = GetUnusedJournals(context, stockCountJournalList);

                // Deletes the unused journals that are saved locally in RetailServer
                if (stockCountListToDelete != null && stockCountListToDelete.Count > 0)
                {
                    var deleteRequest = new DeleteStockCountJournalsDataRequest(stockCountListToDelete.Select(journal => journal.JournalId));
                    context.Runtime.Execute <NullResponse>(deleteRequest, context);
                }

                return(new CreateStockCountJournalServiceResponse(createdStockCountJournal.FirstOrDefault()));
            }
            /// <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());
            }