Функция формирования почтового адреса для подстановки в шаблоны документов и уведомлений

При формировании шаблонов документов, шаблонов сообщений, а также в ряде элементов дизайнера (подстановка переменных контекста) полезно использовать соответствующие функции, которые производят определенные вычисления по передаваемым переменных контекста.

Пример шаблона документа

Пример созданного документа

Пример класса расширений для предоставления функций генератора шаблонов

using System.Collections.Generic;
using EleWise.ELMA;
using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.CRM.Models;
using EleWise.ELMA.Templates;
using EleWise.TemplateGenerator;
using EleWise.TemplateGenerator.Functions;

namespace ITino.ELMA.CRM.Components
{
  /// <summary>
  /// Расширение для предоставления функций генератора шаблонов
  /// </summary>
  [Component]
  public class TemplateGeneratorFunctionsContainer : ITemplateGeneratorFunctionsContainer
  {
    /// <summary>
    /// Формирование адреса по правилам (для договоров и т.д.): Страна, Индекс, ...
    /// </summary>
    /// <param name="context">Контекст вычисления значения функции</param>
    /// <returns></returns>
    public static FormatedValue Address(FunctionEvaluationContext context)
    {
      // Проверяем, передана ли переменная контекста
      if (context.Parameters != null && context.Parameters.Count > 0 &&
      context.Parameters[0] != null && context.Parameters[0].Value != null)
      {
        var address = context.Parameters[0].Value as IAddress;
        
        // Формируем строку адреса
        if (address != null)
        {
          var l = new List<string>();
          if (address.Country != null)
            l.Add(address.Country.Name);
          if (!string.IsNullOrWhiteSpace(address.Zip))
            l.Add(address.Zip);
          if (!string.IsNullOrWhiteSpace(address.Region))
            l.Add(address.Region);
          if (!string.IsNullOrWhiteSpace(address.District))
            l.Add(address.District);
          if (!string.IsNullOrWhiteSpace(address.City))
            // Добавляем префикс для города
            l.Add(SR.T("г. {0}", address.City));
          if (!string.IsNullOrWhiteSpace(address.Locality))
            l.Add(address.Locality);
          if (!string.IsNullOrWhiteSpace(address.Street))
            // Если не указан префикс проспект, переулок и т.д., добавляем префикс улица
            l.Add(SR.T("{0}{1}", address.Street.Contains(" ") ? "" : SR.T("ул. "), address.Street));
          if (!string.IsNullOrWhiteSpace(address.Building))
            // Добавляем префикс для дома
            l.Add(SR.T("д. {0}", address.Building));
          if (!string.IsNullOrWhiteSpace(address.Stroenie))
            // Добавляем префикс для строения
            l.Add(SR.T("стр. {0}", address.Stroenie));
          if (!string.IsNullOrWhiteSpace(address.Korpus))
            // Добавляем префикс для корпуса
            l.Add(SR.T("корп. {0}", address.Korpus));
          // Если не указан префикс офис, комната и т.д., добавляем префикс квартира
          if (!string.IsNullOrWhiteSpace(address.Appartment))
            l.Add(SR.T("{0}{1}", address.Appartment.Contains(" ") ? "" : SR.T("кв. "), address.Appartment));

          return new FormatedValue(string.Join(", ", l));
        }
      }
      return null;
    }
  }
}

Точка расширения (интерфейс) ITemplateGeneratorFunctionsContainer определяет перечень классов (компонентов), которые будут зарегистрированы в системе при запуске сервера. При генерации документа по шаблону, сообщения по шаблону, элементов дизайнера с подстановкой контекстных переменных, происходит последовательный перебор статических методов, реализованных в данном классе. Если система находит совпадение с названием нужного метода, производится его вызов и вычисление результата по данных входной контекстной переменной и ее параметров.

Метод public static FormatedValue Address(FunctionEvaluationContext context) определяет обработку входного значения переменной контекста. В случае, если контекст не удовлетворяет критериям при обработке, возвращается null, в следствие чего в генерируемых документах, сообщениях, вычисляемых значениях в процессах будет передано пустое значение.

В большинстве случаев возвращаемое значение является строковым типом (как в данном примере). Другие варианты, например, изображение будут рассмотрены в других статьях.

Ссылки на элементы API

ITemplateGeneratorFunctionsContainer

Ссылки на базу знаний

Текущий перечень функций генератора шаблонов