public ActionResult Confess(string guid)
        {
            if (string.IsNullOrWhiteSpace(guid))
            {
                return(RedirectToAction("Index"));
            }

            var indulgence = _indulgeMeService.GetIndulgenceByGuid(guid);

            ViewData["cid"] = guid;

            return(View(indulgence));
        }
        //
        // GET: /Indulgence/
        public ActionResult Index(string guid)
        {
            if (TempData["absolved"] != null || !string.IsNullOrWhiteSpace(Request.QueryString["congratulations"]))
            {
                ViewData["ShowBlessing"] = true;
            }

            var absolutionViewModel = new IndulgencesViewModel();

            absolutionViewModel.Indulgence = _indulgeMeService.GetIndulgenceByGuid(guid);
            if (absolutionViewModel.Indulgence == null)
            {
                return(HttpNotFound("Couldn't find that indulgence"));
            }

            if (absolutionViewModel.Indulgence.Sin == null)
            {
                return(HttpNotFound("Couldn't find that sin"));
            }

            absolutionViewModel.Sin             = absolutionViewModel.Indulgence.Sin;
            absolutionViewModel.Sin.Indulgences = _indulgeMeService.AllIndulgencesForSin(absolutionViewModel.Indulgence.Sin).ToList();

            absolutionViewModel.TotalDonationCount = absolutionViewModel.Sin.Indulgences.Count();
            absolutionViewModel.TotalDonated       = absolutionViewModel.Sin.Indulgences.Sum(a => a.AmountDonated);
            absolutionViewModel.ImageAlt           =
                string.Format("{0} {1} donated {2:c} to {3} on the {4} of {5:MMMM}, {5:yyyy}",
                              absolutionViewModel.Indulgence.Confession,
                              absolutionViewModel.Indulgence.Name,
                              absolutionViewModel.Indulgence.AmountDonated,
                              absolutionViewModel.Indulgence.CharityName,
                              absolutionViewModel.Indulgence.DateConfessed,
                              TextUtils.DayOfMonth(absolutionViewModel.Indulgence.DateConfessed),
                              absolutionViewModel.Indulgence);

            return(View(absolutionViewModel));
        }
        // GET: Sdi
        public async Task <ActionResult> Return(string guid, int?donationId)
        {
            try
            {
                if (!donationId.HasValue)
                {
                    return(RedirectToAction("Index", "Home"));
                }

                var config = new ClientConfiguration(
                    ConfigurationManager.AppSettings["JgApiBaseUrl"],
                    ConfigurationManager.AppSettings["JGApiKey"],
                    1);

                var client = new JustGivingClient(config);

                DonationStatus donationStatus = null;
                try
                {
                    donationStatus = client.Donation.RetrieveStatus(donationId.Value);
                }
                catch
                {
                }

                if ((donationStatus != null && donationStatus.Status == "Accepted") ||
                    ConfigurationManager.AppSettings["SkipDonationReferenceCheck"] == "true")
                {
                    if (donationStatus != null)
                    {
                        _indulgeMeService.Absolve(guid, donationStatus.DonationId, donationStatus.DonationRef,
                                                  donationStatus.Amount,
                                                  donationStatus.Reference);
                    }
                    else if (ConfigurationManager.AppSettings["SkipDonationReferenceCheck"] == "true")
                    {
                        _indulgeMeService.Absolve(guid, 1, "1", 10, "not-a-real-donation");
                    }

                    var indulgence = _indulgeMeService.GetIndulgenceByGuid(guid);
                    _indulgeMeService.GenerateIndulgence(indulgence,
                                                         System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "fonts"),
                                                         System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Content"));

                    await _indulgenceEmailer.Send(indulgence, ConfigurationManager.AppSettings["IndulgencePdfRelativePath"]);

                    _indulgeMeService.Tweet(indulgence);

                    TempData["absolved"] = guid;

                    ControllerContext.RequestContext.HttpContext.Cache.Remove("siteInfo");
                    ControllerContext.RequestContext.HttpContext.Response.RemoveOutputCacheItem(Url.Action("GetLatest",
                                                                                                           "Api"));

                    ViewData["ShowBlessing"] = true;
                    return(RedirectToAction("Index", "Indulgence", new { guid = guid }));
                }

                return(HttpNotFound());
            }
            catch (Exception ex)
            {
                _log.Error("unhandled error returning from SDI", ex);
                return(new ContentResult()
                {
                    Content = ex.Message + "\r\n" + ex.StackTrace,
                    ContentEncoding = Encoding.UTF8,
                    ContentType = "text/plain"
                });
            }
        }