Example #1
0
 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);
     }
 }
Example #2
0
 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));
     }
 }
Example #3
0
        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);
        }
Example #4
0
        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;
            }
        }
Example #5
0
 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));
     }
 }
Example #6
0
 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();
 }
Example #7
0
        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);
        }
Example #8
0
 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);
 }
Example #9
0
        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;
        }
Example #10
0
 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));
 }
Example #11
0
        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);
        }
Example #12
0
 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);
     }
 }
Example #13
0
        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();
        }
Example #14
0
        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();
        }
Example #15
0
        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));
            });
        }
Example #16
0
        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;
            }
        }
Example #17
0
        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();
        }
Example #18
0
        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();
        }
Example #19
0
        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);
        }
Example #20
0
        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();
        }
Example #21
0
        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;
        }
Example #22
0
        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;
        }
Example #23
0
        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();
        }
Example #24
0
        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);
        }
Example #25
0
        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();
        }