Как в БП реализовать цикл по сборке данных из справочников и отправку всех этих данных одним письмом
Доброго времени суток, коллеги!
Возникла необходимость собирать несколько записей из справочников и затем все эти данные отправлять одним письмом в виде таблицы.
Какие есть варианты решения данного вопроса и можно ли это сделать стандартными средствами предоставляемые Studio?
Заранее спасибо!
Нравится
Mykhailo Kozlenko,
Добрый день.
Можно в элементе 'Задание-сценарий' сформировать таблицу, которую нужно отправлять, и записать её в параметр бизнес-процесса. Например, я делала вот таким образом:
const string quote = "\"";
const string siteRef = "http://site_name";
var userConnection = Get<UserConnection>("UserConnection");
var softwareInventoryTableHTML = String.Empty;
var esqSoftwareInventory = new EntitySchemaQuery(userConnection.EntitySchemaManager, "SoftwareInventory");
esqSoftwareInventory.AddColumn("Id");
esqSoftwareInventory.AddColumn("Number");
esqSoftwareInventory.AddColumn("Software.Name");
esqSoftwareInventory.AddColumn("LicenseKey.Name");
var expirationDateColumn = esqSoftwareInventory.AddColumn("LicenseExpirationDate");
expirationDateColumn.OrderDirection = OrderDirection.Ascending;
expirationDateColumn.OrderPosition = 1;
esqSoftwareInventory.AddColumn("Equipment.Name");
esqSoftwareInventory.AddColumn("Equipment.Id");
esqSoftwareInventory.Filters.Add(esqSoftwareInventory.CreateFilterWithParameters(FilterComparisonType.Equal,
"LicenseStatus", new Guid("CDD71003-D5BB-43E7-8E06-280FE40BEBF8")));
DateTime dueDate = DateTime.Today.AddMonths(2);
esqSoftwareInventory.Filters.Add(esqSoftwareInventory.CreateFilterWithParameters(FilterComparisonType.Less,
"LicenseExpirationDate", dueDate));
var softwareInventories = esqSoftwareInventory.GetEntityCollection(userConnection);
if (softwareInventories.Count > 0)
{
var htmlTableBuilder = new StringBuilder();
htmlTableBuilder.AppendLine("<table border='1' width='100%' cellpadding='5'>");
var headerSB = new StringBuilder();
headerSB.Append("<tr>");
string[] columnNames = { "Номер", "Программное обеспечение", "Лицензионный ключ", "Дата окончания лицензии",
"Оборудование" };
foreach (string columnName in columnNames)
{
headerSB.Append("<td>" + columnName + "</td>");
}
headerSB.Append("</tr>");
htmlTableBuilder.AppendLine(headerSB.ToString());
foreach (var softwareInventory in softwareInventories)
{
var rowSB = new StringBuilder();
rowSB.Append("<tr>");
string Number = softwareInventory.GetTypedColumnValue<string>("Number");
Guid recordId = softwareInventory.GetTypedColumnValue<Guid>("Id1");
string softwareInventoryRef = siteRef + "/0/Nui/ViewModule.aspx#CardModuleV2/SoftwareInventory1Page/edit/" +
recordId.ToString();
string inventoryNumberRef = "<a href=" + quote + softwareInventoryRef + quote +">" + Number + "</a>";
rowSB.Append("<td width=\"44\">" + inventoryNumberRef + "</td>");
rowSB.Append("<td width=\"120\">" + softwareInventory.GetTypedColumnValue<string>("Software_Name") + "</td>");
string licenseKey = softwareInventory.GetTypedColumnValue<string>("LicenseKey_Name");
int licenseKeyLength = licenseKey.Length;
int indexStr = 8;
if (licenseKeyLength <= 8)
{
indexStr = licenseKeyLength;
}
rowSB.Append("<td width=\"110\">" + licenseKey.Substring(0, indexStr) + "</td>");
DateTime licenseExpirationDate = softwareInventory.GetTypedColumnValue<DateTime>(expirationDateColumn.Name);
string licenseExpirationDateStr = "";
if (licenseExpirationDate != DateTime.MinValue) {
licenseExpirationDateStr = licenseExpirationDate.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
}
rowSB.Append("<td width=\"83\">" + licenseExpirationDateStr + "</td>");
rowSB.Append("<td width=\"106\">" + softwareInventory.GetTypedColumnValue<string>("Equipment_Name") + "</td>");
rowSB.Append("</tr>");
htmlTableBuilder.AppendLine(rowSB.ToString());
}
htmlTableBuilder.AppendLine("</table>");
softwareInventoryTableHTML = htmlTableBuilder.ToString();
}
Set<string>("SoftwareInventoryTableHTML", softwareInventoryTableHTML);
return true;А потом этот параметр бизнес-процесса использовать в элементе 'Отправить email' в качестве макроса:
Обратите внимание, по данному программному обеспечению истек срок действия лицензии либо истечет в ближайшее время.
Пожалуйста, актуализируйте в срм информацию по этому ПО:
[#Software inventory table#]
С уважением,
Системный администратор crm
P.S. В скрипте, приведенном выше, ещё и гиперссылки на карточки сущностей в срм формируются.
Добрый день.
Вы можете использовать бесплатное дополнение, которое позволяет встраивать таблицу с данными в e-mail сообщение, отправляемое из бизнес-процесса.
Добрый! Кроме данного дополнения больше никаких вариантов нет? Ибо при попытке работать с данным расширением оказалось, что оно не совсем рабочее.
Mykhailo Kozlenko,
Добрый день.
Можно в элементе 'Задание-сценарий' сформировать таблицу, которую нужно отправлять, и записать её в параметр бизнес-процесса. Например, я делала вот таким образом:
const string quote = "\"";
const string siteRef = "http://site_name";
var userConnection = Get<UserConnection>("UserConnection");
var softwareInventoryTableHTML = String.Empty;
var esqSoftwareInventory = new EntitySchemaQuery(userConnection.EntitySchemaManager, "SoftwareInventory");
esqSoftwareInventory.AddColumn("Id");
esqSoftwareInventory.AddColumn("Number");
esqSoftwareInventory.AddColumn("Software.Name");
esqSoftwareInventory.AddColumn("LicenseKey.Name");
var expirationDateColumn = esqSoftwareInventory.AddColumn("LicenseExpirationDate");
expirationDateColumn.OrderDirection = OrderDirection.Ascending;
expirationDateColumn.OrderPosition = 1;
esqSoftwareInventory.AddColumn("Equipment.Name");
esqSoftwareInventory.AddColumn("Equipment.Id");
esqSoftwareInventory.Filters.Add(esqSoftwareInventory.CreateFilterWithParameters(FilterComparisonType.Equal,
"LicenseStatus", new Guid("CDD71003-D5BB-43E7-8E06-280FE40BEBF8")));
DateTime dueDate = DateTime.Today.AddMonths(2);
esqSoftwareInventory.Filters.Add(esqSoftwareInventory.CreateFilterWithParameters(FilterComparisonType.Less,
"LicenseExpirationDate", dueDate));
var softwareInventories = esqSoftwareInventory.GetEntityCollection(userConnection);
if (softwareInventories.Count > 0)
{
var htmlTableBuilder = new StringBuilder();
htmlTableBuilder.AppendLine("<table border='1' width='100%' cellpadding='5'>");
var headerSB = new StringBuilder();
headerSB.Append("<tr>");
string[] columnNames = { "Номер", "Программное обеспечение", "Лицензионный ключ", "Дата окончания лицензии",
"Оборудование" };
foreach (string columnName in columnNames)
{
headerSB.Append("<td>" + columnName + "</td>");
}
headerSB.Append("</tr>");
htmlTableBuilder.AppendLine(headerSB.ToString());
foreach (var softwareInventory in softwareInventories)
{
var rowSB = new StringBuilder();
rowSB.Append("<tr>");
string Number = softwareInventory.GetTypedColumnValue<string>("Number");
Guid recordId = softwareInventory.GetTypedColumnValue<Guid>("Id1");
string softwareInventoryRef = siteRef + "/0/Nui/ViewModule.aspx#CardModuleV2/SoftwareInventory1Page/edit/" +
recordId.ToString();
string inventoryNumberRef = "<a href=" + quote + softwareInventoryRef + quote +">" + Number + "</a>";
rowSB.Append("<td width=\"44\">" + inventoryNumberRef + "</td>");
rowSB.Append("<td width=\"120\">" + softwareInventory.GetTypedColumnValue<string>("Software_Name") + "</td>");
string licenseKey = softwareInventory.GetTypedColumnValue<string>("LicenseKey_Name");
int licenseKeyLength = licenseKey.Length;
int indexStr = 8;
if (licenseKeyLength <= 8)
{
indexStr = licenseKeyLength;
}
rowSB.Append("<td width=\"110\">" + licenseKey.Substring(0, indexStr) + "</td>");
DateTime licenseExpirationDate = softwareInventory.GetTypedColumnValue<DateTime>(expirationDateColumn.Name);
string licenseExpirationDateStr = "";
if (licenseExpirationDate != DateTime.MinValue) {
licenseExpirationDateStr = licenseExpirationDate.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
}
rowSB.Append("<td width=\"83\">" + licenseExpirationDateStr + "</td>");
rowSB.Append("<td width=\"106\">" + softwareInventory.GetTypedColumnValue<string>("Equipment_Name") + "</td>");
rowSB.Append("</tr>");
htmlTableBuilder.AppendLine(rowSB.ToString());
}
htmlTableBuilder.AppendLine("</table>");
softwareInventoryTableHTML = htmlTableBuilder.ToString();
}
Set<string>("SoftwareInventoryTableHTML", softwareInventoryTableHTML);
return true;А потом этот параметр бизнес-процесса использовать в элементе 'Отправить email' в качестве макроса:
Обратите внимание, по данному программному обеспечению истек срок действия лицензии либо истечет в ближайшее время.
Пожалуйста, актуализируйте в срм информацию по этому ПО:
[#Software inventory table#]
С уважением,
Системный администратор crm
P.S. В скрипте, приведенном выше, ещё и гиперссылки на карточки сущностей в срм формируются.
Я однажды делал подобное следующим образом:
в БП в элементе "Задание-сценарий" вычитывал в коллекцию какие-то значения.
После кодом формировал html-код в виде:
<table>
<tbody>
<tr>
<td >Номер</td>
<td >Колонка 1</td>
<td >Колонка 2</td>
</tr>
<tr>
<td >1</td>
<td >Значение 1</td>
<td >Значение 2</td>
</tr>
</tbody>
</table>
где Значение 1 и Значение 2 значения из коллекции.
После использовал элемент БП "Отправка письма", где в тело подсовывал html-код в виде строки.
После отправки получатель увидит заполненную html-таблицу