public HttpResponseMessage Post(JObject jsonObject) { Boolean isValidCoupon = false; DateTime currentTime = DateTime.Now; string message = string.Empty; Int32 couponId = 0; decimal amount = 0; dynamic vm = jsonObject; var registrations = new List <Registration>(); //populate couponCode var couponCode = (string)jsonObject["couponCode"]; //populate registrations foreach (dynamic reg in vm.regs) { var registration = new Registration { EventureListId = reg.eventureListId, ParticipantId = reg.partId, //Name = reg.displayList, //mjb don't use this ListAmount = reg.fee, Quantity = reg.quantity, TotalAmount = Convert.ToDecimal(reg.fee) }; registrations.Add(registration); } //get coupon var coupons = db.Coupons .Where(c => c.DateStart <currentTime && c.DateEnd> currentTime && c.Active && c.Code == couponCode); //&& c.ownerId == ownerId if (coupons.Any()) { isValidCoupon = true; couponId = coupons.FirstOrDefault().Id; } else { message = "valid coupon is not found"; amount = 0; couponId = -1; } if (isValidCoupon) //&& notspecialcase --either owner { foreach (var reg in registrations) { bool isValidForThisReg = true; string couponType = coupons.FirstOrDefault().CouponType; //check type and verify valid for owner/event/list switch (couponType) { case "owner": var listQuery = db.EventureLists.Where(l => l.Id == reg.EventureListId).Select(l => l.EventureId); var ownerId = db.Eventures .Where(e => listQuery.Contains(e.Id)) .Select(e => e.OwnerId) .SingleOrDefault(); if (ownerId == coupons.FirstOrDefault().CouponTypeLinkId) { isValidForThisReg = true; //isOwnerCoupon = true; } else { message = "Coupon is invalid (O1)"; isValidForThisReg = false; } break; case "event": //confirm that eventureid = couponlinktypeid var eventureId = db.EventureLists .Where(l => l.Id == reg.EventureListId) .Select(l => l.EventureId).SingleOrDefault(); if (eventureId == coupons.FirstOrDefault().CouponTypeLinkId) { isValidForThisReg = true; } else { message = "Coupon is invalid (E1)"; isValidForThisReg = false; } break; case "list": //confirm that eventurelistid = couponlinktypeid if (reg.EventureListId != coupons.FirstOrDefault().CouponTypeLinkId) { message = "Coupon is invalid (L1)"; isValidForThisReg = false; } break; default: message = "Coupon is invalid (D1)"; isValidForThisReg = false; break; } //check usage if (isValidForThisReg) { if (coupons.FirstOrDefault().Usage == 1) { //check if part has already redeemed coupon for this race } } //check redeemed v. capacity if (isValidForThisReg) { if (coupons.FirstOrDefault().Capacity <= coupons.FirstOrDefault().Redeemed) { message = "Coupon is invalid (C1)"; isValidForThisReg = false; } } //check check owned if (isValidForThisReg) { if (coupons.FirstOrDefault().IsOnlyForOwned) { //checked if eventure is owned var eid = db.EventureLists.Where(l => l.Id == reg.EventureListId).Select(l => l.EventureId); var isManaged = db.Eventures.Where(e => eid.Contains(e.Id)).Select(e => e.Managed).FirstOrDefault(); if (isManaged) { message = "Coupon is invalid (W1)"; isValidForThisReg = false; } } } //calculate if (isValidForThisReg) { //message = "valid"; if (coupons.FirstOrDefault().DiscountType == 0) //$ off { //for $off coupons we just need to return value so we break from foreach reg loop amount = coupons.FirstOrDefault().Amount * -1; break; } else //percent off { //decimal percent = * -1; //var listPrice = reg. //db.EventureLists.Where(l => l.Id == reg.EventureListId) // .Select(l => l.CurrentFee).FirstOrDefault(); //var test = percent * listPrice / 100; amount = amount + (coupons.FirstOrDefault().Amount *reg.TotalAmount / 100 * -1); //couponDto.CouponId = coupons.FirstOrDefault().Id; } } } } var coupon = new DtoCoupon(amount, message, couponId); var js = new JavaScriptSerializer(); string jsonData = js.Serialize(coupon); var resp = Request.CreateResponse(HttpStatusCode.OK); resp.Content = new StringContent(jsonData, Encoding.UTF8, "text/plain"); return(resp); }
public DtoCoupon ValidateCoupon(string couponCode, Int32 participantId, Int32 eventureListId) { DateTime currentTime = DateTime.Now; Boolean isValidCoupon = false; Boolean isOwnerCoupon = false; var couponDto = new DtoCoupon(0, "", 0, false); // does coupon exist at all var coupons = _contextProvider.Context.Coupons .Where(c => c.DateStart <currentTime && c.DateEnd> currentTime && c.Active && c.Code == couponCode); //&& c.ownerId == ownerId if (coupons.Any()) { isValidCoupon = true; } else { couponDto.Message = "valid coupon is not found"; couponDto.Amount = 0; } //check type and verify valid for owner/event/list if (isValidCoupon) { string couponType = coupons.FirstOrDefault().CouponType; switch (couponType) { case "owner": var listQuery = _contextProvider.Context.EventureLists.Where(l => l.Id == eventureListId).Select(l => l.EventureId); var ownerId = _contextProvider.Context.Eventures.Where(e => listQuery.Contains(e.Id)).Select(e => e.OwnerId).SingleOrDefault(); if (ownerId == coupons.FirstOrDefault().CouponTypeLinkId) { isValidCoupon = true; isOwnerCoupon = true; } else { couponDto.Message = "Coupon is invalid (O1)"; isValidCoupon = false; } break; case "event": //confirm that eventureid = couponlinktypeid var eventureId = _contextProvider.Context.EventureLists.Where(l => l.Id == eventureListId) .Select(l => l.EventureId).SingleOrDefault(); if (eventureId == coupons.FirstOrDefault().CouponTypeLinkId) { isValidCoupon = true; } else { couponDto.Message = "Coupon is invalid (E1)"; isValidCoupon = false; } break; case "list": //confirm that eventurelistid = couponlinktypeid if (eventureListId != coupons.FirstOrDefault().CouponTypeLinkId) { couponDto.Message = "Coupon is invalid (L1)"; isValidCoupon = false; } break; default: couponDto.Message = "Coupon is invalid (D1)"; isValidCoupon = false; break; } } //check usage if (isValidCoupon) { if (coupons.FirstOrDefault().Usage == 1) { //check if part has already redeemed coupon for this race } //else //redundant //{ // isValidCoupon = true; //} } //check redeemed v. capacity if (isValidCoupon) { if (coupons.FirstOrDefault().Capacity <= coupons.FirstOrDefault().Redeemed) { couponDto.Message = "Coupon is invalid (C1)"; isValidCoupon = false; } //else //redundant //{ // isValidCoupon = true; //} } //check check owned if (isValidCoupon) { if (coupons.FirstOrDefault().IsOnlyForOwned) { //checked if eventure is owned var eid = _contextProvider.Context.EventureLists.Where(l => l.Id == eventureListId).Select(l => l.EventureId); var isManaged = _contextProvider.Context.Eventures.Where(e => eid.Contains(e.Id)).Select(e => e.Managed).FirstOrDefault(); if (!isManaged) { couponDto.Message = "Coupon is invalid (O1)"; isValidCoupon = false; } } } //check redeemed //isValidCoupon = true; if (isValidCoupon) { couponDto.Message = "valid"; if (coupons.FirstOrDefault().DiscountType == 0) //$ off { couponDto.Amount = coupons.FirstOrDefault().Amount * -1; //this could be off if there are two couponDto.CouponId = coupons.FirstOrDefault().Id; } else //percent off { decimal percent = coupons.FirstOrDefault().Amount * -1; var listPrice = _contextProvider.Context.EventureLists.Where(l => l.Id == eventureListId) .Select(l => l.CurrentFee).FirstOrDefault(); //var test = percent * listPrice / 100; couponDto.Amount = percent * listPrice / 100; couponDto.CouponId = coupons.FirstOrDefault().Id; } } else { couponDto.Amount = 0; if (couponDto.Message == "") { couponDto.Message = "Coupon is invalid (X1)"; } } return(couponDto); }