/// <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); }
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)); }