В Mid Office Manager в различных документах содержится информация о других объектах в программе. Например, документы могут содержать данные о продуктах, сборах или реализациях. Информация об этих объектах должна иметь определенный вид. При этом требования к виду отображаемых данных различается от агентства к агентству. Для управления форматом данных была разработана система, позволяющая назначать произвольный формат для создания строкового представления объекта. Система может быть использована для построения описания объекта, формирования его номера и т.д. Система форматов является расширяемой, в нее могут быть добавлены новые свойства объектов.
Формат представляет собой строковый шаблон, по которому будет сформирован итоговый результат. Результатом применения формата также будет строка. Она будет отражать представление объекта в соответствии с заданным шаблоном, в котором все указанные ключевые слова будут преобразованы в значения. Например, если в шаблоне наименования продукта указано ключевое слово для его номера, то оно будет заменено на номер продукта.
Строка формата состоит из произвольного набора блоков. Блоки бывают четырех типов: простой, ключевое слово, опциональный и условный. Каждый блок имеет свою структуру. Рассмотрим каждый блок в отдельности.
Авиабилет |
Для простого блока не требуется каким-либо образом выделять свою структуру. Статичные символы просто вносятся в формат как есть.
2. Ключевое слово - является блоком, в котором указанное ключевое слово, при применении формата, будет заменено на определенное значение. Этот блок имеет следующую структуру:
{<наименование_атрибута>=<значение_атрибута>} |
Как видно, блок начинается с символа { (открывающая фигурная скобка) и заканчивается символом } (закрывающая фигурная скобка). Внутри блока расположены атрибуты. При задании атрибута необходимо внести его наименование, затем символ = (равно), после чего указать значение атрибута. Блок ключевого слова поддерживает несколько атрибутов:
id - наименование ключевого слова
default - значение по умолчанию, используемое в случае, если вычисленное значение пустое
separator - используется для указания разделителя значений, в случае если ключевое слово отвечает за коллекцию значений
pattern - шаблон, для форматирования вычисленного значения, например, если ключевое слово отвечает за дату или число
Из всех указанных атрибутов, обязательным к указанию является лишь атрибут id. Остальные атрибуты являются опциональными. В качестве значения, указываемого для атрибута default можно использовать любой набор блоков. Если в блоке нужно указать несколько атрибутов, они должны быть отделены друг от друга символом | (вертикальная черта). При этом, последовательность, в которой выстраиваются атрибуты, не имеет значения. Предположим, что нужно задать формат наименования для продукта, содержащего его номер. Формат, при этом, будет выглядеть так:
{id=product:number} |
Как видно из примера, значение для атрибута id указывается в виде двух элементов, соединенных символом : (двоеточие):
<объект>:<свойство> |
Элемент объект определяет, какому объекту принадлежит свойство, которое необходимо отобразить, а элемент свойство определяется какое именно свойство этого объекта нужно отобразить. В примере выше, указано, что нужно отобразить свойство number, принадлежащее объекту product (список всех объектов и их свойств приведен в конце документа).
Вернемся к примеру из описания простого блока. После слова Авиабилет требуется указать его номер, а в случае, если номер отсутствует, вместо номера нужно подставить значение без номера. Формат примет следующий вид:
Авиабилет {id=product:number|default=без номера} |
В случае, если у билета номер присутствует, результирующая строка будет выглядеть, например, так:
Авиабилет 1234567890 |
А в случае, если у билета номера нет, то вместо номера будет подставлено указанное значение по умолчанию:
Авиабилет без номера |
Чтобы не загромождать шаблон, уберем из него атрибут default и немного усложним пример, добавив новое требование: в конце строки должна быть подставлена дата вылета, отделенная от номера символом - (тире):
Авиабилет {id=product:number} - {id=product:start_date} |
Возникает вопрос, в каком виде дата будет отображена в итоговой строке? Как упоминалось ранее, для дат и чисел можно задать атрибут pattern, который как раз и позволяет задать шаблон для их отображения. Воспользуемся этим атрибутом:
Авиабилет {id=product:number} - {id=product:start_date|pattern=yyyy.MM.dd} |
В этом примере, было определено что дата будет отображаться в виде четырех цифр года и двух цифр для месяца и дня, отделенные между собой символом . (точка). Итоговый результат может выглядеть, например, так:
Авиабилет 1234567890 - 2018.05.17 |
Для того, чтобы отобразить локализуемое значение на языке, отличном от языка инсталляции, нужно у элемента указать атрибут locale. Например, для отображения наименования номенклатуры на английском языке нужно использовать следующий формат:
{id=billing_item:nomenclature|locale=en} |
При этом, если атрибут locale указать у элемента, значение которого является не локализуемым, то такое значение будет транслитерировано с кириллицы на латиницу в соответствии с ГОСТ Р 52535.1-2006.
3.Опциональный - специальный блок, который в случае пустого значения будет полностью исключен из итоговой строки. Его полезно использовать, когда в формат нужно включить определенные данные, отсутствие которых у форматируемого объекта является допустимым. Этот блок имеет структуру, схожую со структурой предыдущего блока:
[<наименование_атрибута>=<значение_атрибута>] |
Блок начинается с символа [ (открывающая квадратная скобка) и заканчивается символом ] (закрывающая квадратная скобка). Внутри блока расположены атрибуты, имеющие идентичный формат. Опциональный блок поддерживает следующие атрибуты:
value - значение
padding - набор статичных символов, подставляемых перед значением, но только в случае, если это не первая запись в строке
prefix - набор статичных символов, подставляемых перед значением
suffix - набор статичных символов, подставляемых после значения
В указанном наборе атрибутов обязательным является только атрибут value. В качестве его значения можно указывать любой набор блоков. Например, можно использовать блок ключевое слово. Снова вернемся к прошлому примеру. Последняя версия формата выглядела так:
Авиабилет {id=product:number} - {id=product:start_date|pattern=yyyy.MM.dd} |
Посмотрим, как будет выглядеть итоговая строка в случае, если дата вылета у авиабилета не задана:
Авиабилет 1234567890 - |
В силу того, что даты вылета в авиабилете нет, ее значение в итоговую строку подставлено не будет. Однако символ - (тире), отделяющий дату от номера останется, т.к. он задан как статичный. Хочется этого избежать. Исправим формат и внесем в него опциональный блок:
Авиабилет {id=product:number}[padding= - |value={id=product:start_date|pattern=yyyy.MM.dd}]
Как видно, символ - (тире) был внесен в качестве значения padding, а блок ключевого слова был полностью перенесен в значение атрибута value. Теперь, в случае если дата в билете есть, вычисленное значение атрибута value будет не пустым, следовательно опциональный блок будет использован. Итоговое значение, при этом, будет выглядеть так:
Авиабилет 1234567890 - 2018.05.17
Если же дата в билете отсутствует, то значение value будет пустым и опциональный блок будет полностью исключен из формата. В итоге получится строка:
Авиабилет 1234567890
В силу того, что символ - (тире) теперь является частью опционального блока, этот символ не будет добавлен в итоговую строку.
4. Условный блок - предназначен для вывода разных результатов, которые зависят от вычисленного значения. Работа данного блока заключается в том, что сначала вычисляется значение, а затем проверяется набор указанных ожидаемых результатов для этого значения. В случае, если вычисленное значение совпадает с одним из указанных результатов, тогда в итоговую строку будет выведено значение, назначенное этому результату. Этот блок имеет структуру, схожую со структурой предыдущих блоков:
<<наименование_атрибута>=<значение_атрибута>>
Блок начинается с символа < (открывающая угловая скобка) и заканчивается символом > (закрывающая угловая скобка). Внутри блока расположены атрибуты, имеющие идентичный формат. Опциональный блок поддерживает следующие атрибуты:
value - значение
default - значение по умолчанию, используемое в случае, если значение не совпало ни с одним из ожидаемых результатов.
В указанном наборе атрибутов обязательным является только атрибут value. В качестве его значения можно указывать любой набор блоков. Помимо указанных атрибутов, можно задавать атрибуты ожидаемых результатов.
Рассмотрим снова пример из описания простого блока. После слова Авиабилет требуется указать слово электронный или бумажный в зависимости от того, является ли билет электронным или нет. У продукта нет ключевого слова тип билета, однако есть ключевое слово с признаком электронный билет. При вычислении значения этого признака можно получить два результата: true – в случае электронного билета и false – в случае если билет не электронный. Воспользуемся этим признаком и условным блоком для построения формата:
Авиабилет <value=product:eticket|true=электронный|false=бумажный>
Как видно в формате были перечислены варианты для всех ожидаемые результатов. В случае если вычисленное значение будет равно true, в итоговую строку будет подставлено слово электронный, при значении равном false – будет подставлено слово бумажный.
Совсем не обязательно указывать все варианты ожидаемых результатов. Если в наборе атрибутов не будет найден ожидаемый результат равный вычисленному значению, будет использовано значение из атрибута default. А если атрибут default не указан, то блок будет попросту проигнорирован.
По аналогии с атрибутом value в качестве значений, указываемых в атрибутах для ожидаемых результатов, а также для атрибута default можно использовать любой набор блоков.
И еще одно важно замечание: в качестве самого ожидаемого результата можно применять регулярные выражения.
В описанных выше блоках используется строгая структура. При этом, для описания структуры используются различные служебные символы такие как { (открывающая фигурная скобка), } (закрывающая фигурная скобка), | (вертикальная черта) и т.д. Порой бывает нужным использовать эти символы в формате не как служебные, а как обычные символы. Например, внутри блока с ключевым словом требуется задать шаблон для даты с использованием символа вертикальной черты:
{id=product:start_date|pattern=yyyy|MM|dd}
Система формата при разборе блока на составляющие разобьет его на четыре части, и выдаст ошибку о том, что структура блока нарушена. Она воспримет части MM и dd как отдельные атрибуты, которые не соответствуют ожидаемому формату, т.к. после наименования атрибута должен следовать символ = (равно) и его значение. Чтобы исправить ситуацию, нужно пометить символы | (вертикальная черта) в значении pattern как обычные символы. Для выделения последовательности обычных символов используется символ ' (одинарная кавычка). Все, что будет находиться между этим символами, будет интерпретировано системой не как служебные символы, а как обычные. Внесем исправления в формат:
{id=product:start_date|pattern=yyyy'|'MM'|'dd}
Теперь структура блока будет считаться корректной. В случае, если нужно в качестве обычного символа указать сам символ ' (одинарная кавычка), нужно внести его два раз подряд.
При описании блока ключевого слова, отмечалось, что для атрибутов, отвечающих за дату и число, можно воспользоваться атрибутом pattern. Есть еще один случай, когда этот атрибут необходим. Для начала рассмотрим объект Паспорт. Зададим для него формат, где будет задействован тип паспорта и его номер:
{id=passport:type} - {id=passport:number}
После применения формата итоговое представление паспорта может, например, выглядеть так:
Внутренний паспорт - 1234567890
Теперь рассмотрим объект Физическое лицо. Для него зададим формат, где нужно отображать фамилию, имя, а также список его паспортов, указанных в скобках:
{id=person:last_name} {id=person:first_name} ({id=person:passports})
Очевидно, что паспорт является комплексным объектом, и в свою очередь может состоять из нескольких составляющих. Возникает желание каким-то образом указать формат и для самого паспорта. В таких случаях можно также задействовать атрибут pattern. В этом примере воспользуемся форматом паспорта из примера выше и укажем его в качестве значения атрибута pattern:
{id=person:last_name} {id=person:first_name} ({id=person:passports|pattern={id=passport:type} -{id=passport:number}})
В случае, если у форматируемого физического лица есть два паспорта, то результат применения формата может выглядеть так:
Иванов Иван (Внутренний паспорт - 1234567890, Загранпаспорт - 701234560)
Ниже перечислены объекты, для которых поддерживается использование формата, включая список их ключевых слов:
Элемент реализации (billing_item)
Ключевое слово | Описание | Локализация (да/нет) |
---|---|---|
name | Название элемента реализации | нет |
nomenclature | Номенклатура | да |
traveller | Путешественник (см. объект Путешественник) | |
product | Продукт (см. объект Продукт) |
Заказ (booking_file)
Ключевое слово | Описание | Локализация (да/нет) |
---|---|---|
number | Номер заказа | нет |
customer_profile | Клиент (см. объект Организация) | |
reservations | Список бронирований (см. объект Бронирование) | |
travellers | Список путешественников (см. объект Путешественник) |
Бронирование (reservation)
Ключевое слово | Описание | Локализация (да/нет) |
---|---|---|
record_locator | PNR | нет |
products | Список продуктов (см. объект Продукт) |
Продукт (product)
Ключевое слово | Описание |
---|---|
type | Тип продукта |
number | Номер продукта |
status | Статус продукта |
eticket | Признак электронного билета |
cities | Строка, содержащая города маршрута |
countries | Строка, содержащая страны маршрута |
addresses | Строка, содержащая адреса маршрута |
start_date | Дата начала оказания услуги |
end_date | Дата завершения оказания услуги |
start_dates | Строка с датами начала каждого элемента маршрута |
end_dates | Строка с датами завершения каждого элемента маршрута |
dates | Строка со всеми датами каждого элемента маршрута |
days | Количество дней оказания услуги |
nights | Количество ночей оказания услуги |
carrier | Наименование перевозчика |
carrier_number | Номер перевозчика |
carrier_code | Расчетный код перевозчика |
carrier_registration_id | ИНН перевозчика |
supplier | Поставщик услуги |
service_class | Перечень классов обслуживания, указанных в деталях сегментов (заполняется только для Авиабилетов). Классы обслуживания отображаются через «,» |
train | Номер поезда |
hotel | Наименование гостиницы |
room | Тип номера в гостинице |
udid_value | Значение UDID |
travellers | Список путешественников (см. объект Путешественник) |
previous_product | Предыдущий продукт (см. объект Продукт) |
next_product | Следующий продукт (см. объект Продукт) |
related_product | Связанный продукт (см. объект Продукт) |
description | Описание универсального продукта (данные, которые хранятся в поле с назначением Описание) |
Путешественник (traveller)
Ключевое слово | Описание | Локализация (да/нет) |
---|---|---|
name | Имя путешественника | нет |
cyrillic_name | Имя путешественника на кириллице | нет |
passenger | Профиль путешественника (см. объект Физическое лицо) | |
passport | Паспорт (см. объект Паспорт) |
Паспорт (passport)
Ключевое слово | Описание |
---|---|
type | Тип паспорта |
number | Номер паспорта |
issued | Дата выдачи паспорта |
last_name | Фамилия, указанная в паспорте |
first_name | Имя, указанное в паспорте |
middle_name | Отчество, указанное в паспорте |
second_name | Второе имя, указанное в паспорте |
Организация (organization)
Ключевое слово | Описание |
---|---|
code | Код организации |
short_name | Короткое название |
full_name | Полное название |
legalForm | Юридическая форма |
registration_id | ИНН |
kpp | КПП |
Физическое лицо (person)
Ключевое слово | Описание |
---|---|
last_name | Фамилия физического лица |
code | Код физического лица |
first_name | Имя физического лица |
second_name | Второе имя физического лица |
middle_name | Отчество физического лица |
last_name | Фамилия физического лица |
passports | Список паспортов физического лица (см. объект Паспорт) |
Финансовый документ (finance_document)
Ключевое слово | Описание |
---|---|
date | Дата финансового документа |
number | Номер финансового документа |
number_generate | Специальное ключевое слово, обеспечивающее генерацию следующего номера |
supplier | Поставщик услуг |
customer | Контрагент |
contract | Договор (см. объект Контракт) |
shipment | Реализация (см. объект Реализация) |
Договор (contract)
Ключевое слово | Описание |
---|---|
name | Наименование договора |
type | Тип |
number | Номер |
date | Дата подписания |
Реализация (shipment)
Ключевое слово | Описание |
---|---|
date | Дата реализации |
number | Номер реализации |
number_generate | Специальное ключевое слово, обеспечивающее генерацию следующего номера |
categories | Список категорий реализации |
period_begin | Начало периода |
period_end | Конец периода |
Платежный документ (payment_document)
Ключевое слово | Описание |
---|---|
date | Дата платежного документа |
number | Номер платежного документа |
number_generate | Специальное ключевое слово, обеспечивающее генерацию следующего номера |
Позиция в чеке (receipt_line)
Ключевое слово | Описание |
---|---|
name | Наименование позиции в чеке |
service_name | Тип дополнительных услуг |
product | Продукт (см. объект Продукт) |
Стоит отметить, что некоторые ключевые слова используются для задания формата представления объектов, которые являются свойствами других объектов. Такие ключевые слова будем называть внутренними. Они не могут использоваться самостоятельно, а только в качестве описания свойств других объектов. Есть же напротив, ключевые слова, которые могут использоваться самостоятельно. Такие слова будем называть внешними.
Так, например, для указания номера договора в шаблоне заголовка финансового документа воспользуемся форматом:
{id=finance_document:contract|pattern={id=contract:number}}
В данном формате ключевое слово finance_document будем считать внешним, а contract — внутренним.
В таблице ниже указаны типы ключевых слов и их применение
Ключевое слово | Тип | Применение |
---|---|---|
billing_item | внешний | Шаблон наименования строки финансового документа |
booking_file | внешний | Шаблон наименования строки финансового документа |
reservation | внешний | Шаблон наименования строки финансового документа |
product | внешний/внутренний | Шаблон наименования строки финансового документа |
traveller | внутренний | Шаблон наименования строки финансового документа |
passport | внутренний | Шаблон наименования строки финансового документа |
organization | внутренний | Шаблон наименования строки финансового документа |
person | внутренний | Шаблон наименования строки финансового документа |
finance_document | внешний | Шаблон заголовка финансового документа |
contract | внутренний | Шаблон заголовка финансового документа |
shipment | внутренний | Шаблон заголовка финансового документа |
Ключевое слово | Авиабилет | Ж/Д Билет | Аэро-экспресс | Претензия | Сбор за действия агента | Аренда автомобиля | Доставка | Бронь отеля | Страховка от несчастного случая | Страховка туристи-ческая | КРС | Войди-рование | Ж/Д КРС Крым | Ж/Д КРС Справка | Трансфер | Универса-льный продукт | Виза | Автобус |
type | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
number | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
status | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
supplier | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
eticket | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
cities | ● | ● | ● | ○ | ○ | ● | ○ | ● | ● | ○ | ○ | ● | ● | ○ | ● | ○ | ○ | ● |
countries | ● | ● | ● | ○ | ○ | ● | ○ | ● | ○ | ● | ○ | ● | ● | ○ | ● | ○ | ● | ● |
addresses | ○ | ○ | ○ | ○ | ○ | ○ | ● | ● | ○ | ○ | ○ | ● | ○ | ○ | ● | ○ | ○ | ○ |
start_date | ● | ● | ● | ○ | ○ | ● | ● | ● | ● | ● | ○ | ● | ● | ○ | ● | ○ | ● | ● |
end_date | ● | ● | ○ | ○ | ○ | ● | ● | ● | ○ | ● | ○ | ● | ● | ○ | ● | ○ | ● | ● |
start_dates | ● | ● | ○ | ○ | ○ | ● | ● | ● | ○ | ● | ○ | ● | ● | ○ | ● | ○ | ● | ● |
end_dates | ● | ● | ○ | ○ | ○ | ● | ● | ● | ○ | ● | ○ | ● | ● | ○ | ● | ○ | ● | ● |
dates | ● | ● | ○ | ○ | ○ | ● | ● | ● | ○ | ● | ○ | ● | ● | ○ | ● | ○ | ● | ● |
days | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
nights | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
carrier | ● | ● | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ● | ○ | ○ | ○ | ○ | ○ | ○ |
carrier_number | ● | ● | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ● | ● | ○ | ○ | ○ | ○ | ○ |
carrier_code | ● | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ● | ○ | ○ | ○ | ○ | ○ | ○ |
carrier_registration_id | ● | ● | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ● | ○ | ○ | ○ | ○ | ○ | ○ |
service_class | ● | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
train | ○ | ● | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ● | ● | ○ | ○ | ○ | ○ | ○ |
hotel | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ● | ○ | ○ | ○ | ● | ○ | ○ | ○ | ○ | ○ | ○ |
room | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ● | ○ | ○ | ○ | ● | ○ | ○ | ○ | ○ | ○ | ○ |
udid_value | ● | ● | ● | ● | ○ | ● | ● | ● | ● | ● | ● | ○ | ● | ● | ● | ● | ● | ● |
travellers | ● | ● | ● | ○ | ○ | ● | ○ | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
previous_product | ● | ● | ● | ○ | ○ | ● | ● | ● | ● | ● | ● | ○ | ● | ○ | ● | ● | ● | ● |
next_product | ● | ● | ● | ○ | ○ | ● | ● | ● | ● | ● | ● | ○ | ● | ○ | ● | ● | ● | ● |
related_product | ● | ● | ● | ○ | ○ | ○ | ● | ○ | ● | ● | ● | ● | ● | ● | ○ | ○ | ○ | ○ |
description | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ● | ○ | ○ |