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 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));
            }
示例#3
0
            private GetReceiptServiceRequest CreateXZReportReceiptServiceRequest(GetXAndZReportReceiptRequest request)
            {
                ThrowIf.Null(request, "request");

                Shift shift;

                var shiftId     = request.ShiftId;
                var receiptType = request.ReceiptType;

                // Validates if the request is XReport or ZReport type
                if ((receiptType != ReceiptType.XReport) && (receiptType != ReceiptType.ZReport))
                {
                    throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ReceiptTypeNotSupported, "Only receipt types for X or Z reports are expected.");
                }

                if (receiptType == ReceiptType.XReport)
                {
                    var terminalId = request.ShiftTerminalId;
                    GetShiftDataRequest getShiftDataRequest = new GetShiftDataRequest(terminalId, shiftId);
                    shift = this.Context.Execute <SingleEntityDataServiceResponse <Shift> >(getShiftDataRequest).Entity;

                    // Validates if an open or blind-closed shift of the ShiftId can be found when requesting XReport
                    if (shift == null ||
                        (shift.Status != ShiftStatus.Open && shift.Status != ShiftStatus.BlindClosed))
                    {
                        throw new DataValidationException(
                                  DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ShiftNotFound,
                                  string.Format("No open shift information can be found using the shift Id {0} on terminal {1} for X report.", shiftId, terminalId));
                    }

                    // Calculates the shift information inorder to generate the X report
                    ShiftCalculator.Calculate(this.Context, shift, shift.TerminalId, shift.ShiftId);
                }
                else
                {
                    var terminalId = this.Context.GetTerminal().TerminalId;
                    GetLastClosedShiftDataRequest getLastClosedShiftDataRequest = new GetLastClosedShiftDataRequest(terminalId);
                    shift = this.Context.Execute <SingleEntityDataServiceResponse <Shift> >(getLastClosedShiftDataRequest).Entity;

                    // Validates if a closed shift of the ShiftId can be found when requesting XReport
                    if (shift == null || shift.Status != ShiftStatus.Closed)
                    {
                        throw new DataValidationException(
                                  DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_ShiftNotFound,
                                  string.Format("No closed shift information can be found using the shift Id {0} on terminal {1} for Z report.", shiftId, terminalId));
                    }
                }

                var getReceiptServiceRequest = new GetReceiptServiceRequest(
                    shift,
                    new List <ReceiptType>()
                {
                    receiptType
                }.AsReadOnly(),
                    request.HardwareProfileId);

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