public IHttpActionResult GetAvailablePaymentMethods([FromUri] UserPaymentModel requestModel) { if (requestModel == null || !ModelState.IsValid) { return(Json(new { Success = false, Message = "Invalid data supplied" })); } ; //first check if the customer has an address, otherwise first address form will be shown var currentUser = ApplicationContext.Current.CurrentUser; var battleId = requestModel.BattleId; var battleType = requestModel.BattleType; var purchaseType = requestModel.PurchaseType; //TODO: Remove comment when picture battles are ready var battle = _videoBattleService.Get(battleId); // Model.BattleType == BattleType.Video ? _videoBattleService.GetById(Model.BattleId) : null; var responseModel = new UserPaymentPublicModel { IsAmountVariable = purchaseType == PurchaseType.SponsorPass || battle.CanVoterIncreaseVotingCharge, MinimumPaymentAmount = purchaseType == PurchaseType.SponsorPass ? battle.MinimumSponsorshipAmount : battle.MinimumVotingCharge, PurchaseType = requestModel.PurchaseType }; //if purchase type is sponsor and customer is already a sponsor, he should not have a minimum amount criteria if (purchaseType == PurchaseType.SponsorPass) { var alreadySponsor = _sponsorService.Get(x => x.BattleId == battleId && x.BattleType == battleType, null).Any(); if (alreadySponsor) { responseModel.MinimumPaymentAmount = 1; } } //get available credits responseModel.AvailableCredits = _creditService.GetAvailableCreditsCount(currentUser.Id, null); //set the usable credits now responseModel.UsableCredits = _creditService.GetUsableCreditsCount(currentUser.Id); //let's get the payment methods for the logged in user var paymentMethods = _paymentMethodService.GetCustomerPaymentMethods(currentUser.Id); foreach (var pm in paymentMethods) { responseModel.UserPaymentMethods.Add(new System.Web.Mvc.SelectListItem() { Text = pm.NameOnCard + " (" + pm.CardNumberMasked + ")", Value = pm.Id.ToString() }); } if (battle.VideoBattleStatus == BattleStatus.Complete) { return(Json(new { Success = false, Message = "Battle completed" })); } //battle should not be complete before payment form can be opened return(Json(new { Success = true, AvailablePaymentMethods = responseModel })); }
public IHttpActionResult SaveSponsor(SponsorModel requestModel) { if (!ModelState.IsValid) { return(Json(new { Success = false, Message = "Invalid Data" })); } var battle = _videoBattleService.Get(requestModel.BattleId); //todo: query picture battles when ready if (battle == null) { return(Json(new { Success = false, Message = "Invalid Battle" })); } var isProductOnlySponsorship = requestModel.SponsorshipType == SponsorshipType.OnlyProducts; var userId = ApplicationContext.Current.CurrentUser.Id; //there is a possibility that a sponsor is increasing the sponsorship amount. In that case, the new sponsorship status will automatically //be of same status as that of previous one for the same battle //lets find if the sponsor already exist for this battle? var existingSponsors = _sponsorService.GetSponsors(userId, requestModel.BattleId, requestModel.BattleType, null); var newSponsorStatus = SponsorshipStatus.Pending; //so is the current customer already an sponsor for this battle? if (existingSponsors.Any()) { newSponsorStatus = existingSponsors.First().SponsorshipStatus; } if (!isProductOnlySponsorship) { //are issued credits sufficient? var issuedCreditsCount = _creditService.GetUsableCreditsCount(userId); if ((issuedCreditsCount < battle.MinimumSponsorshipAmount && newSponsorStatus != SponsorshipStatus.Accepted) || requestModel.SponsorshipCredits > issuedCreditsCount) { VerboseReporter.ReportError("Insufficient credits to become sponsor", "save_sponsor"); return(RespondFailure()); } } //mark the credits as spent credits var spentCredit = new Credit() { CreditContextKey = string.Format(CreditContextKeyNames.BattleSponsor, battle.Id), CreditCount = requestModel.SponsorshipCredits, CreditTransactionType = CreditTransactionType.Spent, CreditType = CreditType.Transactional, PaymentTransactionId = 0, CreatedOnUtc = DateTime.UtcNow, UserId = userId }; _creditService.Insert(spentCredit); //create the sponsor and set the status to pending or an existing status as determined above. (the status will be marked accepted or rejected or cancelled by battle owner) var sponsor = new Sponsor() { BattleId = requestModel.BattleId, BattleType = requestModel.BattleType, SponsorshipAmount = isProductOnlySponsorship ? 0 : requestModel.SponsorshipCredits, UserId = userId, SponsorshipStatus = newSponsorStatus, DateCreated = DateTime.UtcNow, DateUpdated = DateTime.UtcNow }; //save the sponsor _sponsorService.Insert(sponsor); if (!isProductOnlySponsorship) { //save the prizes only sponsorship prizes SaveSponsorProductPrizes(requestModel.Prizes); } var battleOwner = _userService.Get(battle.ChallengerId); var sponsorCustomer = _userService.Get(userId); //send notification to battle owner _emailSender.SendSponsorAppliedNotificationToBattleOwner(battleOwner, sponsorCustomer, battle); return(Json(new { Success = true })); }