private void ConfirmationEmail(Data.Models.Payment.Order order, SystemModel settings, string name, bool isCustomer = true)
 {
     try
     {
         var subject = $"{settings.Get(SettingName.Title)} - Order Confirmation {order.Id}";
         if (isCustomer)
         {
             EmailSender.Send(_azureSettings.SendgridApiKey, subject, GetBody(order, name, settings, true), order.Email, settings.Get(SettingName.ContactEmail));
         }
         else
         {
             var emailsString = settings.Get(SettingName.OrderNotificationEmails);
             if (!string.IsNullOrWhiteSpace(emailsString))
             {
                 var emails = emailsString.Split(new[] { ',', ' ', ';' }, StringSplitOptions.RemoveEmptyEntries).Where(x => x.Length > 5 && x.Contains("@"));
                 foreach (var email in emails)
                 {
                     try { EmailSender.Send(_azureSettings.SendgridApiKey, subject, GetBody(order, name, settings, false), email, settings.Get(SettingName.ContactEmail)); }
                     catch (Exception ex) { Log(ex); }
                 }
             }
         }
     }
     catch (Exception ex)
     {
         Log(ex);
         if (isCustomer)
         {
             throw new Exception("Order placed successfully but there was an error sending confirmation email - don't worry, your food will be ready!");
         }
     }
 }
        private string GetBody(Data.Models.Payment.Order order, string name, SystemModel settings, bool isCustomer)
        {
            var n            = Environment.NewLine;
            var title        = settings.Get(SettingName.Title);
            var customerInfo = string.Join(", ", new[] { name, order.Email, order.Phone }.Where(x => !string.IsNullOrWhiteSpace(x)));

            return(isCustomer
                ? $"{title} Order Confirmation:{n}{n}{order.FullText}{n}{n}Thank you!{n}-{title}"
                : $"Order for {customerInfo}{n}{n}{order.FullText}");
        }
Exemplo n.º 3
0
        public CreateOrderRequest GetCreateOrderRequest(PaymentModel model, Data.Models.Payment.Order order, Guid guid, IEnumerable <CatalogObject> taxes)
        {
            var orderLineItems = order.Items.Select(x => x.ToOrderLineItem()).ToList();

            var _taxes = (taxes ?? new List <CatalogObject>())
                         .Where(x => !EXCLUDE.Any(y => x.TaxData.Name.ToLower().Contains(y)))
                         .Select(x => new OrderLineItemTax(
                                     name: x.TaxData.Name,
                                     type: x.TaxData.InclusionType,
                                     percentage: x.TaxData.Percentage)
                                 ).ToList();

            model.PickUpInMinutes = string.IsNullOrWhiteSpace(model.PickUpInMinutes) ? "0" : model.PickUpInMinutes;
            var pickUpInMinutes = 0;

            int.TryParse(model.PickUpInMinutes, out pickUpInMinutes);

            var isScheduled = false;

            if (pickUpInMinutes > 0)
            {
                isScheduled = true;
            }
            else
            {
                pickUpInMinutes = 10;
            }

            var pickupDetails = new OrderFulfillmentPickupDetails(
                recipient: new OrderFulfillmentRecipient(displayName: model.Name, emailAddress: model.Email, phoneNumber: model.Phone),
                scheduleType: (isScheduled ? "SCHEDULED" : "ASAP"),
                prepTimeDuration: "P10M", // 10 minutes
                pickupAt: ToRfc3339String(DateTime.UtcNow.AddMinutes(pickUpInMinutes))
                );

            var fulfill = new List <OrderFulfillment>()
            {
                new OrderFulfillment(
                    type: "PICKUP",
                    pickupDetails:  pickupDetails
                    )
            };

            var squareOrder = new Square.Models.Order(LocationId,
                                                      taxes: _taxes,
                                                      referenceId: order.Id.ToString(),
                                                      customerId: model.Email.Replace("@", "_at_").Replace(".", "-"),
                                                      lineItems: orderLineItems,
                                                      fulfillments: fulfill
                                                      );

            var orderRequest = new CreateOrderRequest(squareOrder, guid.ToString());

            return(orderRequest);
        }
        private async Task <CreateOrderRequest> GetOrderRequest(PaymentModel model, bool saveOrder)
        {
            var square = new SquareHelper(GetSquareLocation(model.LocationId));
            var taxes  = await square.GetTaxes();

            taxes = taxes ?? new List <CatalogObject>();
            var tax = await square.GetAdditiveTaxPercentage(taxes);

            _order = _handler.Submit(model.OrderType, model, tax, square.UseProduction, deferSave: !saveOrder);
            return(square.GetCreateOrderRequest(model, _order, Guid.NewGuid(), taxes));
        }
 private void DoNotification(Data.Models.Payment.Order order, SystemModel settings, bool sendText, string name = "")
 {
     Parallel.Invoke(
         () => ConfirmationEmail(order, settings, name),
         () => { if (sendText)
                 {
                     ConfirmationText(order, settings, name);
                 }
         },
         () => ConfirmationEmail(order, settings, name, false),
         () => { if (sendText)
                 {
                     ConfirmationText(order, settings, name, false);
                 }
         }
         );
 }
        private void ConfirmationText(Data.Models.Payment.Order order, SystemModel settings, string name, bool isCustomer = true)
        {
            try
            {
                var twilio = new TwilioHelper(settings.Get(SettingName.TwilioAuthToken), settings.Get(SettingName.TwilioSid), settings.Get(SettingName.TwilioPhoneNumber));

                if (twilio.IsValid)
                {
                    ISmsSender smsSender = new TwilioSmsSender(twilio.Sid, twilio.AuthToken);
                    if (isCustomer && !string.IsNullOrWhiteSpace(order.Phone))
                    {
                        smsSender.Send(twilio.Phone, order.Phone, GetBody(order, name, settings, true));
                    }

                    if (!isCustomer)
                    {
                        var phoneNumbersString = settings.Get(SettingName.OrderNotificationPhoneNumbers);
                        if (!string.IsNullOrWhiteSpace(phoneNumbersString))
                        {
                            var phoneNumbers = phoneNumbersString.Split(new[] { ',', ' ', ';' }, StringSplitOptions.RemoveEmptyEntries).Where(x => x.Length == 10 && x.All(c => char.IsDigit(c)));
                            foreach (var phoneNumber in phoneNumbers)
                            {
                                try { smsSender.Send(twilio.Phone, $"+1{phoneNumber}", GetBody(order, name, settings, false)); }
                                catch (Exception ex) { Log(ex); }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log(ex);
                if (isCustomer)
                {
                    throw new Exception("Order placed successfully but there was an error sending confirmation text - don't worry, your food will be ready!");
                }
            }
        }
        public async Task <IActionResult> Pay(PaymentModel model)
        {
            var system   = new SystemModel(_settingHandler.GetAll());
            var settings = new SettingsModel(_azureSettings, _squareLocations, system, _context);

            try
            {
                if (!settings.IsOrderingOn)
                {
                    throw new Exception("Online ordering is temporarily disabled");
                }
                if (settings.IsBrickAndMortar && !settings.IsValidTimeForOnlineOrder)
                {
                    throw new Exception("Too late for online order");
                }

                if (!string.Equals(system.Settings[SettingName.IsOrderingOn], true.ToString(), StringComparison.OrdinalIgnoreCase))
                {
                    throw new InvalidOperationException("Online ordering is currently unavailable");
                }

                var square           = new SquareHelper(GetSquareLocation(model.LocationId));
                var isBrickAndMortar = string.Equals(system.Settings[SettingName.BrickAndMortarMode], true.ToString(), StringComparison.OrdinalIgnoreCase);
                var orderRequest     = await GetOrderRequest(model, true);

                var squareOrder = await square.Client.OrdersApi.CreateOrderAsync(square.LocationId, orderRequest);

                var note = $"ONLINE ORDER - ID: {_order.Id}";

                if (squareOrder.Order.TotalMoney.Amount == 0)
                {
                    _handler.TransactionApproved(_order.Id, string.Empty, "NO_PAYMENT");
                }
                else
                {
                    var paymentRequest = new CreatePaymentRequest(
                        amountMoney: squareOrder.Order.TotalMoney,
                        idempotencyKey: Guid.NewGuid().ToString(),
                        sourceId: model.Nonce,
                        verificationToken: model.BuyerVerificationToken,
                        buyerEmailAddress: model.Email,
                        orderId: squareOrder.Order.Id,
                        note: note);

                    var paymentResponse = await square.Client.PaymentsApi.CreatePaymentAsync(paymentRequest);

                    try
                    {
                        _order = _handler.TransactionApproved(_order.Id, paymentResponse.Payment.Id, paymentResponse.Payment.OrderId);
                        _order.SetFullText();
                    }
                    catch (Exception ex) // order and payment went through, there was a DB error
                    {
                        ex.Ship(this.HttpContext);
                        throw;
                    }
                }

                DoNotification(_order, system, settings.IsTextOn, model.Name);
                return(Ok());
            }
            catch (Exception ex)
            {
                Log(ex);
                return(new BadRequestObjectResult(ex.Message));
            }
        }