/// <summary> /// Creates a <see cref="IShipment"/> without persisting it to the database. /// </summary> /// <param name="shipmentStatus"> /// The shipment status. /// </param> /// <param name="origin"> /// The origin. /// </param> /// <param name="destination"> /// The destination. /// </param> /// <param name="items"> /// The items. /// </param> /// <param name="raiseEvents"> /// Optional boolean indicating whether or not to raise events /// </param> /// <returns> /// The <see cref="IShipment"/>. /// </returns> public IShipment CreateShipment(IShipmentStatus shipmentStatus, IAddress origin, IAddress destination, LineItemCollection items, bool raiseEvents = true) { Mandate.ParameterNotNull(shipmentStatus, "shipmentStatus"); Mandate.ParameterNotNull(origin, "origin"); Mandate.ParameterNotNull(destination, "destination"); Mandate.ParameterNotNull(items, "items"); // Use the visitor to filter out and validate shippable line items var visitor = new ShippableProductVisitor(); items.Accept(visitor); var lineItemCollection = new LineItemCollection(); foreach (var item in visitor.ShippableItems) { lineItemCollection.Add(item); } var shipment = new Shipment(shipmentStatus, origin, destination, lineItemCollection) { VersionKey = Guid.NewGuid() }; if (!raiseEvents) { return(shipment); } Creating.RaiseEvent(new Events.NewEventArgs <IShipment>(shipment), this); return(shipment); }
/// <summary> /// Creates a Braintree <see cref="Customer"/> from a Merchello <see cref="ICustomer"/> /// </summary> /// <param name="customer"> /// The customer. /// </param> /// <param name="paymentMethodNonce"> /// The "nonce-from-the-client" /// </param> /// <param name="billingAddress"> /// The billing address /// </param> /// <param name="shippingAddress"> /// The shipping Address. /// </param> /// <returns> /// The <see cref="Attempt{Customer}"/>. /// </returns> public Attempt <Customer> Create(ICustomer customer, string paymentMethodNonce = "", IAddress billingAddress = null, IAddress shippingAddress = null) { if (this.Exists(customer)) { return(Attempt.Succeed(this.GetBraintreeCustomer(customer))); } var request = this.RequestFactory.CreateCustomerRequest(customer, paymentMethodNonce, billingAddress); Creating.RaiseEvent(new Core.Events.NewEventArgs <CustomerRequest>(request), this); // attempt the API call LogHelper.Info <BraintreeTransactionApiService>(string.Format("Braintree Create customer attempt for CustomerKey: {0}, name: {1}", customer.Key, customer.FullName)); var attempt = this.TryGetApiResult(() => this.BraintreeGateway.Customer.Create(request)); if (!attempt.Success) { return(Attempt <Customer> .Fail(attempt.Exception)); } var result = attempt.Result; if (result.IsSuccess()) { Created.RaiseEvent(new Core.Events.NewEventArgs <Customer>(result.Target), this); return(Attempt.Succeed((Customer)this.RuntimeCache.GetCacheItem(this.MakeCustomerCacheKey(customer), () => result.Target, TimeSpan.FromHours(6)))); } var error = new BraintreeApiException(result.Errors); LogHelper.Error <BraintreeCustomerApiService>("Braintree API Customer Create return a failure", error); return(Attempt <Customer> .Fail(error)); }
/// <summary> /// Creates a <see cref="Subscription"/>. /// </summary> /// <param name="request"> /// The request. /// </param> /// <returns> /// The <see cref="Attempt{Subscription}"/>. /// </returns> public Attempt <Subscription> Create(SubscriptionRequest request) { Creating.RaiseEvent(new Core.Events.NewEventArgs <SubscriptionRequest>(request), this); var attempt = TryGetApiResult(() => BraintreeGateway.Subscription.Create(request)); if (!attempt.Success) { return(Attempt <Subscription> .Fail(attempt.Exception)); } var result = attempt.Result; if (result.IsSuccess()) { Created.RaiseEvent(new Core.Events.NewEventArgs <Subscription>(result.Target), this); return(Attempt <Subscription> .Succeed(result.Target)); } var error = new BraintreeApiException(result.Errors, result.Message); LogHelper.Error <BraintreeSubscriptionApiService>("Failed to create a subscription", error); return(Attempt <Subscription> .Fail(error)); }
/// <summary> /// Creates a Braintree <see cref="Customer"/> from a Merchello <see cref="ICustomer"/> /// </summary> /// <param name="customer"> /// The customer. /// </param> /// <param name="paymentMethodNonce"> /// The "nonce-from-the-client" /// </param> /// <param name="billingAddress"> /// The billing address /// </param> /// <param name="shippingAddress"> /// The shipping Address. /// </param> /// <returns> /// The <see cref="Attempt{Customer}"/>. /// </returns> public Attempt <Customer> Create(ICustomer customer, string paymentMethodNonce = "", IAddress billingAddress = null, IAddress shippingAddress = null) { if (Exists(customer)) { return(Attempt.Succeed(GetBraintreeCustomer(customer))); } var request = RequestFactory.CreateCustomerRequest(customer, paymentMethodNonce, billingAddress); Creating.RaiseEvent(new Core.Events.NewEventArgs <CustomerRequest>(request), this); // attempt the API call var attempt = TryGetApiResult(() => BraintreeGateway.Customer.Create(request)); if (!attempt.Success) { return(Attempt <Customer> .Fail(attempt.Exception)); } var result = attempt.Result; if (result.IsSuccess()) { Created.RaiseEvent(new Core.Events.NewEventArgs <Customer>(result.Target), this); return(Attempt.Succeed((Customer)RuntimeCache.GetCacheItem(MakeCustomerCacheKey(customer), () => result.Target))); } var error = new BraintreeApiException(result.Errors); LogHelper.Error <BraintreeCustomerApiService>("Braintree API Customer Create return a failure", error); return(Attempt <Customer> .Fail(error)); }
/// <summary> /// Creates a <see cref="Subscription"/>. /// </summary> /// <param name="request"> /// The request. /// </param> /// <returns> /// The <see cref="Attempt{Subscription}"/>. /// </returns> public Attempt <Subscription> Create(SubscriptionRequest request) { Creating.RaiseEvent(new Core.Events.NewEventArgs <SubscriptionRequest>(request), this); LogHelper.Info <BraintreeTransactionApiService>(string.Format("Braintree create subscription attempt PlanID: {0}, Price: {1}", request.PlanId, request.Price)); var attempt = this.TryGetApiResult(() => this.BraintreeGateway.Subscription.Create(request)); if (!attempt.Success) { return(Attempt <Subscription> .Fail(attempt.Exception)); } var result = attempt.Result; if (result.IsSuccess()) { Created.RaiseEvent(new Core.Events.NewEventArgs <Subscription>(result.Target), this); return(Attempt <Subscription> .Succeed(result.Target)); } var error = new BraintreeApiException(result.Errors, result.Message); LogHelper.Error <BraintreeSubscriptionApiService>("Failed to create a subscription", error); return(Attempt <Subscription> .Fail(error)); }
/// <summary> /// Adds a credit card to an existing customer. /// </summary> /// <param name="customer"> /// The customer. /// </param> /// <param name="paymentMethodNonce"> /// The payment method nonce. /// </param> /// <param name="token"> /// The token. /// </param> /// <param name="billingAddress"> /// The billing address. /// </param> /// <param name="isDefault"> /// A value indicating whether or not this payment method should become the default payment method. /// </param> /// <returns> /// The <see cref="Attempt{PaymentMethod}"/> indicating whether the payment method creation was successful. /// </returns> public Attempt <PaymentMethod> Create(ICustomer customer, string paymentMethodNonce, string token, IAddress billingAddress = null, bool isDefault = true) { //// Asserts the customer exists or creates one in BrainTree if it does not exist var btc = _braintreeCustomerApiService.GetBraintreeCustomer(customer); var request = RequestFactory.CreatePaymentMethodRequest(customer, paymentMethodNonce); if (!string.IsNullOrEmpty(token)) { request.Token = token; } if (billingAddress != null) { request.BillingAddress = RequestFactory.CreatePaymentMethodAddressRequest(billingAddress); } Creating.RaiseEvent(new Core.Events.NewEventArgs <PaymentMethodRequest>(request), this); var attempt = TryGetApiResult(() => BraintreeGateway.PaymentMethod.Create(request)); if (!attempt.Success) { return(Attempt <PaymentMethod> .Fail(attempt.Exception)); } var result = attempt.Result; if (result.IsSuccess()) { var cacheKey = MakePaymentMethodCacheKey(token); RuntimeCache.ClearCacheItem(cacheKey); var customerCacheKey = MakeCustomerCacheKey(customer); RuntimeCache.ClearCacheItem(customerCacheKey); Created.RaiseEvent(new Core.Events.NewEventArgs <PaymentMethod>(result.Target), this); return(Attempt <PaymentMethod> .Succeed((PaymentMethod)RuntimeCache.GetCacheItem(cacheKey, () => result.Target))); } var error = new BraintreeApiException(result.Errors, result.Message); LogHelper.Error <BraintreeCustomerApiService>("Failed to add a credit card to a customer", error); return(Attempt <PaymentMethod> .Fail(error)); }