Beispiel #1
0
        /// <summary>
        /// Creates a new, detached <see cref="OrderProduct"/> for further processing.
        /// </summary>
        /// <param name="product">Product this order is derived from</param>
        /// <param name="userName">Assigned user</param>
        /// <returns>An <see cref="OrderProduct"/> instance.</returns>
        public OrderProduct CreateOrderProduct(Product product, string userName)
        {
            var op = new OrderProduct();

            using (var scope = Ctx.BeginTransaction()) {
                CreateOrderProductInternal(op, product, userName);
                // associate this product with the new orderproduct
                op.SourceProduct = product;
                scope.Commit();
            }
            return(op);
        }
Beispiel #2
0
        private void CreateOrderProductInternal(OrderProduct op, Product product, string userName)
        {
            // scope product and address management
            using (var scope = Ctx.BeginTransaction()) {
                var web = Ctx.OrderMedias.FirstOrDefault(m => m.Name == "Web" && m.Available);
                op.Media = new List <OrderMedia>(new[] { web });
                var user = Ctx.Users
                           .Include(u => u.Profile.Addresses)
                           .Single(u => u.UserName == userName);
                op.Owner = user;

                // orders are based on specific product
                product.CopyProperties <Product>(op,
                                                 o => o.Colored,
                                                 o => o.Content,
                                                 o => o.Dedication,
                                                 o => o.Issue,
                                                 o => o.Name,
                                                 o => o.Proprietor,
                                                 o => o.SubTitle,
                                                 o => o.Title,
                                                 o => o.Owner,
                                                 o => o.Work);
                op.Store = new OrderStore {
                    FullFillment = FullFillmentState.Created,
                    Name         = String.Format(ControllerResources.OrderManager_CreateOrderProductInternal_Order_for__0_, op.Name)
                };

                var sa            = new OrderShippingAddress();
                var ba            = new OrderInvoiceAddress();
                var userAddresses = user.Profile.Addresses.OfType <AddressBook>().ToList().Where(a => a.GetType() == typeof(AddressBook));
                var hasDefault    = user.Profile.Addresses.Any(a => a.Default);
                var hasInvoice    = user.Profile.Addresses.Any(a => a.Invoice);
                // we assume that there is only one/no Default and one/no Invoice
                var defaultAddress = hasDefault ? userAddresses.Single(a => a.Default) : userAddresses.FirstOrDefault(a => a.GetType() == typeof(AddressBook));
                var invoiceAddress = hasInvoice ? userAddresses.Single(a => a.Invoice) : userAddresses.FirstOrDefault(a => a.GetType() == typeof(AddressBook));
                if (defaultAddress != null)
                {
                    defaultAddress.CopyProperties <AddressBook>(sa,
                                                                d => d.City,
                                                                d => d.Country,
                                                                d => d.Name,
                                                                d => d.Region,
                                                                d => d.StreetNumber,
                                                                d => d.Zip
                                                                );
                    sa.OrderProduct = op;
                    sa.Profile      = user.Profile;
                    sa.Default      = true;
                    Ctx.AddressBook.Add(sa);
                    op.ShippingAddress = sa;
                }
                else
                {
                    throw new NoAddressException()
                          {
                              UserId = user.Id, EntityId = op.Id, EntityName = "OrderProduct"
                          };
                }
                // prepare billing address
                if (invoiceAddress != null)
                {
                    defaultAddress.CopyProperties <AddressBook>(ba,
                                                                d => d.City,
                                                                d => d.Country,
                                                                d => d.Name,
                                                                d => d.Region,
                                                                d => d.StreetNumber,
                                                                d => d.Zip
                                                                );
                    ba.OrderProduct   = op; // assignment makes the address invisible for user and prevents further changes
                    ba.Profile        = user.Profile;
                    ba.Invoice        = true;
                    op.BillingAddress = ba;
                    Ctx.AddressBook.Add(ba);
                }
                else
                {
                    throw new NoAddressException()
                          {
                              UserId = user.Id, EntityId = op.Id, EntityName = "OrderProduct"
                          };
                }
                Ctx.OrderProducts.Add(op);
                SaveChanges();
                scope.Commit();
            }
        }