using System.Collections;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Text;
using Microsoft.SqlServer.Server;
using Neo.Afx.ComponentModel;
namespace Neo.Afx.Crm
{
///
/// Helper function to assist with sql dataset formatting based on a predefined message template
///
public class MessageFormatter
{
#region MessageDetail Class
private class MessageDetail
{
public SqlString Recipients;
public SqlString Cc;
public SqlString Bcc;
public SqlString Subject;
public SqlString Message;
public MessageDetail(SqlString recipients, SqlString cc, SqlString bcc, SqlString subject, SqlString message)
{
Recipients = recipients;
Cc = cc;
Bcc = bcc;
Subject = subject;
Message = message;
}
}
#endregion
#region GetFormattedMessagesFillRow
///
/// Method used by GetFormattedMessages to fill array
///
///
///
///
///
///
///
public static void GetFormattedMessagesFillRow(object messageDetailObj, out SqlString recipients, out SqlString cc, out SqlString bcc, out SqlString subject, out SqlString message)
{
var obj = (MessageDetail)messageDetailObj;
recipients = obj.Recipients;
cc = obj.Cc;
bcc = obj.Bcc;
subject = obj.Subject;
message = obj.Message;
}
#endregion
///
/// Selects data from a provided SQL string and inserts it into the format string.
/// recipientSql must contain the following fields: recipients, cc, bcc
///
/// A table with popolated MessageDetail objects.
[SqlFunction(
IsDeterministic = true,
IsPrecise = true,
DataAccess = DataAccessKind.Read,
SystemDataAccess = SystemDataAccessKind.Read,
FillRowMethodName = "GetFormattedMessagesFillRow",
TableDefinition = "Recipients nvarchar(max), Cc nvarchar(max), Bcc nvarchar(max), Subject nvarchar(1000), Message nvarchar(max)")]
public static IEnumerable GetFormattedMessages(SqlString recipientSql, SqlString dataSql, SqlString subject, SqlString messageTemplateStart, SqlString messageTemplateData, SqlString messageTemplateEnd)
{
return GetFormattedMessagesImpl(SqlUtilities.ClrConnectionString,
recipientSql.Value, dataSql.Value, subject.Value, messageTemplateStart.Value, messageTemplateData.Value, messageTemplateEnd.Value);
}
///
/// Gets the formatted messages.
///
/// The connection string.
/// The recipient SQL.
/// The data SQL.
/// The subject.
/// The message template start.
/// The message template data.
/// The message template end.
///
public static IEnumerable GetFormattedMessagesImpl(string connectionString, string recipientSql, string dataSql, string subject, string messageTemplateStart, string messageTemplateData, string messageTemplateEnd)
{
var results = new ArrayList();
using(var connection = new SqlConnection(connectionString))
{
connection.Open();
DataTable dt;
using(var cmd = connection.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = recipientSql;
dt = cmd.FetchDataTable();
}
using(var cmd = connection.CreateCommand())
{
cmd.CommandType = CommandType.Text;
foreach(DataRow row in dt.Rows)
{
var message = new StringBuilder(messageTemplateStart);
cmd.CommandText = dataSql.Replace(EntityFormatType.Replacement, row);
using(var reader = cmd.ExecuteReader(CommandBehavior.Default))
{
while(reader.Read())
{
var s = messageTemplateData.Replace(EntityFormatType.Replacement, reader);
message.Append(s);
}
}
message.Append(messageTemplateEnd);
results.Add(new MessageDetail(
row["recipients"].ToString(),
row["cc"].ToString(),
row["bcc"].ToString(),
subject,
message.ToString()));
}
}
}
return results;
}
}
}