public async Task <IActionResult> EMailSend(Guid?id)
        {
            var order = await _context.Orders.SingleAsync(o => o.ID.Equals(id));

            var customer = await _context.Customers.SingleAsync(c => c.CustomerID.Equals(order.CustomerID));

            var user = await _context.Users.SingleAsync(u => u.Id.Equals(customer.UserId));

            OrderEmailViewModel vm = new OrderEmailViewModel {
                OrderID = order.ID, Subject = $"Rechung zu Auftrags-Nr.: {order.Number}, am {order.OrderDate.Day}.{order.OrderDate.Month}.{order.OrderDate.Year}", Email = user.Email, Message = ""
            };

            return(View(vm));
        }
        public async Task <IActionResult> EMailSend([Bind("OrderID, Email, Subject, Message, Attachments")] OrderEmailViewModel orderEmail)
        {
            if (ModelState.IsValid)
            {
                OrderViewModel vm   = null;
                BankAcccount   bank = null;

                if (orderEmail.OrderID == null)
                {
                    return(NotFound());
                }
                else
                {
                    vm = await GetOrderViewModel(orderEmail.OrderID);

                    bank = await _context.BankAcccounts.FirstOrDefaultAsync();

                    string bill = $"<h2>Hallo Frau/Herr {vm.CutomerLastName},</h2>" +
                                  $"<p>noch einmal vielen Dank für Ihren Einkauf.</p>" +
                                  $"<p>Bitte überweisen Sie den Gesamtbetrag von <b>{Math.Round(vm.Total, 2)} &euro;</b> innerhalb von 7 Tagen unter Angabe der Rechungsnummer:<br/>" +
                                  $"<b>{orderEmail.Message}</b><br />" +
                                  $"auf das folgende Konto:</p>" +
                                  $"<br />" +
                                  $"<p>Kontoinhaber:<b> {bank.AccountOwner}</b><br />" +
                                  $"IBAN: <b>{bank.Iban}</b><br />" +
                                  $"SWIFT-BIC: <b>{bank.SwiftBic}</b><br />" +
                                  $"Bank: <b>{bank.Institute}</b></p><br />";
                    bill += $"<hr /><h3>Rechungsdetails</h3>" +
                            $"<p>Ihre Bestellung vom {vm.OrderDate.ToShortDateString()}</p>";
                    if (!string.IsNullOrWhiteSpace(vm.FreeText))
                    {
                        bill += $"<p>Ihre Angaben zur Bestellung: <b>{vm.FreeText}</b></p>";
                    }
                    bill += $"<table border=\"1\" cellpadding=\"0\" cellspacing=\"0\" height=\"15%\" width=\"75%\"><tr><th>Position</th><th>Artikel-Nr.</th><th>Artikelname</th><th>Menge</th><th>Betrag</th></tr>";
                    foreach (var item in vm.OderLines)
                    {
                        bill += $"<tr><td align=\"center\">{item.Position}</td>" +
                                $"<td align=\"center\">{item.ProductNumber}</td>" +
                                $"<td align=\"center\">{item.ProductName}</td>" +
                                $"<td align=\"center\">{Math.Round(item.OrderQuantity, 2)} {item.OrderUnit}</td>" +
                                $"<td align=\"center\">{Math.Round(item.OrderLineTotal,2)} &euro;</td></tr>";
                    }
                    bill += $"</table><br />" +
                            $"<table cellpadding=\"0\" cellspacing=\"1\" height=\"5%\" width=\"85%\">" +
                            $"<tr>" +
                            $"<td align=\"right\" colspan=\"4\">Versand, {vm.ShippingPriceName}:</td>" +
                            $"<td>{Math.Round(vm.ShippingPriceAtOrder,2)} &euro;</td></tr>" +
                            $"<tr>" +
                            $"<td align=\"right\" colspan=\"4\">Gesamtbetrag:</td><td>{Math.Round(vm.Total,2)} &euro;</td></tr>" +
                            $"</table>" +
                            $"<br />" +
                            $"<p>Die Lieferfrist beginnt mit der Zahlungsanweisung.</p>" +
                            $"<br />" +
                            $"<p>Viele Gr&uuml;&szlig;e,</p><p>Petra Buron</p><br />";
                    var attachments = new List <string>();
                    var files       = HttpContext.Request.Form.Files;
                    if (files != null && files.Count > 0)
                    {
                        //var file = files.First();
                        var helper = new UploadHelper(_environment);
                        var todel  = new List <string>();


                        foreach (var file in files)
                        {
                            var fnames = await helper.FileUploadAsync(file, "files", false);

                            todel.Add(fnames.Filename);
                            attachments.Add(fnames.Filename);
                        }

                        foreach (string file in todel)
                        {
                            helper.DeleteFile("files", file);
                        }
                    }

                    var agb = await _context.ShopFiles.SingleAsync(s => s.ShopFileType == Enums.ShopFileTypeEnum.AGB);

                    var wiederruf = await _context.ShopFiles.SingleAsync(s => s.ShopFileType == Enums.ShopFileTypeEnum.WRB);

                    var datenschutz = await _context.ShopFiles.SingleAsync(s => s.ShopFileType == Enums.ShopFileTypeEnum.DSK);

                    attachments.Add(agb.Filename);
                    attachments.Add(wiederruf.Filename);
                    attachments.Add(datenschutz.Filename);

                    await _emailSender.SendEmailWithAttachmentsAsync(orderEmail.Email, orderEmail.Subject, bill, attachments);

                    return(RedirectToAction(nameof(Index)));
                }
            }
            return(View(orderEmail));
        }
        public async System.Threading.Tasks.Task <IActionResult> OnPostSaveEntityAsync([FromBody] DAL.Data.Entities.Order model)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    IEnumerable <ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);
                    return(new BadRequestObjectResult("Đã xãy ra lỗi"));
                }

                if (model.Id == 0)
                {
                    return(new BadRequestResult());
                }

                var order = _orderRepository.Find(model.Id);
                if (model.Status != 0)
                {
                    order.Status = model.Status;
                }
                if (model.DeliveryDate.HasValue)
                {
                    if (DateTime.Compare(model.DeliveryDate.Value, order.OrderDate) < 0)
                    {
                        return(new BadRequestObjectResult("Không thể đặt ngày giao trước ngày đặt hàng"));
                    }
                    order.DeliveryDate = model.DeliveryDate.Value;
                }
                order.DateModified = DateTime.Now;
                _orderRepository.Update(order);
                var cus = order.Address?.Customer;
                if (!string.IsNullOrEmpty(cus?.Email))
                {
                    var url = Url.Page("/Order/MyOrder", pageHandler: null, values: new { orderId = order.Id }, protocol: Request.Scheme);
                    var confirmAccountModel = new OrderEmailViewModel
                    {
                        Url = url
                    };

                    if (model.Status == DAL.Data.Enums.OrderStatus.Shipped)
                    {
                        confirmAccountModel.LetterDescription = $@"Đơn hàng #{order.Id} đang trên đường vận chuyển. Thời gian giao hàng dự kiến vào ngày {string.Format("{0:d/M/yyyy}", order.DeliveryDate)}. 
                                                               Chúng tôi sẽ tiếp tục cập nhật với bạn về trạng thái tiếp theo của đơn hàng.";
                        string body = await _razorViewToStringRenderer.RenderViewToStringAsync("~/Pages/Emails/ConfirmOrderEmail.cshtml", confirmAccountModel);

                        await _emailSender.SendEmailAsync(cus.Email, $@"Đơn hàng #{order.Id} đang trên đường vận chuyển.", body);
                    }
                    else if (model.Status == DAL.Data.Enums.OrderStatus.Delivered)
                    {
                        confirmAccountModel.LetterDescription = $@"Đơn hàng #{order.Id} của bạn đã được giao đầy đủ với các sản phẩm được liệt kê ở chi tiết đơn hàng bên dưới. TimiShop hi vọng bạn hài lòng với các sản phẩm này!";
                        string body = await _razorViewToStringRenderer.RenderViewToStringAsync("~/Pages/Emails/ConfirmOrderEmail.cshtml", confirmAccountModel);

                        await _emailSender.SendEmailAsync(cus.Email, $@"Đơn hàng #{order.Id} đã được giao thành công.", body);
                    }
                    else if (model.Status == DAL.Data.Enums.OrderStatus.Canceled)
                    {
                        confirmAccountModel.LetterDescription = $@"Rất tiếc, đơn hàng #{order.Id} đã được hoàn về kho TimiShop và được tự động hủy trên hệ thống do đối tác giao nhận của TimiShop không liên lạc được với bạn trong quá trình giao hàng.";
                        string body = await _razorViewToStringRenderer.RenderViewToStringAsync("~/Pages/Emails/ConfirmOrderEmail.cshtml", confirmAccountModel);

                        await _emailSender.SendEmailAsync(cus.Email, $@"Đơn hàng #{order.Id} đã giao không thành công.", body);
                    }
                }

                return(new OkObjectResult(order));
            }
            catch (Exception ex)
            {
                _logger.LogError("Error when send email", ex);
                return(new BadRequestObjectResult("Đã xãy ra lỗi"));
            }
        }
        public async System.Threading.Tasks.Task <IActionResult> OnPostSaveOrderAsync([FromBody] OrderAddressViewModel model)
        {
            if (!ModelState.IsValid)
            {
                IEnumerable <ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);
                return(new BadRequestObjectResult("Đặt hàng không thành công"));
            }

            using (var context = new OnlineStoreDbContext())
            {
                using (var transaction = context.Database.BeginTransaction())
                {
                    try
                    {
                        var user = _userManager.GetUserAsync(HttpContext.User).Result;
                        if (user == null)
                        {
                            return(new BadRequestObjectResult("Tất cả sản phẩm trong giỏ không thể đặt. Vui lòng kiểm tra lại giỏ hàng."));
                        }

                        var cart = _cartRepository.GetCartByCustomerId(user.Id);
                        if (cart == null)
                        {
                            return(new BadRequestObjectResult("Tất cả sản phẩm trong giỏ không thể đặt. Vui lòng kiểm tra lại giỏ hàng."));
                        }
                        var newAddress = new Address();
                        if (model.Order.ReceivingTypeId == 3)
                        {
                            newAddress = new Address
                            {
                                CustomerId        = user.Id,
                                PhoneNumber       = model.Address.PhoneNumber,
                                RecipientName     = model.Address.RecipientName,
                                ShowRoomAddressId = model.Address.ShowRoomAddressId,
                                DateCreated       = DateTime.Now,
                                DateModified      = DateTime.Now
                            };
                            context.Address.Add(newAddress);
                            context.SaveChanges();
                        }
                        var receivingType = _receivingTypeRepository.Find(model.Order.ReceivingTypeId);

                        var newOrder = new DAL.Data.Entities.Order
                        {
                            DateCreated     = DateTime.Now,
                            DateModified    = DateTime.Now,
                            DeliveryDate    = DateTime.Now.AddDays(receivingType.NumberShipDay),
                            ShippingFee     = model.Order.ShippingFee,
                            SubTotal        = cart.CartDetails.Sum(x => x.Item.Price * x.Quantity),
                            OrderDate       = DateTime.Now,
                            PaymentType     = model.Order.PaymentType,
                            ReceivingTypeId = model.Order.ReceivingTypeId,
                            SaleOff         = model.Order.SaleOff,
                            Status          = model.Order.Status == OrderStatus.ReadyToDeliver ? OrderStatus.ReadyToDeliver : OrderStatus.Pending,
                        };

                        if (model.Order.PaymentType == PaymentType.CreditDebitCard)
                        {
                            Address addressForOnlinePayment = new Address
                            {
                                CustomerId    = user.Id,
                                Detail        = "",
                                DateCreated   = DateTime.Now,
                                RecipientName = user.Name ?? "",
                                PhoneNumber   = user.PhoneNumber ?? ""
                            };
                            context.Address.Add(addressForOnlinePayment);
                            context.SaveChanges();
                            newOrder.AddressId = addressForOnlinePayment.Id;
                        }
                        else
                        {
                            newOrder.AddressId = model.Order.ReceivingTypeId == 3 ? newAddress.Id : model.Order.AddressId;
                        }

                        newOrder.Total = newOrder.SubTotal + newOrder.ShippingFee - newOrder.SaleOff;
                        context.Order.Add(newOrder);
                        context.SaveChanges();


                        var items = cart.CartDetails.Where(cd => cd.IsDeleted == false && cd.Item.Quantity > 0).ToList();

                        if (items == null || items.Count() == 0)
                        {
                            transaction.Rollback();
                            return(new BadRequestObjectResult("Tất cả sản phẩm trong giỏ không thể đặt. Vui lòng kiểm tra lại giỏ hàng."));
                        }

                        var itemsCheckout = TempData.Get <List <ItemCartViewModel> >(CommonConstants.ItemsCheckout);

                        //if (itemsCheckout.Sum(x => x.Quantity) != items.Sum(x => x.Item.Quantity))
                        //{
                        //    transaction.Rollback();
                        //    return new BadRequestObjectResult("Các sản phẩm trong giỏ đã có sự thay đổi về số lượng từ hệ thống. Vui lòng kiểm tra lại giỏ hàng.");
                        //}

                        if (itemsCheckout.Sum(x => x.Price) != items.Sum(x => x.Item.Price))
                        {
                            transaction.Rollback();
                            return(new BadRequestObjectResult("Các sản phẩm trong giỏ đã có sự thay đổi về giá từ hệ thống. Vui lòng kiểm tra lại giỏ hàng."));
                        }
                        foreach (var itemInCart in items)
                        {
                            if (itemsCheckout.Any(x => x.Quantity > itemInCart.Item.Quantity))
                            {
                                transaction.Rollback();
                                return(new BadRequestObjectResult("Các sản phẩm trong giỏ đã có sự thay đổi về số lượng từ hệ thống. Vui lòng kiểm tra lại giỏ hàng."));
                            }

                            var item = _itemRepository.Find(itemInCart.ItemId);
                            if (item.IsDeleted == false)
                            {
                                if (itemInCart.Quantity > item.Quantity)
                                {
                                    transaction.Rollback();
                                    return(new BadRequestObjectResult("Sản phẩm không còn đủ số lượng cho đơn hàng. Quá trình đặt hàng thất bại. Vui lòng kiểm tra lại giỏ hàng"));
                                }

                                var newOrderItem = new OrderItem
                                {
                                    OrderId      = newOrder.Id,
                                    Price        = item.Price,
                                    ItemId       = itemInCart.ItemId,
                                    Quantity     = itemInCart.Quantity,
                                    DateCreated  = DateTime.Now,
                                    DateModified = DateTime.Now,
                                    SaleOff      = 0,
                                    IsDeleted    = false,
                                    Amount       = item.Price * itemInCart.Quantity
                                };
                                context.OrderItem.Add(newOrderItem);
                                context.SaveChanges();

                                item.Quantity -= itemInCart.Quantity;
                                context.Item.Update(item);
                                context.SaveChanges();
                            }
                        }
                        cart.IsDeleted = true;
                        context.Cart.Update(cart);
                        context.SaveChanges();

                        var cartDetails = cart.CartDetails;
                        foreach (var cartDetail in cartDetails)
                        {
                            cartDetail.IsDeleted = true;
                            cartDetail.Quantity  = 0;
                            context.CartDetail.Update(cartDetail);
                            context.SaveChanges();
                        }
                        transaction.Commit();
                        var url = Url.Page("/Order/MyOrder", pageHandler: null, values: new { orderId = newOrder.Id }, protocol: Request.Scheme);
                        var confirmAccountModel = new OrderEmailViewModel
                        {
                            Url = url,
                            LetterDescription = $@"Yêu cầu đặt hàng cho đơn hàng #{newOrder.Id} của bạn đã được tiếp nhận và đang chờ nhà bán hàng xử lý. 
                                                  Thời gian đặt hàng vào lúc {string.Format("{0:HH:mm}", newOrder.OrderDate)} ngày {string.Format("{0:d/M/yyyy}", newOrder.OrderDate)}. 
                                                  Chúng tôi sẽ tiếp tục cập nhật với bạn về trạng thái tiếp theo của đơn hàng."
                        };
                        string body = await _razorViewToStringRenderer.RenderViewToStringAsync("~/Pages/Emails/ConfirmOrderEmail.cshtml", confirmAccountModel);

                        await _emailSender.SendEmailAsync(user.Email, "Xác nhận đơn hàng từ TimiShop", body);

                        return(new OkObjectResult(new { orderId = newOrder.Id, email = user.Email }));
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        return(new BadRequestObjectResult("Đặt hàng không thành công"));
                    }
                }
            }
        }