コード例 #1
0
        public async Task <bool> SaveAsync(OrderModel orderModel)
        {
            var order = await _orderRepository.GetByIdAsync(orderModel.OrderID);

            if (order != null)
            {
                throw new OrderException($"Order with this id {orderModel.OrderID} already exists.");
            }

            var company  = new Company(orderModel.CompanyID, orderModel.CompanyName);
            var newOrder = new Domain.Models.Order(orderModel.OrderID, orderModel.TypeOfOrder, orderModel.SubmittedBy, orderModel.Partner, company);

            foreach (var item in orderModel.LineItems)
            {
                var product = await _productRepository.GetByIdAsync(item.ProductID);

                if (product != null)
                {
                    newOrder.AddExistingItem(product);
                }
                else
                {
                    var newProduct = _productManager.OrderProduct(item.ToLineItemsDTO());
                    newOrder.AddItem(newProduct);
                }
            }

            return(await _orderRepository.Insert(newOrder));
        }
コード例 #2
0
        /// <summary>
        /// The purpose of this class is to insert new a new order into the database.
        /// </summary>
        /// <param name="Order">Type Domain.Models.Order. It will contain all data about customer, location, and a list of orderlines.</param>
        public int PlaceAnOrderForACustomer(Domain.Models.Order m_order)
        {
            // Create the Entity item to be put into the database
            Entities.OrderEntity order;
            order = MapperOrder.MapOrderWithOrderLines(m_order);

            // We need to grab the entity objects from the database for the inventory rows for the given location.
            // This is so we can update them accordingly.
            IEnumerable <Entities.InventoryEntity> dbStocks = _context.Inventories.Where(i => i.LocationId == m_order.LocationPlaced.ID);

            // Since we are returned all the rows of inventory we need to iterate through each one to update it
            // This is done no matter if there was 1 purchase or many changing the inventory just to be sure
            // everything is updated correctly.
            foreach (Entities.InventoryEntity i in dbStocks)
            {
                // We also need to iterate through all the Domain.Models.Stock list for the location
                foreach (var orderLine in m_order.Purchase)
                {
                    // An extra measure is taken here just to be sure that only books that exists in the database are being changed.
                    if (orderLine.BookISBN == i.BookIsbn)
                    {
                        i.Quantity -= orderLine.Quantity;
                    }
                }
            }

            // Add the new order and orderlines to the database
            _context.Add(order);

            // Save those changes
            Save();
            return(order.Id);
        }
コード例 #3
0
        public async Task <Unit> Handle(CreateOrderCommand request, CancellationToken cancellationToken)
        {
            var entity = new Domain.Models.Order
            {
                Name          = request.Name,
                Line1         = request.Line1,
                Line2         = request.Line2,
                Line3         = request.Line3,
                City          = request.City,
                State         = request.State,
                Zip           = request.Zip,
                Country       = request.Country,
                GiftWrap      = request.GiftWrap,
                AddedDateTime = dateTime.Now
            };

            context.Orders.Add(entity);
            await context.SaveChangesAsync(cancellationToken);

            var lines = request.Lines.Select(s =>
                                             new OrderLine {
                GameId = s.Game.Id, OrderId = entity.Id, Quantity = s.Quantity
            });

            context.OrderLines.AddRange(lines);

            await context.SaveChangesAsync(cancellationToken);

            return(Unit.Value);
        }
コード例 #4
0
        public ActionResult PlaceOrder()
        {
            try
            {
                if (ModelState.IsValid)
                {
                    _repository.FillBookLibrary();
                    Domain.Models.ShoppingCart shoppingCart = _cartrepository.GetShoppingCartByCustomerID(Int32.Parse(TempData.Peek("CustomerID").ToString()));
                    Domain.Models.Order        orderAttempt = new Domain.Models.Order();
                    foreach (var item in shoppingCart.CartItems)
                    {
                        orderAttempt.AddNewOrderLine($"{item.Book.ISBN}, {item.Quantity}");
                    }
                    orderAttempt.CustomerPlaced = _repository.GetCustomers().Where(c => c.ID == Int32.Parse(TempData.Peek("CustomerID").ToString())).First();
                    orderAttempt.LocationPlaced = orderAttempt.CustomerPlaced.MyStoreLocation;

                    orderAttempt.LocationPlaced.AttemptOrderAtLocation(orderAttempt);

                    int newOrderNumber = _repository.PlaceAnOrderForACustomer(orderAttempt);
                    _cartrepository.EmptyCart(orderAttempt.CustomerPlaced);
                    TempData["TotalCartItems"] = orderAttempt.CustomerPlaced.GetCartItemCount();
                    return(RedirectToAction("Details", "Order", new { id = newOrderNumber, justPlaced = true }));
                }

                return(View(nameof(Index)));
            }
            catch (Exception)
            {
                return(View(nameof(Index)));
            }
        }
コード例 #5
0
ファイル: Payment.cshtml.cs プロジェクト: T0shik/platform
        public async Task <IActionResult> OnPostAsync(
            string paymentId,
            [FromServices] CreateOrder createOrder,
            [FromServices] GetCart getCart,
            [FromServices] PaymentIntentService paymentIntentService,
            [FromServices] ILogger <Payment> logger)
        {
            var userId = User.GetUserId();
            var cartId = await getCart.Id(userId);

            if (cartId == 0)
            {
                logger.LogWarning($"Cart not found for {userId} with payment id {paymentId}");
                return(RedirectToPage("/Checkout/Error"));
            }

            var payment = await paymentIntentService.CaptureAsync(paymentId);

            if (payment == null)
            {
                logger.LogWarning($"Payment Intent not found {paymentId}");
                return(RedirectToPage("/Checkout/Error"));
            }

            var order = new Domain.Models.Order
            {
                StripeReference = paymentId,
                CartId          = cartId,
            };
            await createOrder.Do(order);

            return(RedirectToPage("/Checkout/Success", new { orderId = order.Id }));
        }
コード例 #6
0
 public static Entities.OrderEntity Map(Domain.Models.Order order)
 {
     return(new Entities.OrderEntity
     {
         Id = order.OrderNumber,
         CustomerId = order.CustomerPlaced.ID,
         LocationId = order.LocationPlaced.ID
     });
 }
コード例 #7
0
 /// <summary>
 /// Turn a model object into an entity order with their orderlines
 /// </summary>
 /// <param name="order"></param>
 /// <returns></returns>
 public static Entities.OrderEntity MapOrderWithOrderLines(Domain.Models.Order order)
 {
     return(new Entities.OrderEntity
     {
         Id = order.OrderNumber,
         CustomerId = order.CustomerPlaced.ID,
         LocationId = order.LocationPlaced.ID,
         Orderlines = order.Purchase.Select(MapperOrderLine.Map).ToList()
     });
 }
コード例 #8
0
        /// <summary>
        /// Async Method that sends order object message to the bus
        /// </summary>
        /// <param name="order">Order object</param>
        public async Task SendMessageAsync(Domain.Models.Order order)
        {
            var uri = new Uri("rabbitmq://localhost/order_queue");

            var endpoint = await _bus.GetSendEndpoint(uri);

            await endpoint.Send(order);

            _logger.LogDebug("Message sent");
        }
コード例 #9
0
        public async Task AddAsync(Domain.Models.Order order)
        {
            if (order.Status != Common.OrderStatus.Active)
            {
                var query = Builders <Domain.Models.Order> .Filter.Where(o => o.Id == order.Id);

                await Collection.DeleteOneAsync(query);
            }
            await Collection.InsertOneAsync(order);
        }
コード例 #10
0
ファイル: OrderMapper.cs プロジェクト: jovica0707/MVC
 public static OrderViewModel ToOrderViewModel(this Domain.Models.Order order)
 {
     return(new OrderViewModel
     {
         Id = order.Id,
         Delivered = order.Delivered,
         PaymentMethod = order.PaymentMethod,
         PizzaStore = order.PizzaStore,
         UserId = order.User.Id
     });
 }
コード例 #11
0
        public Domain.Models.Order Map(Entities.Order Order)
        {
            Domain.Models.Order mapOrder = new Domain.Models.Order();
            mapOrder.ID         = Order.ID;
            mapOrder.Store      = Map(Order.Store);
            mapOrder.Customer   = Map(Order.Customer);
            mapOrder.TotalPrice = Order.TotalPrice;
            mapOrder.TimePlaced = Order.TimePlaced;

            Order.Pizzas.ToList().ForEach(p => mapOrder.Pizzas.Add(Map(p)));

            return(mapOrder);
        }
コード例 #12
0
        public async Task <IActionResult> OnPostAsync(
            string paymentId,
            [FromServices] CreateOrder createOrder,
            [FromServices] GetCart getCart)
        {
            var order = new Domain.Models.Order
            {
                StripeReference = paymentId,
                CartId          = await getCart.Id(User.GetUserId()),
            };
            await createOrder.Do(order);

            return(RedirectToPage("/Checkout/Success", new { orderId = order.Id }));
        }
コード例 #13
0
        public async Task <IActionResult> CreateOrderAsync([FromBody] Domain.Models.Order order)
        {
            try
            {
                await _orderService.SendMessageAsync(order);

                return(Ok());
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(BadRequest(e.Message));
            }
        }
コード例 #14
0
 public static Web.Response.ResourceViewModels.Order MapDomainToOrderResponse(Domain.Models.Order order)
 {
     return(new Web.Response.ResourceViewModels.Order
     {
         CustomerName = order.CustomerName,
         ServerName = order.ServerName,
         OrderState = order.OrderState,
         Items = order.Items.Select(x => new Web.Response.ResourceViewModels.OrderItem
         {
             Name = x.Name,
             Price = x.Price,
             Quantity = x.Quantity
         }).ToList()
     });
 }
コード例 #15
0
        public static OrderDetailsViewModel ToOrderDetailsViewModel(this Domain.Models.Order order)
        {
            double price = 0;

            foreach (var pizzaOrder in order.PizzaOrders)
            {
                price += pizzaOrder.Price;
            }
            return(new OrderDetailsViewModel
            {
                Id = order.Id,
                Delivered = order.Delivered,
                PaymentMethod = order.PaymentMethod,
                PizzaStore = order.PizzaStore,
                UserFullName = $"{order.User.FirstName} {order.User.LastName}",
                PizzaNames = order.PizzaOrders.Select(x => x.Pizza.Name).ToList(),
                Price = price
            });
        }
コード例 #16
0
        public async Task SendOrderConfirmationEmailAsync(Domain.Models.Order order)
        {
            _mail.To.Add(new MailboxAddress("Reciever", "*****@*****.**"));
            _mail.Subject = order.ProductName;

            try
            {
                using var client = new MailKit.Net.Smtp.SmtpClient();
                await client.ConnectAsync("smtp.gmail.com", 587, false);

                await client.AuthenticateAsync(_connectionDataOptions.Value.UserName, _connectionDataOptions.Value.Password);

                await client.SendAsync(_mail);

                await client.DisconnectAsync(true);
            }
            catch (SmtpException exception)
            {
                System.Console.WriteLine(exception.Message);
            }
        }
コード例 #17
0
        public async Task <IActionResult> OnPostAsync(
            string paymentId,
            [FromServices] CreateOrder createOrder,
            [FromServices] GetCart getCart,
            [FromServices] PaymentIntentService paymentIntentService)
        {
            var payment = await paymentIntentService.GetAsync(paymentId);

            if (payment == null)
            {
                //todo do some kinda notification that this went wrong.
                return(RedirectToPage());
            }

            var order = new Domain.Models.Order
            {
                StripeReference = paymentId,
                CartId          = await getCart.Id(User.GetUserId()),
            };
            await createOrder.Do(order);

            return(RedirectToPage("/Checkout/Success", new { orderId = order.Id }));
        }
コード例 #18
0
        public async Task <IActionResult> Index(
            [FromServices] IOptionsMonitor <StripeSettings> optionsMonitor,
            [FromServices] CreateOrder createOrder,
            [FromServices] GetCart getCart)
        {
            StripeConfiguration.ApiKey = optionsMonitor.CurrentValue.SecretKey;
            var json = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();

            try
            {
                var stripeEvent = EventUtility.ConstructEvent(json,
                                                              Request.Headers["Stripe-Signature"],
                                                              optionsMonitor.CurrentValue.SigningSecret);

                _logger.LogInformation("received stripe event {0} {1}", Environment.NewLine, json);

                if (stripeEvent.Type == Events.PaymentIntentCreated)
                {
                    var paymentMethod = stripeEvent.Data.Object as PaymentIntent;
                }
                else if (stripeEvent.Type == Events.ChargeSucceeded)
                {
                    var paymentMethod = stripeEvent.Data.Object as Charge;
                }
                else if (stripeEvent.Type == Events.PaymentMethodAttached)
                {
                    var paymentMethod = stripeEvent.Data.Object as PaymentMethod;
                }
                else if (stripeEvent.Type == Events.PaymentIntentSucceeded)
                {
                    var paymentIntent = stripeEvent.Data.Object as PaymentIntent;
                }
                else if (stripeEvent.Type == Events.CustomerCreated)
                {
                    var paymentMethod = stripeEvent.Data.Object as Customer;
                }
                else if (stripeEvent.Type == Events.CheckoutSessionCompleted)
                {
                    var checkoutSession = stripeEvent.Data.Object as Session;

                    var order = new Domain.Models.Order
                    {
                        StripeReference = checkoutSession.Id,
                        CartId          = await getCart.Id(checkoutSession.Metadata["user_id"]),
                    };
                    await createOrder.Do(order);

                    _logger.LogInformation("created order {0},{1}: {2}", order.Id, Environment.NewLine,
                                           JsonConvert.SerializeObject(order));
                }
                else
                {
                    return(BadRequest());
                }

                return(Ok());
            }
            catch (StripeException e)
            {
                return(BadRequest(e.Message));
            }
        }
コード例 #19
0
        /// <summary>
        /// 根据销售单状态反向写入订单状态,由同一订单下所有发货单状态来决策出订单状态
        /// 订单如果发货了,则需要同步发货状态及发货包裹,插入发货日志
        /// 目前实现有很大的问题 wxh备注 2014-04-20 0:17:43
        /// </summary>
        /// <param name="opcSale"></param>
        private void SetOrderStatus(Domain.Models.Order order)
        {
            const int PrepareShip = 7;
            const int Shipping    = 8;

            using (var db = new YintaiHZhouContext())
            {
                using (var ts = new TransactionScope())
                {
                    var p          = db.Orders.FirstOrDefault(t => t.OrderNo == order.OrderNo);
                    var saleOrders = db.OPC_Sale.Where(sa => sa.OrderNo == p.OrderNo).ToList();
                    var status     = CheckStatus(saleOrders);
                    if (status == order.Status || status == NoStatus)
                    {
                        return;
                    }
                    p.UpdateDate = DateTime.Now;
                    p.Status     = status;
                    p.UpdateUser = SystemDefine.SystemUser;
                    if (status == (int)EnumOrderStatus.PreparePack)
                    {
                        db.OrderLogs.Add(new OrderLog()
                        {
                            CreateDate = DateTime.Now,
                            CreateUser = 0,
                            CustomerId = order.CustomerId,
                            Operation  = order.Memo ?? "准备发货",
                            OrderNo    = order.OrderNo,
                            Type       = PrepareShip,
                        });
                    }
                    if (status == (int)EnumOrderStatus.Shipped)
                    {
                        db.OrderLogs.Add(new OrderLog()
                        {
                            CreateDate = DateTime.Now,
                            CreateUser = 0,
                            CustomerId = order.CustomerId,
                            Operation  = "已发货",
                            OrderNo    = order.OrderNo,
                            Type       = Shipping,
                        });

                        foreach (int shippingId in saleOrders.Select(x => x.ShippingSaleId).Distinct().Where(x => x.HasValue))
                        {
                            var shipping      = db.OPC_ShippingSale.FirstOrDefault(x => x.Id == shippingId);
                            var shippingItems =
                                db.OPC_Sale.Where(
                                    x => x.ShippingSaleId.HasValue && x.ShippingSaleId.Value == shipping.Id)
                                .Join(db.OPC_SaleDetail, s => s.SaleOrderNo, d => d.SaleOrderNo, (s, d) => d)
                                .Join(db.OrderItems, d => d.OrderItemID, x => x.Id,
                                      (detail, item) => new { detail, item });
                            if (shipping == null)
                            {
                                continue;
                            }

                            var outboundNo = CreateOutBoundNo(shipping.StoreId.HasValue ? shipping.StoreId.Value : 0);
                            db.Outbounds.Add(new Outbound()
                            {
                                OutboundNo            = outboundNo,
                                SourceNo              = shipping.OrderNo,
                                SourceType            = 1,
                                ShippingContactPerson = shipping.ShippingContactPerson,
                                CreateDate            = DateTime.Now,
                                CreateUser            = 0,
                                Status          = 1,
                                ShippingVia     = shipping.ShipViaId,
                                ShippingNo      = shipping.ShippingCode,
                                ShippingAddress = shipping.ShippingAddress,
                                UpdateDate      = DateTime.Now,
                                UpdateUser      = 0
                            });

                            foreach (var di in shippingItems)
                            {
                                db.OutboundItems.Add(new OutboundItem()
                                {
                                    CreateDate  = DateTime.Now,
                                    ColorId     = di.item.ColorValueId,
                                    ItemPrice   = di.item.ItemPrice,
                                    UnitPrice   = di.item.UnitPrice.Value,
                                    ExtendPrice = di.item.ExtendPrice,
                                    OutboundNo  = outboundNo,
                                    ProductId   = di.item.ProductId,
                                    Quantity    = di.detail.SaleCount,
                                    SizeId      = di.item.SizeValueId,
                                    UpdateDate  = DateTime.Now
                                });
                            }
                        }
                    }
                    db.SaveChanges();
                    ts.Complete();
                    Log.InfoFormat("完成订单状态更新,orderNo:{0},status:{1}", p.OrderNo, status);
                }
            }
        }
コード例 #20
0
 private void Split(Domain.Models.Order order)
 {
     using (var db = new YintaiHZhouContext())
     {
         using (var ts = new TransactionScope())
         {
             var items =
                 db.OrderItems.Where(i => i.OrderNo == order.OrderNo)
                 .Join(db.Products, i => i.ProductId, p => p.Id, (i, p) => new { product = p, item = i })
                 .Join(db.IMS_Associate.Where(a => a.Status == 1), x => x.product.CreatedUser, a => a.UserId,
                       (x, a) => new { x.item, sectionid = a.SectionId }).GroupBy(x => x.sectionid);
             int idx = 1;
             foreach (var item in items)
             {
                 var saleOrderNo = string.Format("{0}-{1}", idx.ToString("D").PadLeft(3, '0'), order.OrderNo);
                 var sectionId   = item.Key;
                 var section     = db.Sections.FirstOrDefault(s => s.Id == sectionId);
                 //var sectionCode =
                 //    db.OPC_ChannelMap.FirstOrDefault(
                 //        x => x.MapType == (int)ChannelMapType.SectionId && x.InnerValue == sectionId);
                 decimal saleAmount = 0;
                 int     salesCount = 0;
                 foreach (var p in item)
                 {
                     saleAmount += p.item.ItemPrice * p.item.Quantity;
                     salesCount += p.item.Quantity;
                     db.OPC_SaleDetail.Add(new OPC_SaleDetail()
                     {
                         SaleOrderNo  = saleOrderNo,
                         CreatedDate  = DateTime.Now,
                         CreatedUser  = -10000,
                         OrderItemID  = p.item.Id,
                         Price        = p.item.ItemPrice,
                         ProdSaleCode = p.item.StoreSalesCode,
                         Remark       = "自拍商品订单",
                         SaleCount    = p.item.Quantity,
                         RemarkDate   = DateTime.Now,
                         SectionCode  = section == null ? string.Empty : section.SectionCode,
                         Status       = 0,
                         StockId      = -1,
                         UpdatedDate  = DateTime.Now,
                         UpdatedUser  = -10000,
                     });
                 }
                 db.OPC_Sale.Add(new OPC_Sale()
                 {
                     OrderNo     = order.OrderNo,
                     SaleOrderNo = saleOrderNo,
                     SalesType   = 0,
                     Status      = 0,
                     SellDate    = order.CreateDate,
                     SalesAmount = saleAmount,
                     SalesCount  = salesCount,
                     SectionId   = item.Key,
                     Remark      = "自拍商品订单",
                     RemarkDate  = DateTime.Now,
                     CreatedUser = -10000,
                     CreatedDate = DateTime.Now,
                     UpdatedUser = -10000,
                     UpdatedDate = DateTime.Now,
                 });
                 var splitLog = new OPC_OrderSplitLog
                 {
                     OrderNo    = order.OrderNo,
                     Reason     = "拆单成功",
                     Status     = 1,
                     CreateDate = DateTime.Now
                 };
                 db.OPC_OrderSplitLog.Add(splitLog);
                 db.SaveChanges();
                 idx += 1;
             }
             ts.Complete();
             Log.ErrorFormat("自拍商品拆单成功 OrderNo = {0}", order.OrderNo);
         }
     }
 }
コード例 #21
0
        public void AddOrder(Domain.Models.Order order, int storeID, int userID)
        {
            var newOrder = new Order();

            newOrder.DateOrdered = order.DateOrdered.ToString();
            newOrder.UserId      = userID;
            newOrder.StoreId     = storeID;
            newOrder.Placed      = order.Placed;
            newOrder.Completed   = order.Completed;
            db.Order.Add(newOrder);
            db.SaveChanges();

            var newOrderJunction = new OrderJunction();

            newOrderJunction.Order   = newOrder;
            newOrderJunction.StoreId = storeID;


            foreach (var pizza in order.Pizzas)
            {
                var newPizza = new Pizza();

                newPizza.Crust = new Crust()
                {
                    Name = pizza.Crust.Name
                };
                newPizza.Size = new Size()
                {
                    Name = pizza.Size.pSize
                };
                newPizza.Name = pizza.Name;

                db.Pizza.Add(newPizza);
                db.SaveChanges();

                foreach (var top in pizza.Toppings)
                {
                    foreach (var dbtop in db.Topping.ToList())
                    {
                        if (top.Name.Equals(dbtop.Name))
                        {
                            PizzaTopping ptop = new PizzaTopping();
                            ptop.PizzaId   = newPizza.PizzaId;
                            ptop.ToppingId = dbtop.ToppingId;
                            db.PizzaTopping.Add(ptop);
                            db.SaveChanges();
                        }
                    }

                    // PizzaTopping ptop = new PizzaTopping();
                    // ptop.Pizza = newPizza;
                    // ptop.Topping = new Topping() {Name = top.Name};
                    // db.PizzaTopping.Add(ptop);
                }

                var pj = new PizzaJunction();
                pj.Order = newOrder;
                pj.Pizza = newPizza;
                db.PizzaJunction.Add(pj);
                db.SaveChanges();
            }

            db.SaveChanges();
        }
コード例 #22
0
        public async Task <bool> Insert(Domain.Models.Order order)
        {
            _context.Orders.Add(order);

            return(await _context.SaveChangesAsync() > 0);
        }