예제 #1
0
        public ActionResult Edit(int id, DonationCreateViewModel modifiedData)
        {
            ValidateDonationLogEntry(modifiedData);

            var donationLogEntry = bddb.DonationLog.Find(id);

            if (ModelState.IsValid)
            {
                using (var transaction = bddb.Database.BeginTransaction())
                {
                    donationLogEntry.DonationCenterId = modifiedData.DonationCenterId;
                    donationLogEntry.DonationDate     = modifiedData.DonationDate;
                    donationLogEntry.IsSuccessful     = modifiedData.IsSuccessful;
                    //TODO add nextdate logic
                    donationLogEntry.NextDate = modifiedData.DonationDate.AddDays(56);
                    donationLogEntry.Comments = modifiedData.Comments;

                    bddb.Entry(donationLogEntry).State = EntityState.Modified;
                    bddb.SaveChanges();
                    transaction.Commit();

                    return(Json(new { success = true }));
                }
            }

            AddToViewBag_DonationCenterList();

            return(PartialView("_Edit", modifiedData));
        }
예제 #2
0
        //validation methods

        /// <summary>
        /// validates model for create type post actions
        /// adds model errors
        /// TODO: check validation need for all model properties
        /// </summary>
        /// <param name="model"></param>
        private void ValidateDonationLogEntry(DonationCreateViewModel model)
        {
            if (model.DonationDate > DateTime.Now)
            {
                ModelState.AddModelError(nameof(model.DonationDate),
                                         "Véradás nem rögzíthető jövőbeli dátummal.");
            }

            var query = bddb.DonationLog
                        .Include(dl => dl.Donor)
                        .Where(dl => dl.Donor.Email == SessionState.Current.UserEmail);

            if (query.Count() != 0)
            {
                var latestNextDate = query
                                     .Select(dl => dl.NextDate)
                                     .Max();

                if (latestNextDate > model.DonationDate)
                {
                    ModelState.AddModelError(nameof(model.DonationDate),
                                             "Véradás nem rögzíthető az előző várakozási időszak végét megelőző dátummal.");
                }
            }
        }
예제 #3
0
        public async Task <IActionResult> Create(DonationCreateViewModel vm)
        {
            if (vm == null)
            {
                throw new ArgumentNullException(nameof(vm));
            }
            vm.Donation.DonationDate = DateTimeOffset.Now;
            var donor = await GetDonor();

            vm.Donation.DonorId = donor.Id;
            if (vm.Donation.FundraiserId == Guid.Empty)
            {
                vm.Donation.FundraiserId = vm.FundraiserId;
            }

            var donation = mapper.Map <Models.Donation>(vm.Donation);

            if (ModelState.IsValid)
            {
                donationService.AddDonation(donation);
                await donationService.SaveChangesAsync();

                await fundraiserService.UpdateFundTotalAsync(vm.Donation.FundraiserId, vm.Donation.Amount);

                vm.Donation.Donor = donor;
                await signalHub.Clients.All.SendAsync("NewDonation", vm.Donation);

                return(RedirectToAction("DonateComplete"));
            }
            return(View(vm));
        }
예제 #4
0
        // GET: Donation/Create
        public PartialViewResult Create()
        {
            var model = new DonationCreateViewModel();

            AddToViewBag_DonationCenterList();

            return(PartialView("_Create", model));
        }
예제 #5
0
 /// <summary>
 /// validate manually input date of next donation
 /// add model error
 /// </summary>
 /// <param name="model"></param>
 private void ValidateManualNextDate(DonationCreateViewModel model)
 {
     if (model.NextDate < model.DonationDate)
     {
         ModelState.AddModelError(nameof(model.NextDate),
                                  "A következő véradás időpontja nem lehet korábbi a jelenlegi véradás időpontjánál.");
     }
     if (model.NextDate < DateTime.Now)
     {
         ModelState.AddModelError(nameof(model.NextDate),
                                  "A következő véradás időpontja nem lehet múltbeli időpont.");
     }
 }
예제 #6
0
        public ActionResult Create(DonationCreateViewModel newData)
        {
            ValidateDonationLogEntry(newData);

            var donor = bddb.Donor.Where(d => d.Email == SessionState.Current.UserEmail).FirstOrDefault();

            if (ModelState.IsValid)
            {
                if (newData.IsSuccessful)
                {
                    CalculateNextDonationDate(newData, donor);
                }
                else
                {
                    if (newData.NextDate == DateTime.MinValue)
                    {
                        return(PartialView("_Create_AddNextDate", newData));
                    }

                    ValidateManualNextDate(newData);

                    if (!ModelState.IsValid)
                    {
                        return(PartialView("_Create_AddNextDate", newData));
                    }
                }

                var newDonationLogEntry = new DonationLog
                {
                    DonorId          = donor.Id,
                    DonationCenterId = newData.DonationCenterId,
                    DonationDate     = newData.DonationDate,
                    IsSuccessful     = newData.IsSuccessful,
                    NextDate         = newData.NextDate,
                    Comments         = newData.Comments
                };

                using (var transaction = bddb.Database.BeginTransaction())
                {
                    bddb.DonationLog.Add(newDonationLogEntry);
                    bddb.SaveChanges();
                    transaction.Commit();
                    return(Json(new { success = true }));
                }
            }

            AddToViewBag_DonationCenterList();

            return(PartialView("_Create", newData));
        }
예제 #7
0
        // GET: Donation/Edit/5
        public ActionResult Edit(int id)
        {
            var donationLogEntry = bddb.DonationLog.Find(id);

            var dataToModify = new DonationCreateViewModel
            {
                DonationDate     = donationLogEntry.DonationDate,
                DonationCenterId = donationLogEntry.DonationCenterId,
                IsSuccessful     = donationLogEntry.IsSuccessful,
                Comments         = donationLogEntry.Comments
            };

            AddToViewBag_DonationCenterList();

            return(PartialView("_Edit", dataToModify));
        }
예제 #8
0
        //business logic methods

        /// <summary>
        /// calculate earliest date of next donation from this donation's date, donor's sex and donation history
        /// used only if current donation is successful; else manual entry of next date is requierd
        /// </summary>
        /// <param name="model"></param>
        /// <param name="donor"></param>
        private void CalculateNextDonationDate(DonationCreateViewModel model, Donor donor)
        {
            //get number of donor's successful donations for actual year
            var countOfThisYearsSuccessfulDonations = bddb.DonationLog
                                                      .Where(l => l.DonorId == donor.Id && l.IsSuccessful && l.DonationDate.Year == DateTime.Now.Year).Count();

            //check if yearly donation limit is reached, depending on sex
            //if so, return next date as the more distant of 56 day limit and next year's start
            //else return date 56 days after current donation date

            if ((donor.DonorSexId == 1 && countOfThisYearsSuccessfulDonations < donationLimitMale) ||
                (donor.DonorSexId == 2 && countOfThisYearsSuccessfulDonations < donationLimitFemale))
            {
                model.NextDate = model.DonationDate.AddDays(donationInterval);
            }
            else
            {
                var newYearStart = new DateTime(DateTime.Now.Year + 1, 1, 1);
                model.NextDate = (model.DonationDate.AddDays(donationInterval) > newYearStart ?
                                  model.DonationDate.AddDays(donationInterval) : newYearStart);
            }
        }
예제 #9
0
        public async Task <IActionResult> Index(Guid?id)
        {
            DonationCreateViewModel vm = new DonationCreateViewModel();

            vm.Donation = new DonationDto();
            if (id.HasValue)
            {
                vm.Donation.FundraiserId = id.Value;
                var fundraiser = await fundraiserService.GetFundraiserAsync(id.Value);

                vm.Fundraiser = mapper.Map <FundraiserDto>(fundraiser);
            }
            else
            {
                var results = await fundraiserService.GetFundraisersAsync();

                vm.Fundraisers = mapper.Map <IEnumerable <FundraiserDto> >(results)
                                 .Select(f => new SelectListItem {
                    Text = f.Name, Value = f.Id.ToString()
                })
                                 .ToList();
            }
            return(View(vm));
        }
        public ActionResult Create(DonationCreateViewModel model)
        {
            if (ModelState.IsValid)
            {
                //Debug Purpose to see if we are getting the data
                Debug.WriteLine("I'm pulling data of Name: " + model.name + ", Amount: " + model.amount + ", Email: " + model.email
                                + ", Anonymous: " + model.anonymous);
                //+ ", Card Number: " + model.number + " Card ExpMonth: " + model.expMonth
                //+ " Card ExpYear: " + model.expYear + " Card CVC: " + model.cvc);

                Donation newDonation = new Donation();
                newDonation.donationName      = model.name;
                newDonation.donationAmount    = model.amount;
                newDonation.donationEmail     = model.email;
                newDonation.donationAnonymous = model.anonymous;

                //This method is when you want the payment done on the Server Side (not safe due to sending card info.)

                /*
                 * StripeConfiguration.ApiKey = "sk_test_T3BF2ap8TTDpmetCKxF038r400HAf7zrj8";
                 * var options = new PaymentIntentCreateOptions
                 * {
                 *  Amount = model.amount,
                 *  Currency = "usd",
                 *  // Verify your integration in this guide by including this parameter
                 *  Metadata = new Dictionary<string, string>
                 *  {
                 *    { "integration_check", "accept_a_payment" },
                 *  }
                 * };
                 *
                 * var service = new PaymentIntentService();
                 * try
                 * {
                 *  var paymentIntent = service.Create(options);
                 *
                 *  //Create the Payment Method
                 *  PaymentMethodCreateOptions payMethodOptions = new PaymentMethodCreateOptions
                 *  {
                 *      Type = "card",
                 *      Card = new PaymentMethodCardCreateOptions
                 *      {
                 *          Number = model.number,
                 *          ExpMonth = model.expMonth,
                 *          ExpYear = model.expYear,
                 *          Cvc = model.cvc,
                 *      },
                 *      BillingDetails = new BillingDetailsOptions
                 *      {
                 *          Name = model.name
                 *      }
                 *  };
                 *
                 *  //Confirm the payment we are making
                 *  PaymentMethodService payMethodService = new PaymentMethodService();
                 *  PaymentMethod payMethod = payMethodService.Create(payMethodOptions);
                 *  PaymentIntentConfirmOptions payOptions = new PaymentIntentConfirmOptions
                 *  {
                 *      PaymentMethod = payMethod.Id
                 *  };
                 *  service = new PaymentIntentService();
                 *  service.Confirm(
                 *    paymentIntent.Id,
                 *    payOptions
                 *  );
                 *
                 *  //Add the id for the payment in the Stripe API (Unique identifier for the object)
                 *  newDonation.donationReceiptId = paymentIntent.Id;
                 * }
                 * catch (Exception e) {
                 *  Debug.WriteLine(e.Message);
                 *  //Something failed, redisplay form
                 *  return View(model);
                 * }
                 */

                //Add the object to the database
                db.Donations.Add(newDonation);

                //Save the changes in the database
                db.SaveChanges();

                //Must confirm the payment
                return(RedirectToAction("CardPayment/" + newDonation.donationId));

                //Go back to the list of Donation to see the added Donation (If everything is done in the Server Side)
                //return Redirect("List");
            }

            //Something failed, redisplay form
            return(View(model));
        }