/// <summary> /// Create the eagle payment and queue item for settlement after payment through service /// </summary> /// <param name="result">result of payment service</param> /// <param name="order">order paid to with bookings</param> /// <param name="note">note for payment</param> /// <returns>true if successful</returns> internal bool CreatePaymentAndQueueToSettlement(PreAuthPaymentResult result, Model.Order.Order order, string note) { if (result.Success) { if (order != null) { Model.Booking.Booking firstBooking = order.Bookings.FirstOrDefault(); var paymentType = result.Amount > 0 ? PaymentTypeEnum.Payment : PaymentTypeEnum.Refund; Payment payment = new Payment { Amount = result.Amount, OrderId = order.Id.Value, CreatedByUserId = order.UpdatedByUserId, PaymentMethodEnum = PaymentMethodEnum.CreditCard, // assume credit card for now PaymentMethod = new PaymentMethod { Code = PaymentMethodEnum.CreditCard.GetCode() }, CardLast4Digits = result.LastCardDigits, PaymentSource = new PaymentSource { Code = PaymentSourceEnum.Online.GetCode() }, PaymentSourceEnum = PaymentSourceEnum.Online, PaymentType = new PaymentType { Code = paymentType.GetCode() }, PaymentTypeEnum = paymentType, PaymentStatus = new PaymentStatus { Code = PaymentStatusEnum.Created.GetCode() }, PaymentStatusEnum = PaymentStatusEnum.Created, Currency = new Model.Common.Currency(order.CustomerCurrencyCode, string.Empty, string.Empty, 2), ReceivedDate = result.TransactionDate, MerchantType = null, // needs to be null in order to be filled in when being created Notes = note, TransactionSequence = result.Sequence }; CardTypeEnum cardType = CardType.ConvertOgoneCardTypeToEagleCardType(result.CardTypeCode); payment.CardType = cardType != CardTypeEnum.Unknown ? new CardType {Code = cardType.GetCode()} : null; // add this payment to the order CreatePaymentForOrder(payment, firstBooking.BusinessId); SettlementInvoiceRequest invoiceRequest = new SettlementInvoiceRequest { OrderSourceCode = order.OrderSourceCode, BusinessId = firstBooking.BusinessId, BookingId = firstBooking.Id.Value, OrderId = order.Id.Value }; QueueItem queItem = GetSettlementQueueItemFromPayment(payment, invoiceRequest); if (queItem == null || queueManager.AddQueueItem(queItem) == null) { // failed to create the queue item throw new ValidationException(ErrorFactory.CreateAndLogError(Errors.SRVEX30139, "PaymentManager.ChargePreAuth", additionalDescriptionParameters: new object[] { order.OrderReference }, arguments: new object[] { order.OrderReference })); } return true; } } return false; }
public void CreatePaymentAndQueueToSettlementCreatesPaymentAndQueueItem(PreAuthPaymentResult result, Order order, bool endResult) { // Arrange var managerMock = new Mock<PaymentManager>(); var queueManager = new Mock<IQueueManager>(); managerMock.CallBase = true; managerMock.Object.QueueManager = queueManager.Object; if (endResult) { queueManager.Setup( q => q.AddQueueItem( It.Is<QueueItem>(qi => qi.Key == order.Id.Value.ToString() && qi.PayloadType == PayloadTypeEnum.BookingInv && qi.QueueCode == QueueCodeType.SettlementInvoiceRequest ))).Returns(new QueueItem()); } if (endResult) { managerMock.Setup(mm => mm.CreatePaymentForOrder(It.Is<Model.Booking.Payment>(p => p.OrderId == order.Id && p.Amount == result.Amount && p.PaymentMethodEnum == PaymentMethodEnum.CreditCard && p.PaymentSourceEnum == PaymentSourceEnum.Online && p.PaymentTypeEnum == PaymentTypeEnum.Payment && p.ReceivedDate == result.TransactionDate && p.MerchantType == null && p.Currency.ISOCode == order.CustomerCurrencyCode && p.CardLast4Digits == result.LastCardDigits && p.CardType.Code == CardType.ConvertOgoneCardTypeToEagleCardType(result.CardTypeCode).GetCode() ), It.IsAny<long>())); } Assert.AreEqual(endResult, managerMock.Object.CreatePaymentAndQueueToSettlement(result, order, string.Empty), "result did not equal expected result"); managerMock.VerifyAll(); queueManager.VerifyAll(); }