/// <summary>
            /// Gets the transaction for custom receipts.
            /// </summary>
            /// <param name="request">The get receipt request.</param>
            /// <returns>The sales order.</returns>
            /// <remarks>
            /// This method is used to handle custom receipt. Since only sales order related receipt
            /// is using receipt designer while others are hardcoded, so we cannot support customizing receipts for
            /// NonSalesTransaction or DropAndDeclareTransaction.
            /// Here we first try to load the SalesOrder, if we cannot find it, then try to load
            /// a cart and convert it to sales order.
            /// </remarks>
            private SalesOrder GetTransactionForCustomReceipt(GetReceiptRequest request)
            {
                ReceiptRetrievalCriteria criteria = request.ReceiptRetrievalCriteria;
                string transactionId = request.TransactionId;

                SalesOrder salesOrder = null;

                if (!criteria.QueryBySalesId)
                {
                    salesOrder = this.GetTransactionByTransactionId(transactionId, false) ?? this.GetTransactionByTransactionId(transactionId, true);
                }
                else
                {
                    try
                    {
                        salesOrder = this.GetTransactionBySalesId(transactionId);
                    }
                    catch (FeatureNotSupportedException)
                    {
                        // Not able to get sales order in offline mode.
                    }
                }

                // If cannot find a sales order, then try to find a cart (suspended transaction).
                if (salesOrder == null)
                {
                    SalesTransaction salesTransaction = CartWorkflowHelper.LoadSalesTransaction(request.RequestContext, request.TransactionId);
                    if (salesTransaction != null)
                    {
                        salesOrder = new SalesOrder();

                        // Now ReceiptService only accept SalesOrder. So in order to reuse the code in ReceiptService, we need to convert
                        // SalesTransaction to SalesOrder. SalesOrder is extended from SalesTransaction, so in this case we are good. But
                        // in the future we should refactor ReceiptService to make it accept a common interface so that we can extend to
                        // other objects.
                        salesOrder.CopyFrom(salesTransaction);
                    }
                    else
                    {
                        throw new DataValidationException(
                                  DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ObjectNotFound,
                                  string.Format("Unable to get the transaction created. ID: {0}", transactionId));
                    }
                }

                return(salesOrder);
            }
            private SalesOrder GetSalesOrder(string transactionId, ReceiptRetrievalCriteria criteria)
            {
                SalesOrder salesOrder;

                if (!criteria.QueryBySalesId)
                {
                    // Changed to fix the following bug
                    // [GetReceipts() API requires UI to feed isRemoteOrder parameter, which is not possible in certain scenarios]
                    salesOrder = this.GetTransactionByTransactionId(transactionId, false) ?? this.GetTransactionByTransactionId(transactionId, true);
                }
                else
                {
                    salesOrder = this.GetTransactionBySalesId(transactionId);
                }

                if (salesOrder == null)
                {
                    throw new DataValidationException(
                              DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ObjectNotFound,
                              string.Format("Unable to get the sales order created. ID: {0}", transactionId));
                }

                return(salesOrder);
            }
示例#3
0
 public Task <PagedResult <Receipt> > GetReceipts(string id, ReceiptRetrievalCriteria receiptRetrievalCriteria, QueryResultSettings queryResultSettings)
 {
     return(Task.Run(() => OrderManager.Create(CommerceRuntimeManager.Runtime).GetReceipts(id, receiptRetrievalCriteria, queryResultSettings)));
 }
            /// <summary>
            /// Processes the GetReceiptRequest to return the set of receipts. The request should not be null.
            /// </summary>
            /// <param name="request">The request parameter.</param>
            /// <returns>The GetReceiptResponse.</returns>
            protected override GetReceiptResponse Process(GetReceiptRequest request)
            {
                ThrowIf.Null(request, "request");
                ThrowIf.Null(request.ReceiptRetrievalCriteria, "request.ReceiptRetrievalCriteria");

                ReceiptRetrievalCriteria criteria = request.ReceiptRetrievalCriteria;

                if (string.IsNullOrWhiteSpace(request.TransactionId))
                {
                    throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ObjectNotFound, "Transaction identifier must be provided.");
                }

                switch (criteria.ReceiptType)
                {
                case ReceiptType.BankDrop:
                case ReceiptType.SafeDrop:
                case ReceiptType.TenderDeclaration:
                {
                    return(this.GetReceiptForDropAndDeclarationTransaction(request.TransactionId, criteria));
                }

                case ReceiptType.FloatEntry:
                case ReceiptType.StartingAmount:
                case ReceiptType.RemoveTender:
                {
                    return(this.GetReceiptForNonSalesTransaction(request.TransactionId, criteria));
                }

                case ReceiptType.PackingSlip:
                {
                    SalesOrder salesOrder   = this.GetSalesOrder(request.TransactionId, criteria);
                    var        receiptTypes = new HashSet <ReceiptType> {
                        ReceiptType.PackingSlip
                    };

                    return(this.GetReceiptsForSalesTransaction(salesOrder, receiptTypes, criteria));
                }

                case ReceiptType.PickupReceipt:
                {
                    SalesOrder            salesOrder   = this.GetSalesOrder(request.TransactionId, criteria);
                    HashSet <ReceiptType> receiptTypes = ReceiptWorkflowHelper.GetSalesTransactionReceiptTypes(salesOrder, this.Context);

                    // The server does not have enought information to tell if a customer is picking up products
                    // so client must explicitly tell the server that pickup receipt needs to be printed.
                    receiptTypes.Add(ReceiptType.PickupReceipt);

                    // If we are printing PickupReceipt then do not print SalesOrderReceipt
                    if (receiptTypes.Contains(ReceiptType.SalesOrderReceipt))
                    {
                        receiptTypes.Remove(ReceiptType.SalesOrderReceipt);
                    }

                    return(this.GetReceiptsForSalesTransaction(salesOrder, receiptTypes, criteria));
                }

                // SalesOrderReceipt is for N-1.
                case ReceiptType.SalesOrderReceipt:
                case ReceiptType.Unknown:
                {
                    SalesOrder            salesOrder   = this.GetSalesOrder(request.TransactionId, criteria);
                    HashSet <ReceiptType> receiptTypes = ReceiptWorkflowHelper.GetSalesTransactionReceiptTypes(salesOrder, this.Context);

                    return(this.GetReceiptsForSalesTransaction(salesOrder, receiptTypes, criteria));
                }

                // Receipts types requested from ShowJournal should return only the given receipt type
                case ReceiptType.SalesReceipt:
                case ReceiptType.GiftReceipt:
                {
                    SalesOrder salesOrder   = this.GetSalesOrder(request.TransactionId, criteria);
                    var        receiptTypes = new HashSet <ReceiptType> {
                        criteria.ReceiptType
                    };

                    return(this.GetReceiptsForSalesTransaction(salesOrder, receiptTypes, criteria));
                }

                case ReceiptType.CustomReceipt1:
                case ReceiptType.CustomReceipt2:
                case ReceiptType.CustomReceipt3:
                case ReceiptType.CustomReceipt4:
                case ReceiptType.CustomReceipt5:
                {
                    SalesOrder salesOrder   = this.GetTransactionForCustomReceipt(request);
                    var        receiptTypes = new HashSet <ReceiptType> {
                        criteria.ReceiptType
                    };

                    var getReceiptServiceRequest = new GetReceiptServiceRequest(
                        salesOrder,
                        receiptTypes,
                        salesOrder.TenderLines,
                        criteria.IsCopy,
                        criteria.IsPreview,
                        criteria.HardwareProfileId);

                    var getReceiptServiceResponse = this.Context.Execute <GetReceiptServiceResponse>(getReceiptServiceRequest);
                    return(new GetReceiptResponse(getReceiptServiceResponse.Receipts));
                }

                default:
                    throw new FeatureNotSupportedException(FeatureNotSupportedErrors.Microsoft_Dynamics_Commerce_Runtime_ReceiptTypeNotSupported, string.Format("The following receipt type is not supported: {0}", criteria.ReceiptType.ToString()));
                }
            }
            private GetReceiptResponse GetReceiptsForSalesTransaction(SalesOrder salesOrder, IEnumerable <ReceiptType> receiptTypes, ReceiptRetrievalCriteria criteria)
            {
                if (!string.IsNullOrEmpty(salesOrder.ReceiptEmail))
                {
                    try
                    {
                        this.SendReceiptMail(salesOrder);
                    }
                    catch (CommunicationException)
                    {
                        // If failed to send email receipt, we still need to print paper receipt.
                    }
                    catch (FeatureNotSupportedException)
                    {
                        // Sending email receipt is not supported in offline mode.
                    }
                }

                var getReceiptServiceRequest = new GetReceiptServiceRequest(
                    salesOrder,
                    receiptTypes,
                    salesOrder.TenderLines,
                    criteria.IsCopy,
                    criteria.IsPreview,
                    criteria.HardwareProfileId);

                var getReceiptServiceResponse = this.Context.Execute <GetReceiptServiceResponse>(getReceiptServiceRequest);

                return(new GetReceiptResponse(getReceiptServiceResponse.Receipts));
            }
            private GetReceiptResponse GetReceiptForDropAndDeclarationTransaction(string transactionId, ReceiptRetrievalCriteria criteria)
            {
                DropAndDeclareTransaction dropAndDeclareTransaction = this.GetDropAndDeclareTransaction(transactionId);

                var getReceiptServiceRequest  = new GetReceiptServiceRequest(dropAndDeclareTransaction, criteria.ReceiptType, criteria.IsCopy, criteria.IsPreview, criteria.HardwareProfileId);
                var getReceiptServiceResponse = this.Context.Execute <GetReceiptServiceResponse>(getReceiptServiceRequest);

                return(new GetReceiptResponse(getReceiptServiceResponse.Receipts));
            }
            private GetReceiptResponse GetReceiptForNonSalesTransaction(string transactionId, ReceiptRetrievalCriteria criteria)
            {
                NonSalesTransaction nonSalesTransaction = null;
                long shiftId = criteria.ShiftId.GetValueOrDefault(0);

                switch (criteria.ReceiptType)
                {
                case ReceiptType.FloatEntry:
                    nonSalesTransaction = this.GetNonSaleTransaction(transactionId, TransactionType.FloatEntry, shiftId, criteria.ShiftTerminalId);
                    break;

                case ReceiptType.StartingAmount:
                    nonSalesTransaction = this.GetNonSaleTransaction(transactionId, TransactionType.StartingAmount, shiftId, criteria.ShiftTerminalId);
                    break;

                case ReceiptType.RemoveTender:
                    nonSalesTransaction = this.GetNonSaleTransaction(transactionId, TransactionType.RemoveTender, shiftId, criteria.ShiftTerminalId);
                    break;
                }

                var getReceiptServiceRequest  = new GetReceiptServiceRequest(nonSalesTransaction, criteria.ReceiptType, criteria.IsCopy, criteria.IsPreview, criteria.HardwareProfileId);
                var getReceiptServiceResponse = this.Context.Execute <GetReceiptServiceResponse>(getReceiptServiceRequest);

                return(new GetReceiptResponse(getReceiptServiceResponse.Receipts));
            }