private void SendOrderMail(Order order, ShoppingCart shoppingCart)
        {
            var htmlOrderTable = OrderService.GenerateHtmlOrderTable(order.OrderItems, CurrencyService.CurrentCurrency,
                                                                     shoppingCart.TotalPrice,
                                                                     shoppingCart.DiscountPercentOnTotalPrice,
                                                                     order.Coupon, order.Certificate,
                                                                     shoppingCart.TotalDiscount,
                                                                     order.ShippingCost, order.PaymentCost,
                                                                     order.TaxCost,
                                                                     order.BonusCost, PageData.OrderConfirmationData.BonusPlus);

            // Build a new mail
            var customerSb = new StringBuilder();

            customerSb.AppendFormat(SettingsOrderConfirmation.CustomerFirstNameField + ": {0}<br/>",
                                    PageData.OrderConfirmationData.Customer.FirstName);

            if (SettingsOrderConfirmation.IsShowLastName)
            {
                customerSb.AppendFormat(Resource.Client_Registration_Surname + ": {0}<br/>",
                                        PageData.OrderConfirmationData.Customer.LastName);
            }

            if (SettingsOrderConfirmation.IsShowPatronymic)
            {
                customerSb.AppendFormat(Resource.Client_Registration_Patronymic + ": {0}<br/>",
                                        PageData.OrderConfirmationData.Customer.Patronymic);
            }

            if (SettingsOrderConfirmation.IsShowPhone)
            {
                customerSb.AppendFormat(SettingsOrderConfirmation.CustomerPhoneField + ": {0}<br/>",
                                        PageData.OrderConfirmationData.Customer.Phone);
            }

            if (SettingsOrderConfirmation.IsShowCountry)
            {
                customerSb.AppendFormat(Resource.Client_Registration_Country + ": {0}<br/>",
                                        PageData.OrderConfirmationData.ShippingContact.Country);
            }

            if (SettingsOrderConfirmation.IsShowState && PageData.OrderConfirmationData.ShippingContact.RegionName.IsNotEmpty())
            {
                customerSb.AppendFormat(Resource.Client_Registration_State + ": {0}<br/>",
                                        PageData.OrderConfirmationData.ShippingContact.RegionName);
            }

            if (SettingsOrderConfirmation.IsShowCity)
            {
                customerSb.AppendFormat(Resource.Client_Registration_City + ": {0}<br/>",
                                        PageData.OrderConfirmationData.ShippingContact.City);
            }

            if (SettingsOrderConfirmation.IsShowZip && PageData.OrderConfirmationData.ShippingContact.Zip.IsNotEmpty())
            {
                customerSb.AppendFormat(Resource.Client_Registration_Zip + ": {0}<br/>",
                                        PageData.OrderConfirmationData.ShippingContact.Zip);
            }

            if (SettingsOrderConfirmation.IsShowAddress)
            {
                customerSb.AppendFormat(Resource.Client_Registration_Address + ": {0}<br/>",
                                        string.IsNullOrEmpty(PageData.OrderConfirmationData.ShippingContact.Address)
                        ? Resource.Client_OrderConfirmation_NotDefined
                        : PageData.OrderConfirmationData.ShippingContact.Address);
            }

            if (SettingsOrderConfirmation.IsShowCustomShippingField1 && PageData.OrderConfirmationData.ShippingContact.CustomField1.IsNotEmpty())
            {
                customerSb.AppendFormat(SettingsOrderConfirmation.CustomShippingField1 + ": {0}<br/>",
                                        PageData.OrderConfirmationData.ShippingContact.CustomField1);
            }

            if (SettingsOrderConfirmation.IsShowCustomShippingField2 && PageData.OrderConfirmationData.ShippingContact.CustomField2.IsNotEmpty())
            {
                customerSb.AppendFormat(SettingsOrderConfirmation.CustomShippingField2 + ": {0}<br/>",
                                        PageData.OrderConfirmationData.ShippingContact.CustomField2);
            }

            if (SettingsOrderConfirmation.IsShowCustomShippingField3 && PageData.OrderConfirmationData.ShippingContact.CustomField3.IsNotEmpty())
            {
                customerSb.AppendFormat(SettingsOrderConfirmation.CustomShippingField3 + ": {0}<br/>",
                                        PageData.OrderConfirmationData.ShippingContact.CustomField3);
            }

            customerSb.AppendFormat("Email: {0}<br/>", PageData.OrderConfirmationData.Customer.EMail);

            var email             = PageData.OrderConfirmationData.Customer.EMail;
            var orderMailTemplate = new NewOrderMailTemplate(order.OrderID.ToString(), order.Number, email,
                                                             customerSb.ToString(),
                                                             PageData.OrderConfirmationData.SelectedShippingItem
                                                             .MethodNameRate +
                                                             (PageData.OrderConfirmationData.SelectedShippingItem.Ext != null &&
                                                              PageData.OrderConfirmationData.SelectedShippingItem.Ext.PickpointAddress.IsNotEmpty()
                                                                 ? "<br />" + PageData.OrderConfirmationData.SelectedShippingItem.Ext.PickpointAddress
                                                                 : ""),
                                                             PageData.OrderConfirmationData.SelectedPaymentItem.Name,
                                                             htmlOrderTable, CurrencyService.CurrentCurrency.Iso3,
                                                             order.Sum.ToString(), order.CustomerComment,
                                                             OrderService.GetBillingLinkHash(order));

            orderMailTemplate.BuildMail();

            var paymentMethod = PaymentService.GetPaymentMethod(order.PaymentMethodId);

            if (!CustomerContext.CurrentCustomer.IsVirtual)
            {
                // TODO check it
                if (paymentMethod != null)
                {
                    SendMail.SendMailNow(email, orderMailTemplate.Subject, orderMailTemplate.Body, true);
                    SendMail.SendMailNow(SettingsMail.EmailForOrders, orderMailTemplate.Subject, orderMailTemplate.Body,
                                         true);
                }
                else
                {
                    SendMail.SendMailNow(SettingsMail.EmailForOrders, orderMailTemplate.Subject,
                                         " ERROR: paymentMethod is not exist. " + orderMailTemplate.Body, true);
                }
            }
        }
        protected int CreateCertificateOrder()
        {
            var certificate = new GiftCertificate
            {
                CertificateCode    = GiftCertificateService.GenerateCertificateCode(),
                ToName             = txtTo.Text,
                FromName           = txtFrom.Text,
                Sum                = Convert.ToSingle(txtSum.Text.Trim()),
                CertificateMessage = txtMessage.Text,
                Enable             = true,
                ToEmail            = txtEmail.Text
            };

            var orderContact = new OrderContact
            {
                Address = string.Empty,
                City    = string.Empty,
                Country = string.Empty,
                Name    = string.Empty,
                Zip     = string.Empty,
                Zone    = string.Empty
            };

            var taxes = TaxServices.CalculateCertificateTaxes(certificate.Sum);

            var taxOverPay = taxes.Where(tax => !tax.Key.ShowInPrice).Sum(tax => tax.Value);

            float orderSum = certificate.Sum + taxOverPay;

            var   payment      = PaymentService.GetPaymentMethod(hfPaymentMethod.Value.TryParseInt());
            float paymentPrice = payment.Extracharge == 0 ? 0 : (payment.ExtrachargeType == ExtrachargeType.Fixed ? payment.Extracharge : payment.Extracharge / 100 * certificate.Sum + taxOverPay);

            var baseCurrency = CurrencyService.BaseCurrency;

            var order = new Order
            {
                OrderDate     = DateTime.Now,
                OrderCustomer = new OrderCustomer
                {
                    CustomerID = CustomerContext.CurrentCustomer.Id,
                    Email      = txtEmailFrom.Text,
                    FirstName  = CustomerContext.CurrentCustomer.FirstName,
                    LastName   = CustomerContext.CurrentCustomer.LastName,
                    CustomerIP = HttpContext.Current.Request.UserHostAddress
                },
                OrderCurrency = new OrderCurrency
                {
                    //CurrencyCode = CurrencyService.CurrentCurrency.Iso3,
                    //CurrencyNumCode = CurrencyService.CurrentCurrency.NumIso3,
                    //CurrencyValue = CurrencyService.CurrentCurrency.Value,
                    //CurrencySymbol = CurrencyService.CurrentCurrency.Symbol,
                    //IsCodeBefore = CurrencyService.CurrentCurrency.IsCodeBefore
                    CurrencyCode    = baseCurrency.Iso3,
                    CurrencyValue   = baseCurrency.Value,
                    CurrencySymbol  = baseCurrency.Symbol,
                    CurrencyNumCode = baseCurrency.NumIso3,
                    IsCodeBefore    = baseCurrency.IsCodeBefore
                },
                OrderStatusId        = OrderService.DefaultOrderStatus,
                AffiliateID          = 0,
                ArchivedShippingName = Resource.Client_GiftCertificate_DeliveryByEmail,
                PaymentMethodId      = Convert.ToInt32(hfPaymentMethod.Value),
                ArchivedPaymentName  = payment.Name,
                PaymentDetails       = null,
                Sum               = orderSum + paymentPrice,
                PaymentCost       = paymentPrice,
                OrderCertificates = new List <GiftCertificate>
                {
                    certificate
                },
                TaxCost = taxes.Sum(tax => tax.Value),
                Taxes   = taxes.Select(tax => new OrderTax()
                {
                    TaxID = tax.Key.TaxId, TaxName = tax.Key.Name, TaxShowInPrice = tax.Key.ShowInPrice, TaxSum = tax.Value
                }).ToList(),
                ShippingContact = orderContact,
                BillingContact  = orderContact,
                Number          = OrderService.GenerateNumber(1)
            };

            if (order.PaymentMethod.Type == PaymentType.QIWI)
            {
                order.PaymentDetails = new PaymentDetails()
                {
                    Phone = txtPhone.Text
                };
            }

            OrderId     = order.OrderID = OrderService.AddOrder(order);
            OrderNumber = order.Number = OrderService.GenerateNumber(order.OrderID);
            OrderService.UpdateNumber(order.OrderID, order.Number);
            OrderService.ChangeOrderStatus(order.OrderID, OrderService.DefaultOrderStatus);

            string email = txtEmailFrom.Text;

            string htmlOrderTable = OrderService.GenerateHtmlOrderCertificateTable(order.OrderCertificates,
                                                                                   CurrencyService.CurrentCurrency,
                                                                                   order.PaymentCost, order.TaxCost);

            var orderMailTemplate = new NewOrderMailTemplate(order.OrderID.ToString(), order.Number, email, string.Empty,
                                                             order.ArchivedShippingName,
                                                             order.ArchivedPaymentName, htmlOrderTable,
                                                             CurrencyService.CurrentCurrency.Iso3, order.Sum.ToString(),
                                                             order.CustomerComment,
                                                             OrderService.GetBillingLinkHash(order));

            orderMailTemplate.BuildMail();

            SendMail.SendMailNow(email, orderMailTemplate.Subject, orderMailTemplate.Body, true);
            SendMail.SendMailNow(SettingsMail.EmailForOrders, orderMailTemplate.Subject, orderMailTemplate.Body, true);

            return(OrderId);
        }