public void ChangeStakeBackTest() { IoCContainer.Kernel.Unbind <IMediator>(); IoCContainer.Kernel.Bind <IMediator>().To <MyMessageMediator>().InSingletonScope(); IoCContainer.Kernel.Unbind <IChangeTracker>(); IoCContainer.Kernel.Bind <IChangeTracker>().To <ChangeTracker>().InSingletonScope(); var ChangeTracker = IoCContainer.Kernel.Get <IChangeTracker>(); IoCContainer.Kernel.Unbind <ITicketHandler>(); IoCContainer.Kernel.Bind <ITicketHandler>().To <TicketHandler>().InSingletonScope(); var TicketHandler = IoCContainer.Kernel.Get <ITicketHandler>(); TipItemVw tiv1 = new TipItemVw(new TestOdd() { OutcomeId = 1, OddId = { Value = 1 }, BetDomain = new TestBetDomain() { BetDomainId = 1, Match = new TestMatchLn() { MatchId = 1 } }, Value = { Value = 1.85M } }) { IsChecked = true }; TicketHandler.TicketsInBasket.Add(new Ticket()); TicketHandler.TicketsInBasket[0] = new Ticket(); TicketHandler.TicketsInBasket[0].MaxBet = 5000; TicketHandler.TicketsInBasket[0].TipItems.Add(tiv1); ChangeTracker.CurrentUser = new LoggedInUser(0, "", 1000.20m, 10, 10, 10); var model = new BaseViewModel(); TicketHandler.OnChangeStake("+0.50", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool); Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 0.50m); TicketHandler.OnChangeStake("+0.50", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool); Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 1.00m); TicketHandler.OnChangeStake("+100", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool); TicketHandler.OnChangeStake("+0.50", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool); Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 101.50m); TicketHandler.OnChangeStake("back", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool); Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 101.00m); TicketHandler.OnChangeStake("back", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool); Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 10.00m); }
private static int?minCombinationOfAll(TipItemVw item) { int?minComb = 0; //if (item != null && item.Odd != null && item.Odd.BetDomain != null) //{ // minComb = item.Odd.BetDomain.MinCombination; // var curMatch = item.Odd.BetDomain.Match; // if (curMatch != null && curMatch.MinCombination > minComb) // { // minComb = curMatch.MinCombination; // } //} return(minComb); }
public void ChangeStakeTest() { IoCContainer.Kernel.Unbind <IMediator>(); IoCContainer.Kernel.Bind <IMediator>().To <MyMessageMediator>().InSingletonScope(); IoCContainer.Kernel.Unbind <IChangeTracker>(); IoCContainer.Kernel.Bind <IChangeTracker>().To <ChangeTracker>().InSingletonScope(); var ChangeTracker = IoCContainer.Kernel.Get <IChangeTracker>(); IoCContainer.Kernel.Unbind <ITicketHandler>(); IoCContainer.Kernel.Bind <ITicketHandler>().To <TicketHandler>().InSingletonScope(); var TicketHandler = IoCContainer.Kernel.Get <ITicketHandler>(); TicketHandler.TicketsInBasket.Add(new Ticket()); TranslationProvider.Setup(x => x.Translate(MultistringTags.ADD_XX_TO_STAKE)).Returns("{0}"); TranslationProvider.Setup(x => x.Translate(MultistringTags.TERMINAL_STAKE_EXCEEDED_MAXBET)).Returns("maxbet"); TipItemVw tiv1 = new TipItemVw(new TestOdd() { OutcomeId = 1, OddId = { Value = 1 }, BetDomain = new TestBetDomain() { BetDomainId = 1, Match = new TestMatchLn() { MatchId = 1 } }, Value = { Value = 1.85M } }) { IsChecked = true }; TicketHandler.TicketsInBasket[0].MaxBet = 5000; TicketHandler.TicketsInBasket[0].TipItems.Add(tiv1); ChangeTracker.CurrentUser = new LoggedInUser(0, "", 10.20m, 10, 10, 10); var model = new BaseViewModel(); TicketHandler.OnChangeStake("max", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool); TicketHandler.OnChangeStake("max", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool); TicketHandler.OnChangeStake("max", TicketHandler.TicketsInBasket[0], ChangeTracker.CurrentUser.Cashpool); Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 10.20m); var resultString = TicketHandler.OnChangeStake("5", TicketHandler.TicketsInBasket[0], 0); //Assert.AreEqual(MultistringTags.TERMINAL_STAKE_EXCEEDED_MAXBET, resultString.Item1); Assert.AreEqual(TicketHandler.TicketsInBasket[0].MaxBet, 5000.00m); Assert.AreEqual(TicketHandler.TicketsInBasket[0].Stake, 10.20m); }
public static bool RemoveBank(OddVw curOdd) { int count = 0; TipItemVw modifyItem = null; foreach (TipItemVw curItem in TipItems) { if (curItem.Odd.BetDomain.BetDomainId == curOdd.LineObject.BetDomain.BetDomainId) { count++; modifyItem = curItem; } } if (count < 2 && modifyItem != null) { modifyItem.IsBank = false; } return(count < 2); }
public static void UpdateSystemOrCombiticket(Ticket ticketToCalculate) { lock (locker) { if (ticketToCalculate == null) { ticketToCalculate = ChangeTracker.NewTicket; } List <TipItemVw> localTipItems = new List <TipItemVw>(); localTipItems = ticketToCalculate.TipItems.Where(x => x.IsChecked).ToList(); decimal oddVal = 1; decimal multiWayOddVal = 1; int? minCombMax = 0; int bonusTipsCount = 0; Dictionary <int, List <TipItemVw> > tipItemDict = new Dictionary <int, List <TipItemVw> >(); foreach (TipItemVw t in localTipItems) { int iSvrMatchId = (int)t.Match.MatchId; if (tipItemDict.ContainsKey(iSvrMatchId)) { tipItemDict[iSvrMatchId].Add(t); } else { List <TipItemVw> list = new List <TipItemVw>(); list.Add(t); tipItemDict.Add(iSvrMatchId, list); } } // de: Anzahl der Wege berechnen // en: Number of ways to calculate // de: h?chste Quote der Mehrwege finden // en: highest rate of multipath are // int pathCount = 0; int rowCount = 1; int singlesCount = 0; foreach (List <TipItemVw> list in tipItemDict.Values) { if (list.Count >= 1) { decimal maxOdd = 1; foreach (TipItemVw tip in list) { if (maxOdd < tip.Odd.Value.Value) { maxOdd = tip.Odd.Value.Value; } } TipItemVw t = list[0]; if (t.IsBank || list.Count > 1) { pathCount++; rowCount *= list.Count; multiWayOddVal *= maxOdd; } else { oddVal *= maxOdd; singlesCount++; } int?curCombMax = minCombinationOfAll(t); if (curCombMax > minCombMax) { minCombMax = curCombMax; } if (list.Count == 1 && ticketToCalculate.TicketState == TicketStates.Multy) { if (t.Odd.Value.Value >= BonusFromOdd) { //Bonus gibt es nicht bei Mehrwegen bonusTipsCount++; } } } } TipListInfo.MinCombination = minCombMax; TipListInfo.NumOfTipps = tipItemDict.Count; TipListInfo.PathCount = pathCount; TipListInfo.RowCount = rowCount; TipListInfo.MultiWayOddFactor = multiWayOddVal; TipListInfo.CurrentTicketPossibleWin = 0; TipListInfo.FullOddFactor = 0; TipListInfo.ManipulationFeePercentage = StationRepository.GetManipulationFeePercentage(ticketToCalculate); TipListInfo.BonusFactor = StationRepository.GetBonusValueForBets(ticketToCalculate) / 100 + 1; switch (ticketToCalculate.TicketState) { default: if (localTipItems.Count > 1 && ticketToCalculate.TicketState != TicketStates.MultySingles) { ticketToCalculate.TicketState = TicketStates.Multy; UpdateSystemOrCombiticket(ticketToCalculate); return; } foreach (var tipItem in localTipItems) { tipItem.IsBank = false; } if (localTipItems.Count == 1 && ticketToCalculate.TicketState != TicketStates.MultySingles) { UpdateSingleticketItems(localTipItems, ticketToCalculate); } if (localTipItems.Count == 0) { TipListInfo.MinBet = 0; TipListInfo.OddOfTipps = 0; TipListInfo.MaxBet = 0; TipListInfo.MinWin = 0; TipListInfo.MaxWin = 0; TipListInfo.ManipulationFeePercentage = 0; TipListInfo.ResetNumXY(); } break; case TicketStates.MultySingles: return; case TicketStates.Multy: //rowCount = 1; TipListInfo.ResetNumXY(); if (localTipItems.Count < 2) { ticketToCalculate.TicketState = TicketStates.Single; UpdateSystemOrCombiticket(ticketToCalculate); return; } //TipListInfo.FullOddFactor = oddVal * multiWayOddVal * TipListInfo.BonusFactor; TipListInfo.FullOddFactor = oddVal * multiWayOddVal; if (TipListInfo.FullOddFactor >= MaxOdd) { TipListInfo.IsMaxOddBet = true; if (TipListInfo.FullOddFactor > MaxOdd) { TipListInfo.IllegalOddFactor = TipListInfo.FullOddFactor; ticketToCalculate.MaxOddExceeded = true; } TipListInfo.FullOddFactor = MaxOdd; TipListInfo.OddOfTipps = MaxOdd; } else { TipListInfo.OddOfTipps = oddVal * multiWayOddVal; TipListInfo.IllegalOddFactor = 0; TipListInfo.IsMaxOddBet = false; ticketToCalculate.MaxOddExceeded = false; } foreach (var tipItem in localTipItems) { tipItem.IsBank = false; } TipListInfo.MinBet = MinStakeCombiBet; TipListInfo.MaxBet = StationRepository.GetMaxStakeCombi(ticketToCalculate); TipListInfo.MinWin = TipListInfo.FullOddFactor * TipListInfo.MinBet / rowCount * (100 - TipListInfo.ManipulationFeePercentage) / 100; var manipulationFee = (TipListInfo.MaxBet / rowCount * TipListInfo.ManipulationFeePercentage) / 100; //TipListInfo.MaxWin = ((TipListInfo.MaxBet / rowCount - manipulationFee) * TipListInfo.FullOddFactor * TipListInfo.BonusFactor) - TipListInfo.MaxBet / rowCount; //TipListInfo.MaxWin *= rowCount; TipListInfo.MaxWin = (((TipListInfo.MaxBet - manipulationFee) / rowCount) * TipListInfo.FullOddFactor * TipListInfo.BonusFactor) - TipListInfo.MaxBet; var maxWinMultiBetFromAdmin = StationRepository.GetMaxWinMultiBet(ticketToCalculate); if (maxWinMultiBetFromAdmin > 0 && TipListInfo.MaxWin > maxWinMultiBetFromAdmin) { var a0 = 100 * maxWinMultiBetFromAdmin * rowCount; var a1 = (100 - TipListInfo.ManipulationFeePercentage); var a2 = (a1 * TipListInfo.BonusFactor * TipListInfo.FullOddFactor); var varX = (a0) / (a2 - 100 * rowCount); TipListInfo.MaxBet = Round(varX, 2); //manipulationFee = (TipListInfo.MaxBet / rowCount * TipListInfo.ManipulationFeePercentage) / 100; } //var posWin = TipListInfo.FullOddFactor * TipListInfo.Bet / rowCount; //TipListInfo.CurrentTicketPossibleWin = posWin * ((100 - TipListInfo.ManipulationFeePercentage) / 100) * TipListInfo.BonusFactor; var pw1 = (TipListInfo.Bet - (TipListInfo.Bet * TipListInfo.ManipulationFeePercentage / 100)) * TipListInfo.BonusFactor * TipListInfo.FullOddFactor; TipListInfo.CurrentTicketPossibleWin = pw1 / rowCount; //TipListInfo.MaxWin = (TipListInfo.MaxBet - manipulationFee) * TipListInfo.FullOddFactor * TipListInfo.BonusFactor / rowCount; TipListInfo.MaxWin = ((TipListInfo.MaxBet - (TipListInfo.MaxBet * TipListInfo.ManipulationFeePercentage / 100)) * TipListInfo.BonusFactor * TipListInfo.FullOddFactor) / rowCount; TipListInfo.FullOddFactor = TipListInfo.FullOddFactor; break; case TicketStates.System: TipListInfo.SystemX = ticketToCalculate.SystemX; TipListInfo.IllegalOddFactor = 0; int ind = 0; if (!LimitHandling.SystemBetYAllowed(TipListInfo.SystemY)) { //avoid useless time and memory consuming calculations TipListInfo.MinBet = 0; TipListInfo.OddOfTipps = 0; TipListInfo.MaxBet = 0; TipListInfo.MinWin = 0; TipListInfo.MaxWin = 0; TipListInfo.ManipulationFeePercentage = 0; TipListInfo.ResetNumXY(); //UpdateSystemOrCombiticket(ticketToCalculate); return; } if (TipListInfo.SystemX == 0) { TipListInfo.ResetNumXY(); } decimal[] oddVals = new decimal[TipListInfo.SystemY]; bool disableBankBtn = TipListInfo.PathCount + TipListInfo.MinSystemY >= TipListInfo.NumOfTipps; decimal dBankTipValue = 0; foreach (TipItemVw t in localTipItems) { if (!t.IsBank && t.Odd != null) { if (ind < oddVals.Length) { oddVals[ind++] = t.Odd.Value.Value; } else { } t.IsBankEnabled = !disableBankBtn; } else if (t.IsBank && t.Odd != null) { if (dBankTipValue == 0) { dBankTipValue = 1; // to make multiplication possible; } dBankTipValue *= t.Odd.Value.Value; } } RefreshBanks(); decimal maxOdd = OddUtilities.AllCombinationsSum(oddVals, TipListInfo.SystemX); // TipListInfo.SystemX if (maxOdd == 0) { ticketToCalculate.TicketState = TicketStates.Multy; UpdateSystemOrCombiticket(ticketToCalculate); return; } if (maxOdd * TipListInfo.MultiWayOddFactor > MaxOdd) { maxOdd = MaxOdd; TipListInfo.MultiWayOddFactor = 1; ticketToCalculate.MaxOddExceeded = true; } else { ticketToCalculate.MaxOddExceeded = false; } if (oddVals.Length < TipListInfo.SystemX) { UpdateSystemOrCombiticket(ticketToCalculate); return; } //ViewControl.SetTicketErrorMessage(TicketError.NoError); TipListInfo.MinBet = MinStakeSystemBet; //TipListInfo.MaxBet = StationSettings.Station.MaxStakeSystemBet; TipListInfo.OddOfTipps = maxOdd; decimal manFee = 0; manFee = StationRepository.GetManipulationFeePercentage(ChangeTracker.NewTicket); //TipListInfo.MaxBet = (100 * StationRepository.GetMaxWinSystemBet(ChangeTracker.NewTicket)) / ((100 - manFee) * TipListInfo.BonusFactor * (maxOdd * TipListInfo.MultiWayOddFactor / TipListInfo.RowCount)); TipListInfo.MaxBet = (100 * StationRepository.GetMaxWinSystemBet(ChangeTracker.NewTicket) * TipListInfo.RowCount) / ((100 - manFee) * TipListInfo.BonusFactor * (maxOdd * TipListInfo.MultiWayOddFactor)); TipListInfo.MaxBet = Round(Math.Min(TipListInfo.MaxBet, StationRepository.GetMaxStakeSystemBet(ChangeTracker.NewTicket)), 2); TipListInfo.MinWin = TipListInfo.MinBet * maxOdd * TipListInfo.MultiWayOddFactor / TipListInfo.RowCount; //TipListInfo.MaxWin = TipListInfo.MaxBet * maxOdd * TipListInfo.MultiWayOddFactor / TipListInfo.RowCount * TipListInfo.BonusFactor * (100 - TipListInfo.ManipulationFeePercentage) / 100; TipListInfo.MaxWin = ((TipListInfo.MaxBet * (100 - TipListInfo.ManipulationFeePercentage) / 100) * TipListInfo.BonusFactor * maxOdd * TipListInfo.MultiWayOddFactor) / TipListInfo.RowCount; ///////////////////////////////////////////// var maxWinSystemBetFromAdmin = StationRepository.GetMaxWinSystemBet(ticketToCalculate); if (maxWinSystemBetFromAdmin > 0 && TipListInfo.MaxWin > maxWinSystemBetFromAdmin) { TipListInfo.MaxWin = maxWinSystemBetFromAdmin; //manFee = StationRepository.GetManipulationFeePercentage(ChangeTracker.NewTicket); //TipListInfo.MaxBet = (100 * TipListInfo.MaxWin) / ((100 - manFee) * TipListInfo.BonusFactor * (maxOdd * TipListInfo.MultiWayOddFactor / TipListInfo.RowCount)); TipListInfo.MaxBet = Round((100 * StationRepository.GetMaxWinSystemBet(ChangeTracker.NewTicket) * TipListInfo.RowCount) / ((100 - manFee) * TipListInfo.BonusFactor * (maxOdd * TipListInfo.MultiWayOddFactor)), 2); } ///////////////////////////////////////////// if (dBankTipValue > 0) { if (maxOdd * (multiWayOddVal / rowCount) > MaxOdd) { TipListInfo.FullOddFactor = MaxOdd; ticketToCalculate.MaxOddExceeded = true; } else { TipListInfo.FullOddFactor = maxOdd * multiWayOddVal; ticketToCalculate.MaxOddExceeded = false; } } else { TipListInfo.FullOddFactor = maxOdd; } //TipListInfo.CurrentTicketPossibleWin = TipListInfo.Bet * maxOdd * TipListInfo.MultiWayOddFactor / TipListInfo.RowCount * TipListInfo.BonusFactor * (100 - TipListInfo.ManipulationFeePercentage) / 100; TipListInfo.CurrentTicketPossibleWin = ((TipListInfo.Bet - ((TipListInfo.Bet * TipListInfo.ManipulationFeePercentage) / 100)) * TipListInfo.BonusFactor * maxOdd * TipListInfo.MultiWayOddFactor) / TipListInfo.RowCount; TipListInfo.OddOfTipps = maxOdd; break; } ticketToCalculate.NumberOfBets = localTipItems.Count; ticketToCalculate.TotalOddDisplay = TipListInfo.FullOddFactor; ticketToCalculate.ManipulationFeeValue = TipListInfo.ManipulationFeeValue; ticketToCalculate.MaxBet = TipListInfo.MaxBet; //ticketToCalculate.MaxBet = Math.Min(TipListInfo.MaxBet, StationRepository.GetMaxStake(ticketToCalculate)); //ticketToCalculate.MaxBet = Math.Min(TipListInfo.MaxBet, TipListInfo.Bet); ticketToCalculate.MinBet = TipListInfo.MinBet; ticketToCalculate.BonusPercentage = TipListInfo.BonusFactorPerc; ticketToCalculate.BonusValue = TipListInfo.BonusValue / TipListInfo.RowCount; ticketToCalculate.MaxWin = TipListInfo.MaxWin; ticketToCalculate.RowCount = TipListInfo.RowCount; ticketToCalculate.StakeByRow = ticketToCalculate.Stake / TipListInfo.RowCount; ticketToCalculate.CurrentTicketPossibleWin = TipListInfo.CurrentTicketPossibleWin; ticketToCalculate.SystemX = TipListInfo.SystemX; ticketToCalculate.SystemY = TipListInfo.SystemY; //ticketToCalculate.SystemButtonName = string.Format(TranslationProvider.Translate(MultistringTags.SYSTEM_FORMAT) as string, TipListInfo.SystemX, TipListInfo.SystemY, "+Banker"); } }
public void VerifySelectedOdds(SortableObservableCollection <ITipItemVw> socSelectedOdds, SyncHashSet <ITipItemVw> hsOddsToRemove = null) { CheckTime ct = new CheckTime(true, "VerifySelectedOdds(TipCount={0})", socSelectedOdds.Count); ExcpHelper.ThrowIf <ArgumentNullException>(socSelectedOdds == null, "VerifySelectedOdds(NULL) ERROR"); lock (_verifyLocker) { ct.AddEvent("Lock Entered"); if (hsOddsToRemove != null) { hsOddsToRemove.Clear(); } else { hsOddsToRemove = new SyncHashSet <ITipItemVw>(); } SyncList <ITipItemVw> lTipItems = socSelectedOdds.ToSyncList(); foreach (TipItemVw tiv in lTipItems) { // Check if selected odd is not expired if (!CheckOdd(tiv.Odd)) { hsOddsToRemove.Add(tiv); } // Check if selected odd is not yet in current collection (m_lSelectedOdds) else if (!m_lSelectedOdds.Contains(tiv.Odd)) { m_lSelectedOdds.Add(tiv.Odd); tiv.Odd.BetDomain.Match.SetSelected(tiv.Odd, true); } } ct.AddEvent("Check Completed"); // Remove from socSelectedOdds and m_lSelectedOdds for (int i = 0; i < lTipItems.Count;) { var tiv = lTipItems[i]; if (hsOddsToRemove.Contains(tiv)) { // This Odd is expired lTipItems.Remove(tiv); socSelectedOdds.Remove(tiv); m_lSelectedOdds.Remove(tiv.Odd); tiv.Odd.BetDomain.Match.SetSelected(tiv.Odd, false); } else { i++; } } ct.AddEvent("Remove from List Completed"); // Remove from m_lSelectedOdd those items were not removed in previous cycle for (int i = 0; i < m_lSelectedOdds.Count;) { IOddLn odd = m_lSelectedOdds[i]; TipItemVw tiv = new TipItemVw(odd); if (!lTipItems.Contains(tiv)) { m_lSelectedOdds.Remove(odd); tiv.Odd.BetDomain.Match.SetSelected(tiv.Odd, false); } else { i++; } } ct.AddEvent("Remove from List2 Completed"); } ct.Info(m_logger); }