/// <summary> /// The add package payment transaction. /// </summary> /// <param name="packageId"> /// The package id. /// </param> /// <returns> /// The <see cref="Tuple"/>. /// </returns> /// <exception cref="InvalidOperationException"> /// Balance cannot be negative. /// </exception> public Tuple<Package, decimal> AddPackagePaymentTransaction(int packageId) { using (var context = new ShopAnyWareSql()) { var package = context.PackagesWithUserAndWallet().Single(p => p.Id.Equals(packageId)); var newTransaction = Transaction.CreatePackagePaymentTransaction(package); var wallet = package.User.Wallet; wallet.PackagePayment(newTransaction.OperationAmount); var brokenRules = wallet.GetBrokenRules(); if (brokenRules.Any()) { throw new InvalidOperationException("Wallet amount can't be negative"); } package.ChangePackageStatus(PackageStatus.Paid); context.Packages.Attach(package); context.Entry(package).State = System.Data.EntityState.Modified; context.Transactions.Add(newTransaction); context.SaveChanges(); return new Tuple<Package, decimal>(package, wallet.Amount); } }