static public BasicMailTemplate GetBestMatch (string templateName, string language, string country, Organization org) { List<BasicMailTemplate> tmplList = GetCachedTemplates(templateName); Organizations orgLine = ( org != null) ? org.GetLine() : new Organizations(); int[] lineIDs = orgLine.Identities; List<int> idlist = new List<int>(lineIDs); BasicMailTemplate templateDefault = null; BasicMailTemplate countryDefault = null; BasicMailTemplate bestSofar = null; int bestIndex = -1; foreach (BasicMailTemplate bmt in tmplList) { int thisIndex = idlist.IndexOf(bmt.OrganizationId); if (thisIndex > bestIndex) { bestIndex = thisIndex; bestSofar = bmt; } else if (bmt.CountryCode.ToUpper() == country && bmt.OrganizationId < 1) { countryDefault = bmt; } else if (bmt.CountryCode == "" && bmt.OrganizationId < 1) { templateDefault = bmt; } } if (bestSofar != null) return bestSofar; else if (countryDefault != null) return countryDefault; else if (templateDefault != null) return templateDefault; else return null; }
public static string CreateWelcomeMail (Person person, Organization organization) { // for this person, iterate over all applicable geographies and organizations Organizations orgLine = organization.GetLine(); Geographies geoLine = person.Geography.GetLine(); orgLine.Reverse(); // Start at the most local org Dictionary<int,bool> orgMailedLookup = new Dictionary<int, bool>(); int delay = 0; string result = string.Empty; Random random = new Random(); foreach (Organization org in orgLine) { foreach (Geography geo in geoLine) // but at the top geography { AutoMail autoMail = AutoMail.FromTypeOrganizationAndGeography(AutoMailType.Welcome, org, geo); if (autoMail == null) { continue; } Person lead = null; string geoName = geo.Name; try { lead = Roles.GetLocalLead(org, geo); orgMailedLookup[org.Identity] = true; // Make sure that the chairman doesn't mail at a lower level } catch (ArgumentException) { } if (lead == null && !orgMailedLookup.ContainsKey(org.Identity)) { // If we get here, there is a mail template at the highest possible geo for this org, but no local lead. // That's usually the case with board-centric organizations rather than executive-centric. // Try to mail from chairman rather than the local lead. try { orgMailedLookup[org.Identity] = true; lead = Roles.GetChairman(org); geoName = "Chairman"; } catch (ArgumentException) { } } if (lead == null) { // ok, give up if there isn't a chairman either or if we've already mailed this org from the chairman continue; } // TODO: fetch lead from roles WelcomeMail welcomemail = new WelcomeMail(); welcomemail.pOrgName = org.MailPrefixInherited; welcomemail.pGeographyName = ""; if (geo.Identity != Geography.RootIdentity) { welcomemail.pGeographyName = geo.Name; } welcomemail.pBodyContent = autoMail.Body; welcomemail.pSubject = autoMail.Title; OutboundMail newMail = welcomemail.CreateOutboundMail (lead, OutboundMail.PriorityNormal, org, geo, DateTime.Now.AddMinutes(delay)); newMail.AddRecipient(person.Identity, false); newMail.SetRecipientCount(1); newMail.SetResolved(); newMail.SetReadyForPickup(); result += String.Format(" - {0}/{1} by {2} (", org.NameShort, geoName, lead.Canonical); if (delay == 0) { result += "sent now"; delay += 37; } else { result += "sending at " + DateTime.Now.AddMinutes(delay).ToString("HH:mm"); delay += 31 + random.Next(52); } result += ")\r\n"; } } if (result.Length < 4) { result = "none\r\n"; } return result; }