Ejemplo n.º 1
0
        /// <summary>
        /// Markiert einen Auftrag als bezahlt.
        /// </summary>
        /// <param name="order"></param>
        public void PayOrder(Entities db, Order order, string mailBody = null)
        {
            if (order == null)
            {
                throw new ArgumentNullException("order");
            }

            order.PaidAt = DateTime.Now; // TODO: Vielleicht hat der Kunde schon vorher gezahlt?

            // Wenn kein Bestätigungs-Mail-Body angegeben wurde,
            // müssen wir den selber erstellen.
            var body = mailBody == null
                ? Nustache.Core.Render.StringToString(db.Parameters.First().MailMessagePaid, order)
                : mailBody;

            // Email an den Kunden schicken.
            MailService.SendMailToCustomer(order.Email, "Wir haben Deine Bezahlung erhalten", body);

            db.SaveChanges();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Bestellung abgeben.
        /// </summary>
        /// <param name="order"></param>
        /// <param name="productIdsAndQtys"></param>
        public void PlaceOrder(Entities db, Order order, IDictionary <int, int> productIdsAndQtys)
        {
            using (var transaction = new TransactionScope()) {
                // Bestellung mit Datum versehen und in DB speichern.
                order.CreatedAt = DateTime.Now;
                // Die Bestellung muss erstmal ohne Bestellzeilen gespeichert werden,
                // damit wir eine BestellID aus der DB haben.
                db.Orders.Add(order);
                db.SaveChanges();

                foreach (var id in productIdsAndQtys.Keys)
                {
                    var product = db.Products
                                  .Include(p => p.ShippingCategory) // Brauchen wird für die Versandkostenberechnung.
                                  .FirstOrDefault(x => x.Id == id);
                    var qty = productIdsAndQtys[id];
                    if (product == null)
                    {
                        throw new AppException(string.Format(
                                                   "Das Produkt mit der Id {0} ist nicht verfügbar!",
                                                   id));
                    }
                    // Nicht mehr genug vom Produkt auf Lager?
                    if (product.Available < qty)
                    {
                        throw new AppException(string.Format(
                                                   "Von {0} ist/sind nur noch {1} Stück auf Lager. Bitte Menge anpassen.",
                                                   product.Name,
                                                   product.Available));
                    }

                    // Menge abziehen.
                    product.Available -= qty;

                    // Produkte zur Bestellung hinzufügen.
                    order.OrderLines.Add(new OrderLine()
                    {
                        OrderId   = order.Id,
                        ProductId = id,
                        Product   = product,
                        Qty       = qty
                    });
                }
                // ...speichern.
                db.SaveChanges();

                // Preis berechnen
                order.SubTotalPrice = CalculateSubTotalPrice(order);
                // Versandkosten berechnen
                order.ShippingCosts = CalculateShippingCosts(order);

                // Validierung.
                var vc = new ValidationContext(order, null, null);
                Validator.ValidateObject(order, vc, true);

                // ...speichern.
                db.SaveChanges();

                // Bestätigungsmail verschicken.
                var mailBody = Nustache.Core.Render.StringToString(db.Parameters.First().MailMessageOrdered, order);
                MailService.SendMailToCustomer(order.Email, "Deine Bestellung bei lillypark.com", mailBody);

                transaction.Complete();
            }

            // Benachrichtgung an den Shopinhaber, dass eine neue
            // Bestellung eingegangen ist.
            // INFO: Wenn das Verschicken fehlschlägt, soll die Bestellung dennoch angenommen werden.
            var ownerMailBody = string.Format(@"
Hi Lilly/Hoonie,

guckst Du <a href=""http://lillypark.com/orders/details/{0}"">hier</a>.

Liebe Grüße,

Dein WebShop", order.Id);

            MailService.SendMailToOwner("Eine neue Bestellung ist eingegangen.", ownerMailBody);
        }