/// <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(); }
/// <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); }