public ProfileCreditContract[] InsertCreditTransaction(CreditTransactionContract[] d) { lock (MDB) { try { if (d != null && d.Any()) { foreach (var x in d) { if (x.CreditTransaction.TransactionTime == default(DateTime)) { x.CreditTransaction.TransactionTime = DateTime.UtcNow; } var ct = new DB.CreditTransaction(); x.CreditTransaction.CopyTo(ct, false); MDB.CreditTransactions.InsertOnSubmit(ct); } //Recalculate ballance var affectedBallances = new Code.BallanceManager().RecalcBallance(MDB, MDB.GetChangeSet().Inserts.OfType <DB.CreditTransaction>()); MDB.SubmitChanges(); return(affectedBallances.Select(x => new ProfileCreditContract() { ProfileCredit = x }).ToArray()); } } catch (Exception ex) { HandleMyException(ex); } return(new ProfileCreditContract[] { }); } }
internal DB.ProfileCredit ReplaceCreditTransaction(DB.MembershipCashierEntitiesDataContext Db, DB.CreditTransaction prevCt, ICreditTransaction newCt) { var pc = Db.ProfileCredits.First(x => x.LocationId == prevCt.LocationId && x.ProductId == prevCt.ProductId && x.UserId == prevCt.UserId); var adjustmentUnits = newCt.BallanceUnits - prevCt.BallanceUnits; var oldPrice = FindProductPriceAtPointInTime(Db, prevCt.ProductId, prevCt.TransactionTime); var newPrice = FindProductPriceAtPointInTime(Db, prevCt.ProductId, prevCt.TransactionTime); var priceDiff = newPrice.Price - oldPrice.Price; if (adjustmentUnits != 0 || priceDiff != decimal.Zero) { if (adjustmentUnits == 0) //only price changed { if (pc.Location.IsCredeitReversed) { pc.Ballance = pc.Ballance + (prevCt.BallanceUnits * oldPrice.Price) - (newCt.BallanceUnits * newPrice.Price); } else { pc.Ballance = pc.Ballance - (prevCt.BallanceUnits * oldPrice.Price) + (newCt.BallanceUnits * newPrice.Price); } } else if (priceDiff == decimal.Zero) //price stayed the same { pc.BallanceUnits += adjustmentUnits; if (pc.Location.IsCredeitReversed) { pc.Ballance = pc.Ballance - (adjustmentUnits * oldPrice.Price); } else { pc.Ballance = pc.Ballance + (adjustmentUnits * oldPrice.Price); } } else //both price and amount changed { pc.BallanceUnits += adjustmentUnits; if (pc.Location.IsCredeitReversed) { pc.Ballance = pc.Ballance + (prevCt.BallanceUnits * oldPrice.Price) - (newCt.BallanceUnits * newPrice.Price); } else { pc.Ballance = pc.Ballance - (prevCt.BallanceUnits * oldPrice.Price) + (newCt.BallanceUnits * newPrice.Price); } } } return(pc); }