public string EmailStr(int queuedBy, string fromAddr, string body) { using (var db2 = NewDataContext()) { db2.SetCurrentOrgId(CurrentOrgId); var m = new EmailReplacements(db2, body, new MailAddress(fromAddr)); var p = db2.LoadPersonById(queuedBy); return m.DoReplacements(db2, p); } }
public string EmailStr(int queuedBy, string fromAddr, string body) { using (var db2 = NewDataContext()) { db2.SetCurrentOrgId(CurrentOrgId); var m = new EmailReplacements(db2, body, new MailAddress(fromAddr)); var p = db2.LoadPersonById(queuedBy); return(m.DoReplacements(db2, p)); } }
private string CreateClickTracking(int emailId, string input) { var doc = new HtmlDocument(); doc.LoadHtml(input); int linkIndex = 0; using (var md5Hash = MD5.Create()) { var linkList = doc.DocumentNode.SelectNodes("//a[@href]"); if (linkList == null) { return(doc.DocumentNode.OuterHtml); } foreach (HtmlNode link in linkList) { var att = link.Attributes["href"]; var url = att.Value; if (EmailReplacements.IsSpecialLink(url)) { continue; } if (url.StartsWith("mailto:")) { continue; } if (EmailReplacements.SettingUrlRe.IsMatch(url)) { url = EmailReplacements.SettingUrlReplacement(this, url); } var hash = HashMd5Base64(md5Hash, url + DateTime.Now.ToString("o") + linkIndex); var emailLink = new EmailLink { Created = DateTime.Now, EmailID = emailId, Hash = hash, Link = url }; EmailLinks.InsertOnSubmit(emailLink); SubmitChanges(); att.Value = ServerLink($"/ExternalServices/ct?l={HttpUtility.UrlEncode(hash)}"); linkIndex++; } } return(doc.DocumentNode.OuterHtml); }
public void SendPersonEmail(int id, int pid) { var sysFromEmail = Util.SysFromEmail; var emailqueue = EmailQueues.Single(eq => eq.Id == id); var emailqueueto = EmailQueueTos.Single(eq => eq.Id == id && eq.PeopleId == pid); var fromname = emailqueueto.EmailQueue.FromName; fromname = !fromname.HasValue() ? emailqueue.FromAddr : emailqueue.FromName.Replace("\"", ""); var from = Util.FirstAddress(emailqueue.FromAddr, fromname); try { var p = LoadPersonById(emailqueueto.PeopleId); var body = DoClickTracking(emailqueue); var m = new EmailReplacements(this, body, from); var text = m.DoReplacements(p, emailqueueto); var aa = m.ListAddresses; if (Setting("sendemail", "true") != "false") { if (aa.Count > 0) { Util.SendMsg(sysFromEmail, CmsHost, from, emailqueue.Subject, text, aa, emailqueue.Id, pid); } else { Util.SendMsg(sysFromEmail, CmsHost, from, "(no email address) " + emailqueue.Subject, "<p style='color:red'>You are receiving this because there is no email address for {0}({1}). You should probably contact them since they were probably expecting this information.</p>\n{2}".Fmt(p.Name, p.PeopleId, text), Util.ToMailAddressList(from), emailqueue.Id, pid); } emailqueueto.Sent = DateTime.Now; emailqueue.Sent = DateTime.Now; if (emailqueue.Redacted ?? false) { emailqueue.Body = "redacted"; } SubmitChanges(); } } catch (Exception ex) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error", ex.ToString(), Util.ToMailAddressList(from), emailqueue.Id, null); throw; } }
public string EmailStr(string body) { if (!Util.UserPeopleId.HasValue) { return("no user"); } using (var db2 = NewDataContext()) { db2.SetCurrentOrgId(CurrentOrgId); var p = db2.LoadPersonById(Util.UserPeopleId.Value); var m = new EmailReplacements(db2, body, new MailAddress(p.EmailAddress)); return(m.DoReplacements(db2, p)); } }
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(); }
private string CreateClickTracking(int emailId, string input) { var doc = new HtmlDocument(); doc.LoadHtml(input); int linkIndex = 0; using (var md5Hash = MD5.Create()) { var linkList = doc.DocumentNode.SelectNodes("//a[@href]"); if (linkList == null) { return(doc.DocumentNode.OuterHtml); } foreach (HtmlNode link in linkList) { var att = link.Attributes["href"]; if (EmailReplacements.IsSpecialLink(att.Value)) { continue; } var hash = HashMd5Base64(md5Hash, att.Value + DateTime.Now.ToString("o") + linkIndex); var emailLink = new EmailLink { Created = DateTime.Now, EmailID = emailId, Hash = hash, Link = att.Value }; EmailLinks.InsertOnSubmit(emailLink); SubmitChanges(); att.Value = ServerLink($"/ExternalServices/ct?l={HttpUtility.UrlEncode(hash)}"); linkIndex++; //System.Diagnostics.Debug.WriteLine(att.Value); //System.Diagnostics.Debug.WriteLine("Unhashed: " + att.Value + DateTime.Now.ToString("o")); //System.Diagnostics.Debug.WriteLine("Hashed: " + hashMD5Base64( md5Hash, att.Value + DateTime.Now.ToString("o") ) ); } } return(doc.DocumentNode.OuterHtml); }
public override void ExecuteResult(ControllerContext context) { var wc = new WebClient(); var bytes = wc.DownloadData(template); var ms = new MemoryStream(bytes); var doctemplate = DocX.Load(ms); var replacements = new EmailReplacements(DbUtil.Db, doctemplate); var q = peopleId.HasValue ? DbUtil.Db.PeopleQuery2(peopleId) : DbUtil.Db.PeopleQuery(guid); if (!q.Any()) throw new Exception("no people in query"); var finaldoc = replacements.DocXReplacements(q.First()); foreach (var p in q.Skip(1)) { finaldoc.InsertParagraph().InsertPageBreakAfterSelf(); var doc = replacements.DocXReplacements(p); finaldoc.InsertDocument(doc); } context.HttpContext.Response.Clear(); context.HttpContext.Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; context.HttpContext.Response.AddHeader("Content-Disposition", $"attachment;filename={filename}-{DateTime.Now.ToSortableDateTime()}.docx"); finaldoc.SaveAs(context.HttpContext.Response.OutputStream); }
public int DoGiving(CMSDataContext db) { var total = (from a in db.RecurringAmounts where a.PeopleId == PeopleId where a.ContributionFund.FundStatusId == 1 where a.ContributionFund.OnlineSort != null select a.Amt).Sum(); if (!total.HasValue || total == 0) return 0; var paymentInfo = db.PaymentInfos.Single(x => x.PeopleId == PeopleId); var preferredType = paymentInfo.PreferredGivingType; var gw = GetGateway(db, paymentInfo); var orgid = (from o in db.Organizations where o.RegistrationTypeId == RegistrationTypeCode.ManageGiving select o.OrganizationId).FirstOrDefault(); var t = new Transaction { TransactionDate = DateTime.Now, TransactionId = "started", First = Person.FirstName, MiddleInitial = Person.MiddleName.Truncate(1) ?? "", Last = Person.LastName, Suffix = Person.SuffixCode, Amt = total, Description = "Recurring Giving", Testing = false, TransactionGateway = gw.GatewayType, Financeonly = true, PaymentType = preferredType, LastFourCC = preferredType == PaymentType.CreditCard ? paymentInfo.MaskedCard.Last(4) : null, LastFourACH = preferredType == PaymentType.Ach ? paymentInfo.MaskedAccount.Last(4) : null, OrgId = orgid, }; db.Transactions.InsertOnSubmit(t); db.SubmitChanges(); var ret = gw.PayWithVault(PeopleId, total ?? 0, "Recurring Giving", t.Id, preferredType); t.Message = ret.Message; t.AuthCode = ret.AuthCode; t.Approved = ret.Approved; t.TransactionId = ret.TransactionId; var gift = db.Setting("NameForPayment", "gift"); var church = db.Setting("NameOfChurch", db.CmsHost); var q = from a in db.RecurringAmounts where a.PeopleId == PeopleId select a; var tot = q.Where(aa => aa.ContributionFund.FundStatusId == 1).Sum(aa => aa.Amt); t.TransactionPeople.Add(new TransactionPerson { PeopleId = Person.PeopleId, Amt = tot, }); var notify = db.RecurringGivingNotifyPersons(); var from = Util.TryGetMailAddress(notify[0].EmailAddress); if (ret.Approved) { foreach (var a in q) { if (a.ContributionFund.FundStatusId == 1 && a.ContributionFund.OnlineSort != null && a.Amt > 0) Person.PostUnattendedContribution(db, a.Amt ?? 0, a.FundId, "Recurring Giving", tranid: t.Id); } NextDate = FindNextDate(Util.Now.Date.AddDays(1)); db.SubmitChanges(); if (tot > 0) { var msg = db.Content("RecurringGiftNotice") ?? new Content { Title = $"Recurring {gift} for {{church}}", Body = "Your gift of {total} was processed this morning." }; var subject = msg.Title.Replace("{church}", church); var body = msg.Body.Replace("{total}", $"${tot:N2}"); var m = new EmailReplacements(db, body, from); body = m.DoReplacements(db, Person); db.EmailFinanceInformation(from, Person, null, subject, body); } } else { db.SubmitChanges(); var msg = db.Content("RecurringGiftFailedNotice") ?? new Content { Title = $"Recurring {gift} for {{church}} did not succeed", Body = @"Your payment of {total} failed to process this morning.<br> The message was '{message}'. Please contact the Finance office at the church." }; var subject = msg.Title.Replace("{church}", church); var body = msg.Body.Replace("{total}", $"${tot:N2}") .Replace("{message}", ret.Message); var m = new EmailReplacements(db, body, from); body = m.DoReplacements(db, Person); db.Email(from, Person, null, subject, body, false); foreach (var p in db.RecurringGivingNotifyPersons()) db.EmailFinanceInformation(from, p, null, $"Recurring Giving Failed on {db.CmsHost}", $"<a href='{db.CmsHost}/Transactions/{t.Id}'>message: {ret.Message}, tranid:{t.Id}</a>"); } return 1; }
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 int DoGiving(CMSDataContext db) { var q = (from a in db.RecurringAmounts where a.PeopleId == PeopleId where a.ContributionFund.FundStatusId == 1 where a.ContributionFund.OnlineSort != null where a.Amt > 0 select new GivingConfirmation.FundItem() { Amt = a.Amt.Value, Desc = a.ContributionFund.FundName, Fundid = a.FundId }).ToList(); var total = q.Sum(vv => vv.Amt); if (total == 0) { return(0); } var paymentInfo = db.PaymentInfos.Single(x => x.PeopleId == PeopleId); var preferredType = paymentInfo.PreferredGivingType ?? paymentInfo.PreferredPaymentType; var gw = GetGateway(db, paymentInfo); var orgid = (from o in db.Organizations where o.RegistrationTypeId == RegistrationTypeCode.ManageGiving select o.OrganizationId).FirstOrDefault(); var t = new Transaction { TransactionDate = DateTime.Now, TransactionId = "started", First = Person.FirstName, MiddleInitial = Person.MiddleName.Truncate(1) ?? "", Last = Person.LastName, Suffix = Person.SuffixCode, Amt = total, Description = "Recurring Giving", Testing = false, TransactionGateway = gw.GatewayType, Financeonly = true, PaymentType = preferredType, LastFourCC = preferredType == PaymentType.CreditCard ? paymentInfo.MaskedCard.Last(4) : null, LastFourACH = preferredType == PaymentType.Ach ? paymentInfo.MaskedAccount.Last(4) : null, OrgId = orgid, LoginPeopleId = Person.PeopleId, }; var vaultid = gw.VaultId(PeopleId); if (!vaultid.HasValue()) { t.Message = "Missing VaultId"; t.Approved = false; } db.Transactions.InsertOnSubmit(t); db.SubmitChanges(); if (!vaultid.HasValue()) { return(0); } var ret = gw.PayWithVault(PeopleId, total, "Recurring Giving", t.Id, preferredType); t.Message = ret.Message; t.AuthCode = ret.AuthCode; t.Approved = ret.Approved; t.TransactionId = ret.TransactionId; var gift = db.Setting("NameForPayment", "gift"); var church = db.Setting("NameOfChurch", db.CmsHost); var notify = db.RecurringGivingNotifyPersons(); var staff = notify[0]; var from = Util.TryGetMailAddress(staff.EmailAddress); if (ret.Approved) { NextDate = FindNextDate(Util.Now.Date.AddDays(1)); db.SubmitChanges(); var msg = db.Content("RecurringGiftNotice") ?? new Content { Title = $"Recurring {gift} for {{church}}", Body = $"Your gift of {total:C} was processed this morning." }; var body = GivingConfirmation.PostAndBuild(db, staff, Person, msg.Body, orgid, q, t, "Recurring Giving"); var subject = msg.Title.Replace("{church}", church); var m = new EmailReplacements(db, body, from); body = m.DoReplacements(db, Person); db.EmailFinanceInformation(from, Person, null, subject, body); } else { t.TransactionPeople.Add(new TransactionPerson { PeopleId = Person.PeopleId, Amt = t.Amt, OrgId = orgid, }); db.SubmitChanges(); var msg = db.Content("RecurringGiftFailedNotice") ?? new Content { Title = $"Recurring {gift} for {{church}} did not succeed", Body = @"Your payment of {total} failed to process this morning.<br> The message was '{message}'. Please contact the Finance office at the church." }; var subject = msg.Title.Replace("{church}", church); var body = msg.Body.Replace("{total}", $"${total:N2}") .Replace("{message}", ret.Message); var m = new EmailReplacements(db, body, from); body = m.DoReplacements(db, Person); db.Email(from, Person, null, subject, body, false); foreach (var p in db.RecurringGivingNotifyPersons()) { db.EmailFinanceInformation(from, p, null, $"Recurring Giving Failed on {db.CmsHost}", $"<a href='{db.CmsHost}/Transactions/{t.Id}'>message: {ret.Message}, tranid:{t.Id}</a>"); } } return(1); }
public string EmailStr(string body) { if (!Util.UserPeopleId.HasValue) return "no user"; using (var db2 = NewDataContext()) { db2.SetCurrentOrgId(CurrentOrgId); var p = db2.LoadPersonById(Util.UserPeopleId.Value); var m = new EmailReplacements(db2, body, new MailAddress(p.EmailAddress)); return m.DoReplacements(db2, p); } }
public void SendPeopleEmail(int queueid, bool onlyProspects = false) { var emailqueue = EmailQueues.Single(ee => ee.Id == queueid); var from = Util.FirstAddress(emailqueue.FromAddr, emailqueue.FromName); if (!emailqueue.Subject.HasValue() || !emailqueue.Body.HasValue()) { SendEmail(from, $"sent emails - error(emailid={emailqueue.Id})", "no subject or body, no emails sent", Util.ToMailAddressList(from), emailqueue.Id); return; } var body = DoClickTracking(emailqueue); var m = new EmailReplacements(this, body, from, queueid); emailqueue.Started = Util.Now; SubmitChanges(); var cc = Util.ToMailAddressList(emailqueue.CClist); if (emailqueue.SendFromOrgId.HasValue) { if (!onlyProspects) { var q2 = from om in OrganizationMembers where om.OrganizationId == emailqueue.SendFromOrgId where om.MemberTypeId != MemberTypeCode.InActive where om.MemberTypeId != MemberTypeCode.Prospect where (om.Pending ?? false) == false let p = om.Person where p.EmailAddress != null where p.EmailAddress != "" where (p.SendEmailAddress1 ?? true) || (p.SendEmailAddress2 ?? false) where p.EmailOptOuts.All(oo => oo.FromEmail != emailqueue.FromAddr) select om.PeopleId; foreach (var pid in q2) { // Protect against duplicate PeopleIDs ending up in the queue if (emailqueue.EmailQueueTos.Any(pp => pp.PeopleId == pid)) { continue; } emailqueue.EmailQueueTos.Add(new EmailQueueTo { PeopleId = pid, OrgId = emailqueue.SendFromOrgId, Guid = Guid.NewGuid(), }); } SubmitChanges(); } } var queue = from t in EmailQueueTos where t.Id == emailqueue.Id where t.Sent == null orderby t.PeopleId select t; foreach (var queueTo in queue) { try { if (m.OptOuts != null && m.OptOuts.Any(vv => vv.PeopleId == queueTo.PeopleId && vv.OptOutX == true)) { continue; } var text = m.DoReplacements(queueTo.PeopleId, queueTo); var aa = m.ListAddresses; if (Setting("sendemail", true)) { SendEmail(from, emailqueue.Subject, text, aa, queueTo, cc); queueTo.Sent = Util.Now; SubmitChanges(); } } catch (Exception ex) { var subject = $"sent emails - error:(emailid={emailqueue.Id}) {CmsHost}"; ErrorLog.GetDefault(null).Log(new Error(new Exception(subject, ex))); SendEmail(from, subject, $"{ex.Message}\n{ex.StackTrace}", Util.ToMailAddressList(from), queueTo); } } // Handle CC MailAddresses. These do not get DoReplacement support. if (cc.Count > 0) { foreach (var ma in cc) { try { if (Setting("sendemail", "true") != "false") { List <MailAddress> mal = new List <MailAddress> { ma }; SendEmail(from, emailqueue.Subject, body, mal, emailqueue.Id, cc: cc); } } catch (Exception ex) { var subject = $"sent emails - error:(emailid={emailqueue.Id}) {CmsHost}"; ErrorLog.GetDefault(null).Log(new Error(new Exception(subject, ex))); SendEmail(from, subject, ex.Message, Util.ToMailAddressList(from)); } } } emailqueue.Sent = Util.Now; if (emailqueue.Redacted ?? false) { emailqueue.Body = "redacted"; } else if (emailqueue.Transactional == false) { var nitems = emailqueue.EmailQueueTos.Count(); if (cc.Count > 0) { nitems += cc.Count; } if (nitems > 1) { NotifySentEmails(from.Address, from.DisplayName, emailqueue.Subject, nitems, emailqueue.Id); } } SubmitChanges(); }
public void SendPeopleEmailWithPython(int queueid, IEnumerable <dynamic> recipientData, DynamicData pythonData) { var emailqueue = EmailQueues.Single(ee => ee.Id == queueid); var from = Util.FirstAddress(emailqueue.FromAddr, emailqueue.FromName); if (!emailqueue.Subject.HasValue() || !emailqueue.Body.HasValue()) { SendEmail(from, $"sent emails - error(emailid={emailqueue.Id})", "no subject or body, no emails sent", Util.ToMailAddressList(from), emailqueue.Id); return; } var dict = recipientData.ToDictionary(vv => (int)vv.PeopleId, vv => vv); var body = DoClickTracking(emailqueue); var m = new EmailReplacements(this, body, from, queueid, pythondata: pythonData); emailqueue.Started = Util.Now; SubmitChanges(); var cc = Util.ToMailAddressList(emailqueue.CClist); var q = from to in EmailQueueTos where to.Id == emailqueue.Id where to.Sent == null orderby to.PeopleId select to; foreach (var to in q) { try { if (m.OptOuts != null && m.OptOuts.Any(vv => vv.PeopleId == to.PeopleId && vv.OptOutX == true)) { continue; } if (!dict.ContainsKey(to.PeopleId)) { continue; } var text = m.DoReplacements(to.PeopleId, to); text = RenderTemplate(text, dict[to.PeopleId]); if (text.Contains("<!--SKIP-->")) { continue; } var re = new Regex("<!--SUBJECT:(?<subj>.*)-->"); var subj = re.Match(text).Groups["subj"].Value; var aa = m.ListAddresses; if (Setting("sendemail", "true") != "false") { SendEmail(from, Util.PickFirst(subj, emailqueue.Subject), text, aa, to, cc); to.Sent = Util.Now; SubmitChanges(); } } catch (Exception ex) { var subject = $"sent emails - error:(emailid={emailqueue.Id}) {CmsHost}"; ErrorLog.GetDefault(null).Log(new Error(new Exception(subject, ex))); SendEmail(from, subject, $"{ex.Message}\n{ex.StackTrace}", Util.ToMailAddressList(from), to); } } emailqueue.Sent = Util.Now; var nitems = emailqueue.EmailQueueTos.Count(); if (cc.Count > 0) { nitems += cc.Count; } if (nitems > 1) { NotifySentEmails(from.Address, from.DisplayName, emailqueue.Subject, nitems, emailqueue.Id); } SubmitChanges(); }
public static void RegisterHelpers(CMSDataContext db) { Handlebars.RegisterHelper("BottomBorder", (writer, context, args) => { writer.Write(CssStyle.BottomBorder); }); Handlebars.RegisterHelper("AlignTop", (writer, context, args) => { writer.Write(CssStyle.AlignTop); }); Handlebars.RegisterHelper("AlignRight", (writer, context, args) => { writer.Write(CssStyle.AlignRight); }); Handlebars.RegisterHelper("DataLabelStyle", (writer, context, args) => { writer.Write(CssStyle.DataLabelStyle); }); Handlebars.RegisterHelper("LabelStyle", (writer, context, args) => { writer.Write(CssStyle.LabelStyle); }); Handlebars.RegisterHelper("DataStyle", (writer, context, args) => { writer.Write(CssStyle.DataStyle); }); Handlebars.RegisterHelper("ServerLink", (writer, context, args) => { writer.Write(db.ServerLink().TrimEnd('/')); }); Handlebars.RegisterHelper("FmtZip", (writer, context, args) => { writer.Write(args[0].ToString().FmtZip()); }); Handlebars.RegisterHelper("IfEqual", (writer, options, context, args) => { if (IsEqual(args)) { options.Template(writer, (object)context); } else { options.Inverse(writer, (object)context); } }); Handlebars.RegisterHelper("IfNotEqual", (writer, options, context, args) => { if (!IsEqual(args)) { options.Template(writer, (object)context); } else { options.Inverse(writer, (object)context); } }); Handlebars.RegisterHelper("GetToken", (writer, context, args) => { var s = args[0].ToString(); var n = args[1].ToInt(); var ntoks = args.Length > 2 ? args[2].ToInt() : 2; var sep = args.Length > 3 ? args[3].ToString() : " "; var a = s.SplitStr(sep, ntoks); writer.Write(a[n].trim()); }); // Format helper in form of: {{Fmt value "fmt"}} // ex. {{Fmt Total "C"}} // fmt is required. Uses standard/custom dotnet format strings Handlebars.RegisterHelper("Fmt", (writer, context, args) => { var fmt = $"{{0:{args[1]}}}"; writer.Write(fmt, args[0]); }); // FmtPhone helper in form of: {{FmtPhone phone# "prefix"}} Handlebars.RegisterHelper("FmtPhone", (writer, context, args) => { writer.Write(args[0].ToString().FmtFone($"{args[1]}")); }); Handlebars.RegisterHelper("ReplaceCode", (writer, context, args) => { EmailReplacements r = context.Replacements as EmailReplacements ?? (context.Replacements = new EmailReplacements(db)); var code = args[0].ToString(); var p = db.LoadPersonById(args[1].ToInt()); int?oid = null; if (args.Length == 3) { oid = args[2].ToInt2(); } writer.Write(r.RenderCode(code, p, oid)); }); }
public void SendPersonEmail(int id, int pid) { var sysFromEmail = Util.SysFromEmail; var emailqueue = EmailQueues.Single(eq => eq.Id == id); var emailqueueto = EmailQueueTos.Single(eq => eq.Id == id && eq.PeopleId == pid); var fromname = emailqueueto.EmailQueue.FromName; fromname = !fromname.HasValue() ? emailqueue.FromAddr : emailqueue.FromName.Replace("\"", ""); var from = Util.FirstAddress(emailqueue.FromAddr, fromname); try { var p = LoadPersonById(emailqueueto.PeopleId); var m = new EmailReplacements(this, emailqueue.Body, from); var text = m.DoReplacements(p, emailqueueto); var aa = m.ListAddresses; if (Setting("sendemail", "true") != "false") { if (aa.Count > 0) Util.SendMsg(sysFromEmail, CmsHost, from, emailqueue.Subject, text, aa, emailqueue.Id, pid); else Util.SendMsg(sysFromEmail, CmsHost, from, "(no email address) " + emailqueue.Subject, "<p style='color:red'>You are receiving this because there is no email address for {0}({1}). You should probably contact them since they were probably expecting this information.</p>\n{2}".Fmt(p.Name, p.PeopleId, text), Util.ToMailAddressList(from), emailqueue.Id, pid); emailqueueto.Sent = DateTime.Now; emailqueue.Sent = DateTime.Now; if (emailqueue.Redacted ?? false) emailqueue.Body = "redacted"; SubmitChanges(); } } catch (Exception ex) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error", ex.ToString(), Util.ToMailAddressList(from), emailqueue.Id, null); throw; } }
public void SendPeopleEmail(int queueid) { var emailqueue = EmailQueues.Single(ee => ee.Id == queueid); var sysFromEmail = Util.SysFromEmail; var from = Util.FirstAddress(emailqueue.FromAddr, emailqueue.FromName); if (!emailqueue.Subject.HasValue() || !emailqueue.Body.HasValue()) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error", "no subject or body, no emails sent", Util.ToMailAddressList(from), emailqueue.Id, null); return; } var m = new EmailReplacements(this, emailqueue.Body, from); emailqueue.Started = DateTime.Now; SubmitChanges(); var q = from To in EmailQueueTos where To.Id == emailqueue.Id where To.Sent == null orderby To.PeopleId select To; foreach (var To in q) { #if DEBUG #else try { #endif var p = LoadPersonById(To.PeopleId); var text = m.DoReplacements(p, To); var aa = m.ListAddresses; if (Setting("sendemail", "true") != "false") { Util.SendMsg(sysFromEmail, CmsHost, from, emailqueue.Subject, text, aa, emailqueue.Id, To.PeopleId); To.Sent = DateTime.Now; SubmitChanges(); } #if DEBUG #else } catch (Exception ex) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error: {0}".Fmt(CmsHost), ex.Message, Util.ToMailAddressList(from), emailqueue.Id, null); Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error: {0}".Fmt(CmsHost), ex.Message, Util.SendErrorsTo(), emailqueue.Id, null); } #endif } emailqueue.Sent = DateTime.Now; if (emailqueue.Redacted ?? false) { emailqueue.Body = "redacted"; } else if (emailqueue.Transactional == false) { var nitems = emailqueue.EmailQueueTos.Count(); if (nitems > 1) { NotifySentEmails(from.Address, from.DisplayName, emailqueue.Subject, nitems, emailqueue.Id); } } SubmitChanges(); }
public void SendPeopleEmail(int queueid) { var emailqueue = EmailQueues.Single(ee => ee.Id == queueid); var sysFromEmail = Util.SysFromEmail; var from = Util.FirstAddress(emailqueue.FromAddr, emailqueue.FromName); if (!emailqueue.Subject.HasValue() || !emailqueue.Body.HasValue()) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error", "no subject or body, no emails sent", Util.ToMailAddressList(from), emailqueue.Id, null); return; } var body = DoClickTracking(emailqueue); var m = new EmailReplacements(this, body, from); emailqueue.Started = DateTime.Now; SubmitChanges(); if (emailqueue.SendFromOrgId.HasValue) { var q2 = from om in OrganizationMembers where om.OrganizationId == emailqueue.SendFromOrgId where om.MemberTypeId != MemberTypeCode.InActive where om.MemberTypeId != MemberTypeCode.Prospect where (om.Pending ?? false) == false let p = om.Person where p.EmailAddress != null where p.EmailAddress != "" where (p.SendEmailAddress1 ?? true) || (p.SendEmailAddress2 ?? false) select om.PeopleId; foreach (var pid in q2) { emailqueue.EmailQueueTos.Add(new EmailQueueTo { PeopleId = pid, OrgId = emailqueue.SendFromOrgId, Guid = Guid.NewGuid(), }); } SubmitChanges(); } var q = from To in EmailQueueTos where To.Id == emailqueue.Id where To.Sent == null orderby To.PeopleId select To; foreach (var To in q) { #if DEBUG #else try { #endif var p = LoadPersonById(To.PeopleId); var text = m.DoReplacements(p, To); var aa = m.ListAddresses; if (Setting("sendemail", "true") != "false") { Util.SendMsg(sysFromEmail, CmsHost, from, emailqueue.Subject, text, aa, emailqueue.Id, To.PeopleId); To.Sent = DateTime.Now; SubmitChanges(); } #if DEBUG #else } catch (Exception ex) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error: {0}".Fmt(CmsHost), ex.Message, Util.ToMailAddressList(from), emailqueue.Id, null); Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error: {0}".Fmt(CmsHost), ex.Message, Util.SendErrorsTo(), emailqueue.Id, null); } #endif } emailqueue.Sent = DateTime.Now; if (emailqueue.Redacted ?? false) { emailqueue.Body = "redacted"; } else if (emailqueue.Transactional == false) { var nitems = emailqueue.EmailQueueTos.Count(); if (nitems > 1) { NotifySentEmails(from.Address, from.DisplayName, emailqueue.Subject, nitems, emailqueue.Id); } } SubmitChanges(); }
public static IHandlebars RegisterHelpers(CMSDataContext db, PythonModel pm = null, IHandlebars handlebars = null) { handlebars = handlebars ?? Handlebars.Create(); handlebars.RegisterHelper("BottomBorder", (writer, context, args) => { writer.Write(CssStyle.BottomBorder); }); handlebars.RegisterHelper("AlignTop", (writer, context, args) => { writer.Write(CssStyle.AlignTop); }); handlebars.RegisterHelper("AlignRight", (writer, context, args) => { writer.Write(CssStyle.AlignRight); }); handlebars.RegisterHelper("DataLabelStyle", (writer, context, args) => { writer.Write(CssStyle.DataLabelStyle); }); handlebars.RegisterHelper("LabelStyle", (writer, context, args) => { writer.Write(CssStyle.LabelStyle); }); handlebars.RegisterHelper("DataStyle", (writer, context, args) => { writer.Write(CssStyle.DataStyle); }); handlebars.RegisterHelper("ServerLink", (writer, context, args) => { writer.Write(db.ServerLink().TrimEnd('/')); }); handlebars.RegisterHelper("FmtZip", (writer, context, args) => { writer.Write(args[0].ToString().FmtZip()); }); handlebars.RegisterHelper("HtmlComment", (writer, context, args) => { #if DEBUG writer.Write($"<h6>{args[0].ToString()} {args[1].ToString()}</h6>"); #else writer.Write($"<!--{args[0].ToString()} {args[1].ToString()}-->"); #endif }); handlebars.RegisterHelper("IfEqual", (writer, options, context, args) => { if (IsEqual(args)) { options.Template(writer, (object)context); } else { options.Inverse(writer, (object)context); } }); handlebars.RegisterHelper("IfNotEqual", (writer, options, context, args) => { if (!IsEqual(args)) { options.Template(writer, (object)context); } else { options.Inverse(writer, (object)context); } }); handlebars.RegisterHelper("IfCond", (writer, options, context, args) => { var op = HttpUtility.HtmlDecode(args[1].ToString()); bool b = false; switch (op) { case "==": b = Compare(args) == 0; break; case "!=": b = Compare(args) != 0; break; case "<": b = Compare(args) < 0; break; case ">": b = Compare(args) > 0; break; case ">=": b = Compare(args) >= 0; break; case "<=": b = Compare(args) <= 0; break; case "&&": b = NumTrue(args) == 2; break; case "||": b = NumTrue(args) >= 1; break; } if (b) { options.Template(writer, (object)context); } else { options.Inverse(writer, (object)context); } }); handlebars.RegisterHelper("IfGT", (writer, options, context, args) => { if (Compare2(args) > 0) { options.Template(writer, (object)context); } else { options.Inverse(writer, (object)context); } }); handlebars.RegisterHelper("IfLT", (writer, options, context, args) => { if (Compare2(args) < 0) { options.Template(writer, (object)context); } else { options.Inverse(writer, (object)context); } }); handlebars.RegisterHelper("IfGE", (writer, options, context, args) => { if (Compare2(args) <= 0) { options.Template(writer, (object)context); } else { options.Inverse(writer, (object)context); } }); handlebars.RegisterHelper("IfLE", (writer, options, context, args) => { if (Compare2(args) <= 0) { options.Template(writer, (object)context); } else { options.Inverse(writer, (object)context); } }); handlebars.RegisterHelper("GetToken", (writer, context, args) => { var s = args[0].ToString(); var n = args[1].ToInt(); var ntoks = args.Length > 2 ? args[2].ToInt() : 2; var sep = args.Length > 3 ? args[3].ToString() : " "; var a = s.SplitStr(sep, ntoks); writer.Write(a[n]?.Trim() ?? ""); }); handlebars.RegisterHelper("FmtMDY", (writer, context, args) => { DateTime dt; var s = args[0].ToString(); if (DateTime.TryParse(s, out dt)) { writer.Write(dt.ToShortDateString()); } }); handlebars.RegisterHelper("FmtDate", (writer, context, args) => { DateTime dt; var s = args[0].ToString(); if (DateTime.TryParse(s, out dt)) { writer.Write(dt.ToShortDateString()); } }); handlebars.RegisterHelper("FmtMoney", (writer, context, args) => { decimal d; var s = args[0].ToString(); if (decimal.TryParse(s, out d)) { writer.Write(d.ToString("C")); } }); // Format helper in form of: {{Fmt value "fmt"}} // ex. {{Fmt Total "C"}} // fmt is required. Uses standard/custom dotnet format strings handlebars.RegisterHelper("Fmt", (writer, context, args) => { var fmt = $"{{0:{args[1]}}}"; writer.Write(fmt, args[0]); }); // FmtPhone helper in form of: {{FmtPhone phone# "prefix"}} handlebars.RegisterHelper("FmtPhone", (writer, context, args) => { writer.Write(args[0].ToString().FmtFone($"{args[1]}")); }); handlebars.RegisterHelper("ReplaceCode", (writer, context, args) => { EmailReplacements r = context.Replacements as EmailReplacements ?? (context.Replacements = new EmailReplacements(db)); var code = args[0].ToString(); var p = db.LoadPersonById(args[1].ToInt()); int?oid = null; if (args.Length == 3) { oid = args[2].ToInt2(); } writer.Write(r.RenderCode(code, p, oid)); }); handlebars.RegisterHelper("Json", (writer, options, context, args) => { dynamic a = JsonDeserialize2(args[0].ToString()); foreach (var item in a) { options.Template(writer, item); } }); handlebars.RegisterHelper("Calc", (writer, context, args) => { var calcAmt = args[0].ToDouble() - args[1].ToDouble(); var calcAmtfmt = $"{{0:{'c'}}}"; writer.Write(calcAmtfmt, calcAmt); }); handlebars.RegisterHelper("ThrowError", (writer, context, args) => { throw new Exception("ThrowError called in Handlebars Helper"); }); return(handlebars); }
public void SendPeopleEmail(int queueid) { var emailqueue = EmailQueues.Single(ee => ee.Id == queueid); var sysFromEmail = Util.SysFromEmail; var from = Util.FirstAddress(emailqueue.FromAddr, emailqueue.FromName); if (!emailqueue.Subject.HasValue() || !emailqueue.Body.HasValue()) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error", "no subject or body, no emails sent", Util.ToMailAddressList(from), emailqueue.Id, null); return; } var body = DoClickTracking(emailqueue); var m = new EmailReplacements(this, body, from); emailqueue.Started = DateTime.Now; SubmitChanges(); var cc = Util.ToMailAddressList(emailqueue.CClist); if (emailqueue.SendFromOrgId.HasValue) { var q2 = from om in OrganizationMembers where om.OrganizationId == emailqueue.SendFromOrgId where om.MemberTypeId != MemberTypeCode.InActive where om.MemberTypeId != MemberTypeCode.Prospect where (om.Pending ?? false) == false let p = om.Person where p.EmailAddress != null where p.EmailAddress != "" where (p.SendEmailAddress1 ?? true) || (p.SendEmailAddress2 ?? false) where p.EmailOptOuts.All(oo => oo.FromEmail != emailqueue.FromAddr) select om.PeopleId; foreach (var pid in q2) { // Protect against duplicate PeopleIDs ending up in the queue if(emailqueue.EmailQueueTos.Any(pp => pp.PeopleId == pid)) continue; emailqueue.EmailQueueTos.Add(new EmailQueueTo { PeopleId = pid, OrgId = emailqueue.SendFromOrgId, Guid = Guid.NewGuid(), }); } SubmitChanges(); } var q = from To in EmailQueueTos where To.Id == emailqueue.Id where To.Sent == null orderby To.PeopleId select To; foreach (var To in q) { #if DEBUG #else try { #endif var text = m.DoReplacements(To.PeopleId, To); var aa = m.ListAddresses; if (Setting("sendemail", "true") != "false") { Util.SendMsg(sysFromEmail, CmsHost, from, emailqueue.Subject, text, aa, emailqueue.Id, To.PeopleId, cc: cc); To.Sent = DateTime.Now; SubmitChanges(); } #if DEBUG #else } catch (Exception ex) { Util.SendMsg(sysFromEmail, CmsHost, from, $"sent emails - error: {CmsHost}", ex.Message, Util.ToMailAddressList(from), emailqueue.Id, null); Util.SendMsg(sysFromEmail, CmsHost, from, $"sent emails - error: {CmsHost}", ex.Message, Util.SendErrorsTo(), emailqueue.Id, null); } #endif } // Handle CC MailAddresses. These do not get DoReplacement support. if (cc.Count > 0) { foreach (var ma in cc) { #if DEBUG #else try { #endif if (Setting("sendemail", "true") != "false") { List<MailAddress> mal = new List<MailAddress> {ma}; Util.SendMsg(sysFromEmail, CmsHost, from, emailqueue.Subject, body, mal, emailqueue.Id, null, cc: cc); } #if DEBUG #else } catch (Exception ex) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error: " + CmsHost, ex.Message, Util.ToMailAddressList(from), emailqueue.Id, null); Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error: " + CmsHost, ex.Message, Util.SendErrorsTo(), emailqueue.Id, null); } #endif } } emailqueue.Sent = DateTime.Now; if (emailqueue.Redacted ?? false) emailqueue.Body = "redacted"; else if (emailqueue.Transactional == false) { var nitems = emailqueue.EmailQueueTos.Count(); if (cc.Count > 0) { nitems += cc.Count; } if (nitems > 1) NotifySentEmails(from.Address, from.DisplayName, emailqueue.Subject, nitems, emailqueue.Id); } SubmitChanges(); }
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; }
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 void SendPeopleEmail(int queueid) { var emailqueue = EmailQueues.Single(ee => ee.Id == queueid); var sysFromEmail = Util.SysFromEmail; var from = Util.FirstAddress(emailqueue.FromAddr, emailqueue.FromName); if (!emailqueue.Subject.HasValue() || !emailqueue.Body.HasValue()) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error", "no subject or body, no emails sent", Util.ToMailAddressList(from), emailqueue.Id, null); return; } var body = DoClickTracking(emailqueue); var m = new EmailReplacements(this, body, from); emailqueue.Started = DateTime.Now; SubmitChanges(); var cc = Util.ToMailAddressList(emailqueue.CClist); if (emailqueue.SendFromOrgId.HasValue) { var q2 = from om in OrganizationMembers where om.OrganizationId == emailqueue.SendFromOrgId where om.MemberTypeId != MemberTypeCode.InActive where om.MemberTypeId != MemberTypeCode.Prospect where (om.Pending ?? false) == false let p = om.Person where p.EmailAddress != null where p.EmailAddress != "" where (p.SendEmailAddress1 ?? true) || (p.SendEmailAddress2 ?? false) where p.EmailOptOuts.All(oo => oo.FromEmail != emailqueue.FromAddr) select om.PeopleId; foreach (var pid in q2) { // Protect against duplicate PeopleIDs ending up in the queue if (emailqueue.EmailQueueTos.Any(pp => pp.PeopleId == pid)) { continue; } emailqueue.EmailQueueTos.Add(new EmailQueueTo { PeopleId = pid, OrgId = emailqueue.SendFromOrgId, Guid = Guid.NewGuid(), }); } SubmitChanges(); } var q = from To in EmailQueueTos where To.Id == emailqueue.Id where To.Sent == null orderby To.PeopleId select To; foreach (var To in q) { #if DEBUG #else try { #endif var text = m.DoReplacements(To.PeopleId, To); var aa = m.ListAddresses; if (Setting("sendemail", "true") != "false") { Util.SendMsg(sysFromEmail, CmsHost, from, emailqueue.Subject, text, aa, emailqueue.Id, To.PeopleId, cc: cc); To.Sent = DateTime.Now; SubmitChanges(); } #if DEBUG #else } catch (Exception ex) { Util.SendMsg(sysFromEmail, CmsHost, from, $"sent emails - error: {CmsHost}", ex.Message, Util.ToMailAddressList(from), emailqueue.Id, null); Util.SendMsg(sysFromEmail, CmsHost, from, $"sent emails - error: {CmsHost}", ex.Message, Util.SendErrorsTo(), emailqueue.Id, null); } #endif } // Handle CC MailAddresses. These do not get DoReplacement support. if (cc.Count > 0) { foreach (var ma in cc) { #if DEBUG #else try { #endif if (Setting("sendemail", "true") != "false") { List <MailAddress> mal = new List <MailAddress> { ma }; Util.SendMsg(sysFromEmail, CmsHost, from, emailqueue.Subject, body, mal, emailqueue.Id, null, cc: cc); } #if DEBUG #else } catch (Exception ex) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error: " + CmsHost, ex.Message, Util.ToMailAddressList(from), emailqueue.Id, null); Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error: " + CmsHost, ex.Message, Util.SendErrorsTo(), emailqueue.Id, null); } #endif } } emailqueue.Sent = DateTime.Now; if (emailqueue.Redacted ?? false) { emailqueue.Body = "redacted"; } else if (emailqueue.Transactional == false) { var nitems = emailqueue.EmailQueueTos.Count(); if (cc.Count > 0) { nitems += cc.Count; } if (nitems > 1) { NotifySentEmails(from.Address, from.DisplayName, emailqueue.Subject, nitems, emailqueue.Id); } } SubmitChanges(); }
public int DoGiving(CMSDataContext db) { var total = (from a in db.RecurringAmounts where a.PeopleId == PeopleId where a.ContributionFund.FundStatusId == 1 where a.ContributionFund.OnlineSort != null select a.Amt).Sum(); if (!total.HasValue || total == 0) { return(0); } var paymentInfo = db.PaymentInfos.Single(x => x.PeopleId == PeopleId); var preferredType = paymentInfo.PreferredGivingType; var gw = GetGateway(db, paymentInfo); var t = new Transaction { TransactionDate = DateTime.Now, TransactionId = "started", First = Person.FirstName, MiddleInitial = Person.MiddleName.Truncate(1) ?? "", Last = Person.LastName, Suffix = Person.SuffixCode, Amt = total, Description = "Recurring Giving", Testing = false, TransactionGateway = gw.GatewayType, Financeonly = true, PaymentType = preferredType, LastFourCC = preferredType == PaymentType.CreditCard ? paymentInfo.MaskedCard.Last(4) : null, LastFourACH = preferredType == PaymentType.Ach ? paymentInfo.MaskedAccount.Last(4) : null }; db.Transactions.InsertOnSubmit(t); db.SubmitChanges(); var ret = gw.PayWithVault(PeopleId, total ?? 0, "Recurring Giving", t.Id, preferredType); t.Message = ret.Message; t.AuthCode = ret.AuthCode; t.Approved = ret.Approved; t.TransactionId = ret.TransactionId; var systemEmail = db.Setting("SystemEmailAddress", "*****@*****.**"); var contributionemail = (from ex in Person.PeopleExtras where ex.Field == "ContributionEmail" select ex.Data).SingleOrDefault(); if (contributionemail.HasValue()) { contributionemail = contributionemail.Trim(); } if (!Util.ValidEmail(contributionemail)) { contributionemail = Person.FromEmail; } var gift = db.Setting("NameForPayment", "gift"); var church = db.Setting("NameOfChurch", db.CmsHost); var q = from a in db.RecurringAmounts where a.PeopleId == PeopleId select a; var tot = q.Where(aa => aa.ContributionFund.FundStatusId == 1).Sum(aa => aa.Amt); t.TransactionPeople.Add(new TransactionPerson { PeopleId = Person.PeopleId, Amt = tot, }); if (ret.Approved) { foreach (var a in q) { if (a.ContributionFund.FundStatusId == 1 && a.ContributionFund.OnlineSort != null && a.Amt > 0) { Person.PostUnattendedContribution(db, a.Amt ?? 0, a.FundId, "Recurring Giving", tranid: t.Id); } } NextDate = FindNextDate(Util.Now.Date.AddDays(1)); db.SubmitChanges(); if (tot > 0) { var msg = db.Content("RecurringGiftNotice") ?? new Content { Title = $"Recurring {gift} for {{church}}", Body = "Your payment of {total} was processed this morning." }; var subject = msg.Title.Replace("{church}", church); var body = msg.Body.Replace("{total}", $"${tot:N2}"); var from = Util.TryGetMailAddress(contributionemail); var m = new EmailReplacements(db, body, from); body = m.DoReplacements(db, Person); Util.SendMsg(systemEmail, db.CmsHost, from, subject, body, Util.ToMailAddressList(contributionemail), 0, Person.PeopleId); } } else { db.SubmitChanges(); var msg = db.Content("RecurringGiftFailedNotice") ?? new Content { Title = $"Recurring {gift} for {{church}} did not succeed", Body = @"Your payment of {total} failed to process this morning.<br> The message was '{message}'. Please contact the Finance office at the church." }; var subject = msg.Title.Replace("{church}", church); var body = msg.Body.Replace("{total}", $"${tot:N2}") .Replace("{message}", ret.Message); var from = Util.TryGetMailAddress(contributionemail); var m = new EmailReplacements(db, body, from); body = m.DoReplacements(db, Person); var adminEmail = db.Setting("AdminMail", systemEmail); Util.SendMsg(systemEmail, db.CmsHost, from, subject, body, Util.ToMailAddressList(contributionemail), 0, Person.PeopleId); foreach (var p in db.RecurringGivingNotifyPersons()) { Util.SendMsg(systemEmail, db.CmsHost, Util.TryGetMailAddress(adminEmail), "Recurring Giving Failed on " + db.CmsHost, $"<a href='{db.CmsHost}/Transactions/{t.Id}'>message: {ret.Message}, tranid:{t.Id}</a>", Util.ToMailAddressList(p.EmailAddress), 0, Person.PeopleId); } } return(1); }
public void SendPeopleEmail(int queueid) { var emailqueue = EmailQueues.Single(ee => ee.Id == queueid); var sysFromEmail = Util.SysFromEmail; var from = Util.FirstAddress(emailqueue.FromAddr, emailqueue.FromName); if (!emailqueue.Subject.HasValue() || !emailqueue.Body.HasValue()) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error", "no subject or body, no emails sent", Util.ToMailAddressList(from), emailqueue.Id, null); return; } var m = new EmailReplacements(this, emailqueue.Body, from); emailqueue.Started = DateTime.Now; SubmitChanges(); var q = from To in EmailQueueTos where To.Id == emailqueue.Id where To.Sent == null orderby To.PeopleId select To; foreach (var To in q) { #if DEBUG #else try { #endif var p = LoadPersonById(To.PeopleId); var text = m.DoReplacements(p, To); var aa = m.ListAddresses; if (Setting("sendemail", "true") != "false") { Util.SendMsg(sysFromEmail, CmsHost, from, emailqueue.Subject, text, aa, emailqueue.Id, To.PeopleId); To.Sent = DateTime.Now; SubmitChanges(); } #if DEBUG #else } catch (Exception ex) { Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error: {0}".Fmt(CmsHost), ex.Message, Util.ToMailAddressList(from), emailqueue.Id, null); Util.SendMsg(sysFromEmail, CmsHost, from, "sent emails - error: {0}".Fmt(CmsHost), ex.Message, Util.SendErrorsTo(), emailqueue.Id, null); } #endif } emailqueue.Sent = DateTime.Now; if (emailqueue.Redacted ?? false) emailqueue.Body = "redacted"; else if (emailqueue.Transactional == false) { var nitems = emailqueue.EmailQueueTos.Count(); if (nitems > 1) NotifySentEmails(from.Address, from.DisplayName, emailqueue.Subject, nitems, emailqueue.Id); } SubmitChanges(); }