private ConfirmEnum DoOnlineGiving(string transactionReturn) { var p = List[0]; if (p.IsNew) { p.AddPerson(null, p.org.EntryPointId ?? 0); } var desc = $"{p.person.Name}; {p.person.PrimaryAddress}; {p.person.PrimaryZip}"; var staff = DbUtil.Db.StaffPeopleForOrg(org.OrganizationId)[0]; var body = GivingConfirmation.PostAndBuild(DbUtil.Db, staff, p.person, p.setting.Body, p.org.OrganizationId, p.FundItemsChosen(), Transaction, desc, p.setting.DonationFundId); if (!Transaction.TransactionId.HasValue()) { Transaction.TransactionId = transactionReturn; if (testing == true && !Transaction.TransactionId.Contains("(testing)")) { Transaction.TransactionId += "(testing)"; } } var contributionemail = (from ex in p.person.PeopleExtras where ex.Field == "ContributionEmail" select ex.Data).SingleOrDefault(); if (contributionemail.HasValue()) { contributionemail = (contributionemail ?? "").Trim(); } if (Util.ValidEmail(contributionemail)) { Log("UsingSpecialEmail"); } else { contributionemail = p.person.FromEmail; } MailAddress from = null; if (!Util.TryGetMailAddress(DbUtil.Db.StaffEmailForOrg(p.org.OrganizationId), out from)) { from = GetAdminMailAddress(); } var m = new EmailReplacements(DbUtil.Db, body, from); body = m.DoReplacements(DbUtil.Db, p.person); DbUtil.Db.EmailFinanceInformation(from, p.person, p.setting.Subject, body); DbUtil.Db.EmailFinanceInformation(contributionemail, DbUtil.Db.StaffPeopleForOrg(p.org.OrganizationId), "online giving contribution received", $"see contribution records for {p.person.Name} ({p.PeopleId}) {Util.Host}"); if (p.CreatingAccount) { p.CreateAccount(); } return ConfirmEnum.Confirm; }
public void FinishLaterNotice() { var registerLink = EmailReplacements.CreateRegisterLink(masterorgid ?? Orgid, $"Resume registration for {Header}"); var msg = "<p>Hi {first},</p>\n<p>Here is the link to continue your registration:</p>\n" + registerLink; Debug.Assert((masterorgid ?? Orgid) != null, "m.Orgid != null"); var notifyids = DbUtil.Db.NotifyIds((masterorg ?? org).NotifyIds); var p = UserPeopleId.HasValue ? DbUtil.Db.LoadPersonById(UserPeopleId.Value) : List[0].person; DbUtil.Db.Email(notifyids[0].FromEmail, p, $"Continue your registration for {Header}", msg); }
public void Should_Return_Anonymous_Replacement_Link() { using (var db = CMSDataContext.Create(DatabaseFixture.Host)) { var link = EmailReplacements.SupportLinkAnonymousReplacement(db, "1", "1"); String[] separator = { "//", "/" }; var url = link.Split(separator, StringSplitOptions.RemoveEmptyEntries); var linkId = url[4]; var guid = linkId.ToGuid(); var ot = db.OneTimeLinks.SingleOrDefault(oo => oo.Id == guid.Value); ot.ShouldNotBeNull(); } }
public void Confirm(Controller controller) { var details = ViewExtensions2.RenderPartialViewToString(controller, "ManageGiving/EmailConfirmation", this); var staff = DbUtil.Db.StaffPeopleForOrg(orgid)[0]; var contributionEmail = (from ex in DbUtil.Db.PeopleExtras where ex.Field == "ContributionEmail" where ex.PeopleId == person.PeopleId select ex.Data).SingleOrDefault(); if (!Util.ValidEmail(contributionEmail)) { contributionEmail = person.FromEmail; } if (!string.IsNullOrEmpty(Setting.Body)) { var text = Setting.Body.Replace("{church}", DbUtil.Db.Setting("NameOfChurch", "church"), ignoreCase: true); // text = text.Replace("{name}", person.Name, ignoreCase: true); text = text.Replace("{date}", DateTime.Now.ToString("d"), ignoreCase: true); text = text.Replace("{email}", person.EmailAddress, ignoreCase: true); text = text.Replace("{phone}", person.HomePhone.FmtFone(), ignoreCase: true); text = text.Replace("{contact}", staff.Name, ignoreCase: true); text = text.Replace("{contactemail}", staff.EmailAddress, ignoreCase: true); text = text.Replace("{contactphone}", Organization.PhoneNumber.FmtFone(), ignoreCase: true); text = text.Replace("{details}", details, ignoreCase: true); var from = Util.TryGetMailAddress(DbUtil.Db.StaffEmailForOrg(orgid)); var mm = new EmailReplacements(DbUtil.Db, text, from); text = mm.DoReplacements(DbUtil.Db, person); Util.SendMsg(Util.SysFromEmail, Util.Host, from, Setting.Subject, text, Util.EmailAddressListFromString(contributionEmail), 0, pid); } Util.SendMsg(Util.SysFromEmail, Util.Host, Util.TryGetMailAddress(contributionEmail), "Managed Giving", $"Managed giving for {person.Name} ({pid})", Util.EmailAddressListFromString(DbUtil.Db.StaffEmailForOrg(orgid)), 0, pid); var msg = GetThankYouMessage(@"<p>Thank you {first}, for managing your recurring giving</p> <p>You should receive a confirmation email shortly.</p>"); msg = msg.Replace("{first}", person.PreferredName, ignoreCase: true); ThankYouMessage = msg; }
public void RsvpLink_Should_Have_regrets_Parameter() { using (var db = CMSDataContext.Create(DatabaseFixture.Host)) { EmailReplacements email = new EmailReplacements(db, "", new System.Net.Mail.MailAddress("*****@*****.**")); EmailQueueTo queue = new EmailQueueTo(); queue.PeopleId = 1; queue.Id = 1; queue.GoerSupportId = 1; var dynMethod = email.GetType().GetMethod("UnlayerLinkReplacement", BindingFlags.NonPublic | BindingFlags.Instance); string url = dynMethod.Invoke(email, new object[] { "https://regretslink/?meeting=370&confirm=true", queue }).ToString(); url.ShouldContain("®rets=true"); } }
public ActionResult Application(int orgid, int peopleid, string content) { #if DEBUG2 var c = System.IO.File.ReadAllText(Server.MapPath("/Application.html")); var replacements = new EmailReplacements(DbUtil.Db, c, null); #else var c = DbUtil.Db.Content(content); if (c == null) { return(Message("no content at " + content)); } var replacements = new EmailReplacements(DbUtil.Db, c.Body, null); #endif var p = DbUtil.Db.LoadPersonById(peopleid); DbUtil.Db.SetCurrentOrgId(orgid); ViewBag.html = replacements.DoReplacements(DbUtil.Db, p); return(View()); }
public ActionResult SaveProgress(OnlineRegModel m) { m.HistoryAdd("saveprogress"); if (m.UserPeopleId == null) { m.UserPeopleId = Util.UserPeopleId; } m.UpdateDatum(); var p = m.UserPeopleId.HasValue ? CurrentDatabase.LoadPersonById(m.UserPeopleId.Value) : m.List[0].person; if (p == null) { return(Content("We have not found your record yet, cannot save progress, sorry")); } if (m.masterorgid == null && m.Orgid == null) { return(Content("Registration is not far enough along to save, sorry.")); } var msg = CurrentDatabase.ContentHtml("ContinueRegistrationLink", @" <p>Hi {first},</p> <p>Here is the link to continue your registration:</p> Resume [registration for {orgname}] ").Replace("{orgname}", m.Header); var linktext = Regex.Match(msg, @"(\[(.*)\])", RegexOptions.Singleline).Groups[2].Value; var registerlink = EmailReplacements.CreateRegisterLink(m.masterorgid ?? m.Orgid, linktext); msg = Regex.Replace(msg, @"(\[.*\])", registerlink, RegexOptions.Singleline); var notifyids = CurrentDatabase.NotifyIds((m.masterorg ?? m.org).NotifyIds); CurrentDatabase.Email(notifyids[0].FromEmail, p, $"Continue your registration for {m.Header}", msg); /* We use Content as an ActionResult instead of Message because we want plain text sent back * This is an HttpPost ajax call and will have a SiteLayout wrapping this. */ return(Content(@" We have saved your progress. An email with a link to finish this registration will come to you shortly. <input type='hidden' id='SavedProgress' value='true'/> ")); }
public override void ExecuteResult(ControllerContext context) { var response = context.HttpContext.Response; var list = ExcelExportModel.DirectoryList(id); if (list.Count == 0) { response.Write("no data found"); return; } var wc = new WebClient(); var bytes = wc.DownloadData(template); var ms = new MemoryStream(bytes); docx = DocX.Load(ms); replacements = new EmailReplacements(DbUtil.Db, docx); emptyReplacementsDictionary = replacements.DocXReplacementsDictionary(null); if (emptyReplacementsDictionary.ContainsKey("{lastnamestartswith}")) { BuildDocumentIndexStyle(list); } else { BuildDocument(list); } response.Clear(); response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; response.AddHeader("content-disposition", $"attachment;filename={filename}-{DateTime.Now.ToSortableDateTime()}.docx"); ms = new MemoryStream(); docx.SaveAs(ms); ms.WriteTo(response.OutputStream); response.End(); }
public ActionResult FinishLater(int id) { var ed = DbUtil.Db.RegistrationDatas.SingleOrDefault(e => e.Id == id); if (ed != null) { var m = Util.DeSerialize <OnlineRegModel>(ed.Data); var registerLink = EmailReplacements.CreateRegisterLink(m.masterorgid ?? m.Orgid, "Resume registration for {0}".Fmt(m.Header)); var msg = "<p>Hi {first},</p>\n<p>Here is the link to continue your registration:</p>\n" + registerLink; Debug.Assert((m.masterorgid ?? m.Orgid) != null, "m.Orgid != null"); var notifyids = DbUtil.Db.NotifyIds((m.masterorgid ?? m.Orgid).Value, (m.masterorg ?? m.org).NotifyIds); var p = m.UserPeopleId.HasValue ? DbUtil.Db.LoadPersonById(m.UserPeopleId.Value) : m.List[0].person; DbUtil.Db.Email(notifyids[0].FromEmail, p, "Continue your registration for {0}".Fmt(m.Header), msg); /* We use Content as an ActionResult instead of Message because we want plain text sent back * This is an HttpPost ajax call and will have a SiteLayout wrapping this. */ //return Content("We have saved your progress. An email with a link to finish this registration will come to you shortly."); return(View(m)); } return(View("Unknown")); }
private void DoHeaderFooterParagraphReplacments(Paragraph p, OrgInfo o) { var list = EmailReplacements.TextReplacementsList(p.Text); foreach (var code in list) { if (code.StartsWith("{datemeeting")) { p.ReplaceText(code, Util.PickFirst(EmailReplacements .DateFormattedReplacement(NewMeetingInfo.MeetingDate, code) , "____")); } else if (code == "{orgname}") { p.ReplaceText(code, o.Name); } else if (code == "{today}") { p.ReplaceText(code, DateTime.Today.ToShortDateString()); } else if (code == "{orgid}") { p.ReplaceText(code, o.OrgId.ToString()); } else if (code == "{barcodemeeting}") { var text = $"M.{o.OrgId}.{NewMeetingInfo.MeetingDate:MMddyyHHmm}"; var s = BarCodeStream(text, 50, showtext: false); var img = curr.AddImage(s); p.AppendPicture(img.CreatePicture()); p.ReplaceText(code, ""); p.Alignment = Alignment.right; } } }
public ActionResult SendLink(string id) { if (!id.HasValue()) { return(Content("bad link")); } var guid = id.ToGuid(); if (guid == null) { return(Content("invalid link")); } var ot = DbUtil.Db.OneTimeLinks.SingleOrDefault(oo => oo.Id == guid.Value); if (ot == null) { return(Content("invalid link")); } if (ot.Used) { return(Content("link used")); } if (ot.Expires.HasValue && ot.Expires < DateTime.Now) { return(Content("link expired")); } var a = ot.Querystring.SplitStr(",", 4); var orgid = a[0].ToInt(); var pid = a[1].ToInt(); var queueid = a[2].ToInt(); var linktype = a[3]; // for supportlink, this will also have the goerid var q = (from pp in DbUtil.Db.People where pp.PeopleId == pid let org = DbUtil.Db.LoadOrganizationById(orgid) select new { p = pp, org }).Single(); if (q.org.RegistrationClosed == true || q.org.OrganizationStatusId == OrgStatusCode.Inactive) { return(Content("sorry, registration has been closed")); } if (q.org.RegistrationTypeId == RegistrationTypeCode.None) { return(Content("sorry, registration is no longer available")); } ot.Used = true; DbUtil.Db.SubmitChanges(); DbUtil.LogActivity("Sendlink: {0}".Fmt(q.org.OrganizationName)); var subject = "Your link for " + q.org.OrganizationName; var msg = @"<p>Here is your <a href=""{0}"">LINK</a></p> <p>Note: If you did not request this link, please ignore this email, or contact the church if you need help.</p>" .Fmt(EmailReplacements.RegisterLinkUrl(DbUtil.Db, orgid, pid, queueid, linktype)); var NotifyIds = DbUtil.Db.StaffPeopleForOrg(q.org.OrganizationId); DbUtil.Db.Email(NotifyIds[0].FromEmail, q.p, subject, msg); // send confirmation return(Content("Thank you, {0}, we just sent an email to {1} with your link...".Fmt(q.p.PreferredName, Util.ObscureEmail(q.p.EmailAddress)))); }
public ActionResult Test(int?id) { EmailReplacements.ReCodes(); return(Content("no test")); }
private static void ValidateEmailReplacementCodes(CMSDataContext db, string emailText, MailAddress fromAddress) { var er = new EmailReplacements(db, emailText, fromAddress); er.DoReplacements(db, DbUtil.Db.LoadPersonById(Util.UserPeopleId.Value)); }
public ActionResult SendLink(string id, FormCollection formCollection) { var li = new LinkInfo(sendlinkSTR, landingSTR, id); if (li.error.HasValue()) { return(Message(li.error)); } try { if (!li.pid.HasValue) { throw new Exception("missing peopleid"); } if (!li.oid.HasValue) { throw new Exception("missing orgid"); } var queueid = li.a[2].ToInt(); var linktype = li.a[3]; // for supportlink, this will also have the goerid var q = (from pp in DbUtil.Db.People where pp.PeopleId == li.pid let org = DbUtil.Db.LoadOrganizationById(li.oid) select new { p = pp, org }).Single(); if (q.org == null && DbUtil.Db.Host == "trialdb") { var oid = li.oid + Util.TrialDbOffset; q = (from pp in DbUtil.Db.People where pp.PeopleId == li.pid let org = DbUtil.Db.LoadOrganizationById(oid) select new { p = pp, org }).Single(); } if (q.org.RegistrationClosed == true || q.org.OrganizationStatusId == OrgStatusCode.Inactive) { throw new Exception("sorry, registration has been closed"); } if (q.org.RegistrationTypeId == RegistrationTypeCode.None) { throw new Exception("sorry, registration is no longer available"); } DbUtil.LogActivity($"{sendlinkSTR}{confirmSTR}", li.oid, li.pid); var expires = DateTime.Now.AddMinutes(DbUtil.Db.Setting("SendlinkExpireMintues", "30").ToInt()); var c = DbUtil.Content("SendLinkMessage"); if (c == null) { c = new Content { Name = "SendLinkMessage", Title = "Your Link for {org}", Body = @" <p>Here is your temporary <a href='{url}'>LINK</a> to register for {org}.</p> <p>This link will expire at {time} (30 minutes). You may request another link by clicking the link in the original email you received.</p> <p>Note: If you did not request this link, please ignore this email, or contact the church if you need help.</p> " }; DbUtil.Db.Contents.InsertOnSubmit(c); DbUtil.Db.SubmitChanges(); } var url = EmailReplacements.RegisterLinkUrl(DbUtil.Db, li.oid.Value, li.pid.Value, queueid, linktype, expires); var subject = c.Title.Replace("{org}", q.org.OrganizationName); var msg = c.Body.Replace("{org}", q.org.OrganizationName) .Replace("{time}", expires.ToString("f")) .Replace("{url}", url) .Replace("%7Burl%7D", url); var NotifyIds = DbUtil.Db.StaffPeopleForOrg(q.org.OrganizationId); DbUtil.Db.Email(NotifyIds[0].FromEmail, q.p, subject, msg); // send confirmation return(Message($"Thank you, {q.p.PreferredName}, we just sent an email to {Util.ObscureEmail(q.p.EmailAddress)} with your link...")); } catch (Exception ex) { DbUtil.LogActivity($"{sendlinkSTR}{confirmSTR}Error: {ex.Message}", li.oid, li.pid); return(Message(ex.Message)); } }
private ConfirmEnum ConfirmTransaction(OnlineRegModel m, string transactionId) { m.ParseSettings(); if (m.List.Count == 0) { throw new Exception(" unexpected, no registrants found in confirmation"); } var ret = ConfirmEnum.Confirm; var managingsubs = m.ManagingSubscriptions(); var choosingslots = m.ChoosingSlots(); var t = m.Transaction; if (t == null && !managingsubs && !choosingslots) { m.HistoryAdd("ConfirmTransaction"); m.UpdateDatum(completed: true); var pf = PaymentForm.CreatePaymentForm(m); t = pf.CreateTransaction(DbUtil.Db); m.TranId = t.Id; } if (t != null) { ViewBag.message = t.Message; } if (m.org != null && m.org.RegistrationTypeId == RegistrationTypeCode.CreateAccount) { m.List[0].CreateAccount(); ret = ConfirmEnum.ConfirmAccount; } else if (m.OnlineGiving()) { var p = m.List[0]; if (p.IsNew) { p.AddPerson(null, p.org.EntryPointId ?? 0); } var staff = DbUtil.Db.StaffPeopleForOrg(p.org.OrganizationId)[0]; var text = p.setting.Body.Replace("{church}", DbUtil.Db.Setting("NameOfChurch", "church"), ignoreCase: true); text = text.Replace("{amt}", (t.Amt ?? 0).ToString("N2")); text = text.Replace("{date}", DateTime.Today.ToShortDateString()); text = text.Replace("{tranid}", t.Id.ToString()); //text = text.Replace("{name}", p.person.Name); text = text.Replace("{account}", ""); text = text.Replace("{email}", p.person.EmailAddress); text = text.Replace("{phone}", p.person.HomePhone.FmtFone()); text = text.Replace("{contact}", staff.Name); text = text.Replace("{contactemail}", staff.EmailAddress); text = text.Replace("{contactphone}", p.org.PhoneNumber.FmtFone()); var re = new Regex(@"(?<b>.*?)<!--ITEM\sROW\sSTART-->(?<row>.*?)\s*<!--ITEM\sROW\sEND-->(?<e>.*)", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); var match = re.Match(text); var b = match.Groups["b"].Value; var row = match.Groups["row"].Value.Replace("{funditem}", "{0}").Replace("{itemamt}", "{1:N2}"); var e = match.Groups["e"].Value; var sb = new StringBuilder(b); var desc = "{0}; {1}; {2}".Fmt( p.person.Name, p.person.PrimaryAddress, p.person.PrimaryZip); foreach (var g in p.FundItemsChosen()) { if (g.amt > 0) { sb.AppendFormat(row, g.desc, g.amt); p.person.PostUnattendedContribution(DbUtil.Db, g.amt, g.fundid, desc, tranid: t.Id); } } t.TransactionPeople.Add(new TransactionPerson { PeopleId = p.person.PeopleId, Amt = t.Amt, OrgId = m.Orgid, }); t.Financeonly = true; if (t.Donate > 0) { var fundname = DbUtil.Db.ContributionFunds.Single(ff => ff.FundId == p.setting.DonationFundId).FundName; sb.AppendFormat(row, fundname, t.Donate); t.Fund = p.setting.DonationFund(); p.person.PostUnattendedContribution(DbUtil.Db, t.Donate ?? 0, p.setting.DonationFundId, desc, tranid: t.Id); } sb.Append(e); if (!t.TransactionId.HasValue()) { t.TransactionId = transactionId; if (m.testing == true && !t.TransactionId.Contains("(testing)")) { t.TransactionId += "(testing)"; } } var contributionemail = (from ex in p.person.PeopleExtras where ex.Field == "ContributionEmail" select ex.Data).SingleOrDefault(); if (contributionemail.HasValue()) { contributionemail = (contributionemail ?? "").Trim(); } if (!Util.ValidEmail(contributionemail)) { contributionemail = p.person.FromEmail; } var body = sb.ToString(); var from = Util.TryGetMailAddress(DbUtil.Db.StaffEmailForOrg(p.org.OrganizationId)); var mm = new EmailReplacements(DbUtil.Db, body, from); body = mm.DoReplacements(p.person); Util.SendMsg(Util.SysFromEmail, Util.Host, from, p.setting.Subject, body, Util.EmailAddressListFromString(contributionemail), 0, p.PeopleId); DbUtil.Db.Email(contributionemail, DbUtil.Db.StaffPeopleForOrg(p.org.OrganizationId), "online giving contribution received", "see contribution records for {0} ({1})".Fmt(p.person.Name, p.PeopleId)); if (p.CreatingAccount == true) { p.CreateAccount(); } } else if (managingsubs) { m.ConfirmManageSubscriptions(); ret = ConfirmEnum.ConfirmAccount; } else if (choosingslots) { m.ConfirmPickSlots(); m.URL = null; ViewBag.ManagingVolunteer = true; ViewBag.CreatedAccount = m.List[0].CreatingAccount; ret = ConfirmEnum.ConfirmAccount; } else if (m.OnlinePledge()) { m.SendLinkForPledge(); ViewBag.CreatedAccount = m.List[0].CreatingAccount; ret = ConfirmEnum.ConfirmAccount; } else if (m.ManageGiving()) { m.SendLinkToManageGiving(); ret = ConfirmEnum.ConfirmAccount; } else if (t.TransactionGateway.ToLower() == "serviceu") { t.TransactionId = transactionId; if (m.testing == true && !t.TransactionId.Contains("(testing)")) { t.TransactionId += "(testing)"; } t.Message = "Transaction Completed"; t.Approved = true; m.EnrollAndConfirm(); if (m.List.Any(pp => pp.PeopleId == null)) { LogOutOfOnlineReg(); throw new Exception("no person"); } m.UseCoupon(t.TransactionId, t.Amt ?? 0); } else { if (!t.TransactionId.HasValue()) { t.TransactionId = transactionId; if (m.testing == true && !t.TransactionId.Contains("(testing)")) { t.TransactionId += "(testing)"; } } m.EnrollAndConfirm(); if (m.List.Any(pp => pp.PeopleId == null)) { LogOutOfOnlineReg(); throw new Exception("no person"); } m.UseCoupon(t.TransactionId, t.Amt ?? 0); } if (m.IsCreateAccount() || m.ManagingSubscriptions()) { m.email = m.List[0].person.EmailAddress; } else { m.email = m.List[0].EmailAddress; } ViewBag.email = m.email; if (m.masterorgid.HasValue && m.Orgid.HasValue && !m.settings[m.Orgid.Value].Subject.HasValue()) { ViewBag.orgname = m.masterorg.OrganizationName; } else { ViewBag.orgname = m.org != null ? m.org.OrganizationName : m.masterorg.OrganizationName; } LogOutOfOnlineReg(); return(ret); }
private ConfirmEnum DoOnlineGiving(string transactionReturn) { var p = List[0]; if (p.IsNew) { p.AddPerson(null, p.org.EntryPointId ?? 0); } var staff = DbUtil.Db.StaffPeopleForOrg(p.org.OrganizationId)[0]; var text = p.setting.Body; text = text.Replace("{church}", DbUtil.Db.Setting("NameOfChurch", "church"), ignoreCase: true); text = text.Replace("{amt}", (Transaction.Amt ?? 0).ToString("N2")); text = text.Replace("{date}", DateTime.Today.ToShortDateString()); text = text.Replace("{tranid}", Transaction.Id.ToString()); text = text.Replace("{account}", ""); text = text.Replace("{email}", p.person.EmailAddress); text = text.Replace("{phone}", p.person.HomePhone.FmtFone()); text = text.Replace("{contact}", staff.Name); text = text.Replace("{contactemail}", staff.EmailAddress); text = text.Replace("{contactphone}", p.org.PhoneNumber.FmtFone()); var re = new Regex(@"(?<b>.*?)<!--ITEM\sROW\sSTART-->(?<row>.*?)\s*<!--ITEM\sROW\sEND-->(?<e>.*)", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); var match = re.Match(text); var b = match.Groups["b"].Value; var row = match.Groups["row"].Value.Replace("{funditem}", "{0}").Replace("{itemamt}", "{1:N2}"); var e = match.Groups["e"].Value; var sb = new StringBuilder(b); var desc = $"{p.person.Name}; {p.person.PrimaryAddress}; {p.person.PrimaryZip}"; foreach (var g in p.FundItemsChosen()) { if (g.amt > 0) { sb.AppendFormat(row, g.desc, g.amt); p.person.PostUnattendedContribution(DbUtil.Db, g.amt, g.fundid, desc, tranid: Transaction.Id); } } Transaction.TransactionPeople.Add(new TransactionPerson { PeopleId = p.person.PeopleId, Amt = Transaction.Amt, OrgId = Orgid, }); Transaction.Financeonly = true; if (Transaction.Donate > 0) { var fundname = DbUtil.Db.ContributionFunds.Single(ff => ff.FundId == p.setting.DonationFundId).FundName; sb.AppendFormat(row, fundname, Transaction.Donate); Transaction.Fund = p.setting.DonationFund(); p.person.PostUnattendedContribution(DbUtil.Db, Transaction.Donate ?? 0, p.setting.DonationFundId, desc, tranid: Transaction.Id); Log("PostedContribution"); } sb.Append(e); if (!Transaction.TransactionId.HasValue()) { Transaction.TransactionId = transactionReturn; if (testing == true && !Transaction.TransactionId.Contains("(testing)")) { Transaction.TransactionId += "(testing)"; } } var contributionemail = (from ex in p.person.PeopleExtras where ex.Field == "ContributionEmail" select ex.Data).SingleOrDefault(); if (contributionemail.HasValue()) { contributionemail = (contributionemail ?? "").Trim(); } if (Util.ValidEmail(contributionemail)) { Log("UsingSpecialEmail"); } else { contributionemail = p.person.FromEmail; } var body = sb.ToString(); var from = Util.TryGetMailAddress(DbUtil.Db.StaffEmailForOrg(p.org.OrganizationId)); var mm = new EmailReplacements(DbUtil.Db, body, @from); body = mm.DoReplacements(DbUtil.Db, p.person); Util.SendMsg(Util.SysFromEmail, Util.Host, @from, p.setting.Subject, body, Util.EmailAddressListFromString(contributionemail), 0, p.PeopleId); DbUtil.Db.Email(contributionemail, DbUtil.Db.StaffPeopleForOrg(p.org.OrganizationId), "online giving contribution received", $"see contribution records for {p.person.Name} ({p.PeopleId})"); if (p.CreatingAccount) { p.CreateAccount(); } return(ConfirmEnum.Confirm); }
public override void ExecuteResult(ControllerContext context) { var response = context.HttpContext.Response; if (Meetingid.HasValue) { meeting = DbUtil.Db.Meetings.Single(mt => mt.MeetingId == Meetingid); Debug.Assert(meeting.MeetingDate != null, "meeting.MeetingDate != null"); NewMeetingInfo = new NewMeetingInfo { MeetingDate = meeting.MeetingDate.Value }; } var list1 = NewMeetingInfo.ByGroup ? ReportList2().ToList() : ReportList().ToList(); if (!list1.Any()) { response.Write("no data found"); return; } var bytes = RollsheetTemplate() ?? Resource1.DocxRollsheet; var ms = new MemoryStream(bytes); docx = DocX.Load(ms); replacements = new EmailReplacements(DbUtil.Db, docx); var sources = new List <Source>(); foreach (var o in list1) { curr = docx.Copy(); foreach (var p in curr.Headers.odd.Paragraphs) { DoHeaderFooterParagraphReplacments(p, o); } foreach (var p in curr.Footers.odd.Paragraphs) { DoHeaderFooterParagraphReplacments(p, o); } var tbl = curr.Tables[0]; var emptyrow = tbl.InsertRow(); tbl.Rows.Add(emptyrow); tbl.RemoveRow(0); if (meeting != null) { var q = from at in meeting.Attends where at.AttendanceFlag || AttendCommitmentCode.committed.Contains(at.Commitment ?? 0) orderby at.Person.LastName, at.Person.FamilyId, at.Person.Name2 select new RollsheetPersonInfo() { Person = at.Person, MemberTypeCode = at.MemberType.Code, }; foreach (var m in q) { AddRowWithReplacements(tbl, m, meeting.OrganizationId); } } else if (OrgSearchModel != null) { var q = from om in DbUtil.Db.OrganizationMembers where om.OrganizationId == o.OrgId join m in DbUtil.Db.OrgPeople(o.OrgId, o.Groups) on om.PeopleId equals m.PeopleId where om.EnrollmentDate <= Util.Now orderby om.Person.LastName, om.Person.FamilyId, om.Person.Name2 let p = om.Person let useAltName = NewMeetingInfo.UseAltNames && p.AltName != null && p.AltName.Length > 0 select new RollsheetPersonInfo() { Person = p, MemberTypeCode = om.MemberType.Code, UseAltName = useAltName, Highlight = om.OrgMemMemTags.Any(mm => mm.MemberTag.Name == NewMeetingInfo.HighlightGroup) ? NewMeetingInfo.HighlightGroup : "" }; foreach (var m in q) { AddRowWithReplacements(tbl, m, o.OrgId); } } else if (Filter?.GroupSelect == GroupSelectCode.Member) { var q = from om in DbUtil.Db.OrganizationMembers where om.OrganizationId == Filter.Id join m in DbUtil.Db.OrgFilterPeople(QueryId, null) on om.PeopleId equals m.PeopleId where om.EnrollmentDate <= Util.Now where NewMeetingInfo.ByGroup == false || m.Groups.Contains((char)10 + o.Groups + (char)10) orderby om.Person.LastName, om.Person.FamilyId, om.Person.Name2 let p = om.Person let useAltName = NewMeetingInfo.UseAltNames && p.AltName != null && p.AltName.Length > 0 select new RollsheetPersonInfo() { Person = p, MemberTypeCode = om.MemberType.Code, UseAltName = useAltName, Highlight = om.OrgMemMemTags.Any(mm => mm.MemberTag.Name == NewMeetingInfo.HighlightGroup) ? NewMeetingInfo.HighlightGroup : "" }; foreach (var m in q) { AddRowWithReplacements(tbl, m, o.OrgId); } } else { var q = from m in DbUtil.Db.OrgFilterPeople(QueryId, null) orderby m.Name2 let p = DbUtil.Db.People.Single(pp => pp.PeopleId == m.PeopleId) let om = p.OrganizationMembers.SingleOrDefault(mm => mm.OrganizationId == Filter.Id) let useAltName = NewMeetingInfo.UseAltNames && p.AltName != null && p.AltName.Length > 0 select new RollsheetPersonInfo { Person = p, MemberTypeCode = om == null ? "Guest" : om.MemberType.Code, UseAltName = useAltName, Highlight = om.OrgMemMemTags.Any(mm => mm.MemberTag.Name == NewMeetingInfo.HighlightGroup) ? NewMeetingInfo.HighlightGroup : "" }; foreach (var m in q) { AddRowWithReplacements(tbl, m, o.OrgId); } } if ((OrgSearchModel != null && NewMeetingInfo.ByGroup == false) || (Filter != null && Filter.GroupSelect == GroupSelectCode.Member && meeting == null && !Filter.SgFilter.HasValue() && !Filter.NameFilter.HasValue() && !Filter.FilterIndividuals == true && !Filter.FilterTag == true && NewMeetingInfo.ByGroup == false)) { var q = from vp in DbUtil.Db.OrgVisitorsAsOfDate(o.OrgId, NewMeetingInfo.MeetingDate, NoCurrentMembers: true) let p = DbUtil.Db.People.Single(pp => pp.PeopleId == vp.PeopleId) orderby p.LastName, p.FamilyId, p.PreferredName select new RollsheetPersonInfo { Person = p, MemberTypeCode = vp.VisitorType }; foreach (var m in q) { AddRowWithReplacements(tbl, m, o.OrgId); } } curr.Tables[0].RemoveRow(0); { var memStream = new MemoryStream(); curr.SaveAs(memStream); memStream.Position = 0; var wmlDocument = new WmlDocument(null, memStream); sources.Add(new Source(wmlDocument, keepSections: true)); } } context.HttpContext.Response.Clear(); context.HttpContext.Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; context.HttpContext.Response.AddHeader("Content-Disposition", $"attachment;filename=rollsheet.docx"); var finaldoc = DocumentBuilder.BuildDocument(sources); context.HttpContext.Response.OutputStream.Write(finaldoc.DocumentByteArray, 0, finaldoc.DocumentByteArray.Length); }
public ActionResult SendLink(string id, FormCollection formCollection) { var li = new LinkInfo(CurrentDatabase, sendlinkSTR, landingSTR, id); if (li.error.HasValue()) { return(Message(li.error)); } try { if (!li.pid.HasValue) { throw new Exception("missing peopleid"); } if (!li.oid.HasValue) { throw new Exception("missing orgid"); } var queueid = li.a[2].ToInt(); var linktype = li.a[3]; // for supportlink, this will also have the goerid int?gsid = null; if (linktype.Contains("supportlink:")) { gsid = linktype.Split(':')[1].ToInt(); } Organization oorg = null; Person person = null; string personPreferredName; string personEmailAddress; GoerSupporter gs = null; if (li.pid == 0) { oorg = CurrentDatabase.Organizations.SingleOrDefault(o => o.OrganizationId == li.oid); gs = CurrentDatabase.GoerSupporters.SingleOrDefault(s => s.Id == gsid); personPreferredName = string.Empty; personEmailAddress = gs.NoDbEmail; } else { var q = (from pp in CurrentDatabase.People where pp.PeopleId == li.pid let org = CurrentDatabase.LoadOrganizationById(li.oid) select new { p = pp, org }).Single(); oorg = q.org; person = q.p; personPreferredName = $"{person.PreferredName}, "; personEmailAddress = person.EmailAddress; } if (oorg == null && CurrentDatabase.Host == "trialdb") { var oid = li.oid + Util.TrialDbOffset; var q = (from pp in CurrentDatabase.People where pp.PeopleId == li.pid let org = CurrentDatabase.LoadOrganizationById(oid) select new { p = pp, org }).Single(); oorg = q.org; person = q.p; personPreferredName = $"{person.PreferredName}, "; personEmailAddress = person.EmailAddress; } if (oorg.RegistrationClosed == true || oorg.OrganizationStatusId == OrgStatusCode.Inactive) { throw new Exception("sorry, registration has been closed"); } if (oorg.RegistrationTypeId == RegistrationTypeCode.None) { throw new Exception("sorry, registration is no longer available"); } DbUtil.LogActivity($"{sendlinkSTR}{confirmSTR}", li.oid, li.pid); var expires = DateTime.Now.AddMinutes(CurrentDatabase.Setting("SendlinkExpireMinutes", "30").ToInt()); string action = (linktype.Contains("supportlink") ? "support" : "register for"); string minutes = CurrentDatabase.Setting("SendLinkExpireMinutes", "30"); var c = DbUtil.Content(CurrentDatabase, "SendLinkMessage"); if (c == null) { c = new Content { Name = "SendLinkMessage", Title = "Your Link for {org}", Body = @" <p>Here is your temporary <a href='{url}'>LINK</a> to {action} {org}.</p> <p>This link will expire at {time} ({minutes} minutes). You may request another link by clicking the link in the original email you received.</p> <p>Note: If you did not request this link, please ignore this email, or contact the church if you need help.</p> " }; CurrentDatabase.Contents.InsertOnSubmit(c); CurrentDatabase.SubmitChanges(); } var url = EmailReplacements.RegisterLinkUrl(CurrentDatabase, li.oid.Value, li.pid.Value, queueid, linktype, expires); var subject = c.Title.Replace("{org}", oorg.OrganizationName); var msg = c.Body.Replace("{org}", oorg.OrganizationName) .Replace("{time}", expires.ToString("f")) .Replace("{url}", url) .Replace("{action}", action) .Replace("{minutes}", minutes) .Replace("%7Burl%7D", url); var NotifyIds = CurrentDatabase.StaffPeopleForOrg(oorg.OrganizationId); if (person != null) { CurrentDatabase.Email(NotifyIds[0].FromEmail, person, subject, msg); // send confirmation } else //send email to no db person { var from = new MailAddress(NotifyIds[0].EmailAddress ?? NotifyIds[0].EmailAddress2, NotifyIds[0].Name); CurrentDatabase.SendEmail(from, subject, msg, Util.ToMailAddressList(gs.NoDbEmail), gs.Id); } return(Message($"Thank you, {personPreferredName}we just sent an email to {Util.ObscureEmail(personEmailAddress)} with your link...")); } catch (Exception ex) { DbUtil.LogActivity($"{sendlinkSTR}{confirmSTR}Error: {ex.Message}", li.oid, li.pid); return(Message(ex.Message)); } }