public async Task <IActionResult> PlaceLayOffer([FromBody] List <OfferDto> offer)
        {
            double laibelty = 0.00;

            foreach (var item in offer)
            {
                laibelty = laibelty + item.Stake * item.Odds;
            }
            if (await _OfferService.CheckLaiaabilty(laibelty, offer[0].UserId) == false)
            {
                return(BadRequest("you don't have enough cash to place this bet"));
            }
            else
            {
                await _accountService.TakeFromBalance(offer[0].UserId, laibelty);
            }
            List <List <Bet> > bettoreturn = new List <List <Bet> >();

            foreach (var item in offer)
            {
                item.MarketName = item.MarketName.Replace("%2F", "/");

                var Backexsist = await _OfferService.CheckExsitingBackbets(item.Odds, item.MarketName, item.EventId, item.RunnerName);

                if (Backexsist != null)
                {
                    var exsist = await _OfferService.GetBackOffer(Backexsist);

                    if (exsist.Liquidity != 0)
                    {
                        if (exsist.Liquidity == item.Stake || exsist.Liquidity > item.Stake)
                        {
                            await _OfferService.TakeFromBackLiquidity(exsist.Id, item.Stake);

                            var matchedbet  = _mapper.Map <Bet>(item);
                            var betinvolved = await _OfferService.ManageInvolvedBackBets(exsist.Id, matchedbet);

                            matchedbet.Status         = "closed";
                            matchedbet.RemainingStake = 0;
                            matchedbet.InStake        = item.Stake;
                            matchedbet.Lalaibelty     = laibelty;
                            matchedbet.Profit         = item.Stake;
                            var bettoadd = await _OfferService.AddToBets(matchedbet);

                            await _BetCSer.addtoCounter(matchedbet.EventId);

                            await _OfferService.AddToBackMatchedbet(exsist.Id, bettoadd);

                            betinvolved.Add(bettoadd);
                            SendNotification(betinvolved, "MatchingBet");

                            bettoreturn.Add(betinvolved);
                        }
                        else if (exsist.Liquidity < item.Stake)
                        {
                            var remainingStake = item.Stake - exsist.Liquidity;
                            var matchedbet     = _mapper.Map <Bet>(item);
                            var betinvolved    = await _OfferService.ManageInvolvedLowBackBets(exsist.Id, matchedbet);

                            matchedbet.InStake        = exsist.Liquidity;
                            matchedbet.RemainingStake = 0;
                            matchedbet.Status         = "closed";
                            matchedbet.Lalaibelty     = exsist.Liquidity * item.Odds;
                            matchedbet.Profit         = exsist.Liquidity;
                            var bettoadd = await _OfferService.AddToBets(matchedbet);

                            await _BetCSer.addtoCounter(matchedbet.EventId);

                            await _OfferService.AddToBackMatchedbet(exsist.Id, bettoadd);

                            var x = _mapper.Map <LayOffer>(item);
                            x.Liquidity = remainingStake;
                            var newlayack = await _OfferService.AddLayOffer(x);

                            var c     = _mapper.Map <Bet>(x);
                            var added = await _OfferService.AddToBets(c);

                            await _BetCSer.addtoCounter(added.EventId);

                            var betLayinvoled = _mapper.Map <InvolvedLayBets>(added);
                            await _OfferService.AddToInvolvedLayBets(newlayack.Id, betLayinvoled);

                            betinvolved.Add(bettoadd);
                            SendNotification(betinvolved, "MatchingBet");
                            bettoreturn.Add(betinvolved);
                        }
                    }
                }
                var Layexsist = await _OfferService.CheckExsitingLaybets(item.Odds, item.MarketName, item.EventId, item.RunnerName);

                if (Layexsist != null)
                {
                    List <Bet> laybets = new List <Bet>();
                    await _OfferService.AddToLayLiquidity(Layexsist, item.Stake);

                    var laykbet = _mapper.Map <Bet>(item);
                    laybets.Add(laykbet);
                    var added = await _OfferService.AddToBets(laykbet);

                    await _BetCSer.addtoCounter(added.EventId);

                    var involved = _mapper.Map <InvolvedLayBets>(added);
                    involved.Status = "open";
                    await _OfferService.AddToInvolvedLayBets(Layexsist, involved);

                    SendNotification(laybets, "MatchingBet");
                    bettoreturn.Add(laybets);
                }
                if (Layexsist == null && Backexsist == null)
                {
                    List <Bet> newlaybet = new List <Bet>();
                    var        betoffer  = _mapper.Map <LayOffer>(item);
                    var        Layoffer  = await _OfferService.AddLayOffer(betoffer);

                    var bet = _mapper.Map <Bet>(betoffer);
                    newlaybet.Add(bet);
                    var added2 = await _OfferService.AddToBets(bet);

                    await _BetCSer.addtoCounter(added2.EventId);

                    var betlayinvoled = _mapper.Map <InvolvedLayBets>(added2);
                    await _OfferService.AddToInvolvedLayBets(Layoffer.Id, betlayinvoled);

                    SendNotification(newlaybet, "MatchingBet");
                    bettoreturn.Add(newlaybet);
                }
            }

            return(Ok(bettoreturn));
        }
Esempio n. 2
0
        public async Task <List <Bet> > ManageInvolvedBackBets(string Offerid, Bet bet)
        {
            List <Bet> y       = new List <Bet>();
            var        x       = bet.RemainingStake;
            var        filter1 = Builders <InvolvedBackBets> .Filter.Eq("OfferId", Offerid);

            IEnumerable <string> state = new string[] { "open", "partially" };
            var filter2 = Builders <InvolvedBackBets> .Filter.In("Status", state);

            while (x != 0)
            {
                var filter4 = Builders <InvolvedBackBets> .Filter.Eq("RemainingStake", x);

                var filter = Builders <InvolvedBackBets> .Filter.And(filter1, filter4, filter2);

                var involoved = await _involvedB.Find(filter).FirstOrDefaultAsync();

                if (involoved != null)
                {
                    var update = Builders <Bet> .Update.Set("Status", "Closed")
                                 .Set("InStake", x)
                                 .Set("RemainingStake", 0)
                                 .Set("Lalaibelty", x)
                                 .Set("Profit", x * bet.Odds);

                    await _Bet.UpdateOneAsync(x => x.Id == involoved.BetId, update);

                    var backbettoadd = await _Bet.Find(x => x.Id == involoved.BetId).FirstOrDefaultAsync();

                    var update1 = Builders <InvolvedBackBets> .Update.Set("Status", "Closed")
                                  .Set("RemainingStake", 0);

                    await _involvedB.UpdateOneAsync(x => x.BetId == involoved.BetId, update1);

                    x = 0;
                    y.Add(backbettoadd);
                }
                else
                {
                    var filter6 = Builders <InvolvedBackBets> .Filter.Gt("RemainingStake", x);

                    var filter8 = Builders <InvolvedBackBets> .Filter.And(filter1, filter6, filter2);

                    var Involved2 = await _involvedB.Find(filter8).FirstOrDefaultAsync();

                    if (Involved2 != null)
                    {
                        var NewRemaining = Involved2.RemainingStake - x;
                        var update       = Builders <InvolvedBackBets> .Update.Set("Status", "partially")
                                           .Set("RemainingStake", NewRemaining);

                        await _involvedB.UpdateOneAsync(x => x.BetId == Involved2.BetId, update);


                        var update1 = Builders <Bet> .Update.Set("Status", "open")
                                      .Set("RemainingStake", NewRemaining);

                        Bet newbet = new Bet()
                        {
                            EventId        = bet.EventId,
                            InStake        = x,
                            RunnerName     = bet.RunnerName,
                            MarketName     = bet.MarketName,
                            RemainingStake = 0,
                            Odds           = bet.Odds,
                            Side           = "back",
                            UserId         = Involved2.UserId,
                            Status         = "closed",
                            CreationDate   = DateTime.Now,
                            Teams          = bet.Teams,
                            Profit         = x * bet.Odds,
                            Lalaibelty     = x
                        };
                        var betnew = await AddToBets(newbet);

                        await _betcser.addtoCounter(betnew.EventId);

                        await _Bet.UpdateOneAsync(x => x.Id == Involved2.BetId, update1);

                        x = 0;
                        y.Add(betnew);
                    }


                    else
                    {
                        var filter7 = Builders <InvolvedBackBets> .Filter.Lt("RemainingStake", x);

                        var filter9 = Builders <InvolvedBackBets> .Filter.And(filter1, filter7, filter2);

                        var Involved3 = await _involvedB.Find(filter9).FirstOrDefaultAsync();

                        if (Involved3 != null)
                        {
                            var z = x - Involved3.RemainingStake;

                            var update = Builders <Bet> .Update.Set("Status", "closed")
                                         .Set("InStake", Involved3.RemainingStake)
                                         .Set("RemainingStake", 0)
                                         .Set("Lalaibelty", x)
                                         .Set("Profit", x * bet.Odds);

                            await _Bet.UpdateOneAsync(x => x.Id == Involved3.BetId, update);

                            var bettoreturn = await _Bet.Find(x => x.Id == Involved3.BetId).FirstOrDefaultAsync();

                            var update1 = Builders <InvolvedBackBets> .Update.Set("Status", "Closed")
                                          .Set("RemainingStake", 0);

                            await _involvedB.UpdateOneAsync(x => x.BetId == Involved3.BetId, update1);

                            x = z;

                            y.Add(bettoreturn);
                        }
                    }
                }
            }
            return(y);
        }