Шаблоны документов#

Система позволяет создавать шаблоны печатных форм. Ограничения по количеству создаваемых шаблонов отсутствуют. В качестве источников данных для печатных форм могут быть использованы:

  • данные справочников,

  • данные экземпляров форм,

  • данные пользователей.

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

Каждый Шаблон Документа содержит:

  • название шаблона,

  • тэг Локации,

  • набор SQL-запросов для формирования данных шаблона,

  • файл шаблона,

  • шаблон названия,

  • метаданные формы для конфигурирования запроса;

Модель данных doc_templates#

JSON#

{
    "templateName": "templateName",
    "metadata": null,
    "fileTitle": "Акт входного контроля №{reportNumber} от {reportDate}",
    "formId": "613738ec870762012c000006",
    "filenameExtension": "docx", //может еще быть xlsx
    "locationFilter": "^view.*", //В поле locationFilter храниться regexp по которому следует фильтровать шаблоны
    "tags": [],
    "relationsData": [],
    "name": "618e12f4357479019300001c" //идентификатор отчета
}

Проверить regexp можно к примеру по ссылке: https://regex101.com/

SQL#

SQL-запросы параметризуются переменными в стиле ключ-значение; какие-то переменные определяются исходя из текущей локации. Например фильтры и родительский элемент структуры для Шаблонов, запускающихся из списка замечаний.

$_start $_end
SELECT * FROM i issue WHERE i.creation_date BETWEEN ($_start, $_end)
$_ids
SELECT * FROM i issue WHERE i.id IN $_ids
Фильтр может быть null: ... WHERE ($_start IS NULL OR  i.creation_date > $_start)
$limit : ... WHERE ... LIMIT $limit

Пример:

[{ "title" : "test",
"sqlRequest" : "WITH RECURSIVE ft as (SELECT CASE WHEN (DATA -> 'info') ? 'typeOfLaboratory'
THEN (((DATA -> 'info') -> 'typeOfLaboratory') -> 0) ->> 'name'
ELSE NULL END AS lab_type,
CASE WHEN (DATA -> 'info') ? 'cafm'
THEN (((DATA -> 'info') -> 'cafm') -> 'document') ->> 'name'
ELSE '' END AS rd_code, ((DATA -> 'members') -> 'applicant') ->> 0 AS app_id, CASE WHEN (DATA -> 'members') ? 'executor'
THEN ((DATA -> 'members') -> 'executor') ->> 0
ELSE NULL END AS ex_id,
CASE WHEN (DATA -> 'info') ? 'area'
THEN (((DATA -> 'info') -> 'area') -> 0) ->> 'id'
ELSE NULL END AS area_id, DATA ->> 'number' AS num,
CASE WHEN (DATA -> 'info') ? 'volume'
THEN (DATA -> 'info') ->> 'volume'
ELSE '' END AS procent, uuid AS obj_id,
CASE WHEN (DATA -> 'dateTime') ->> 'dateTimeEnd' != '0'
THEN to_char(to_timestamp(to_number((DATA -> 'dateTime') ->> 'dateTimeEnd','9999999999')), 'DD.MM.YYYY')
ELSE ' ' end as due_date FROM form_instances where \"isArchived\" = false and \"formId\" = '62cbec43311cd1008500000d' <#if ids??>
AND uuid IN (<#list ids as i>'${i}'<#if !i?is_last>, </#if></#list>)</#if> ),
area_tab AS (select ft.obj_id, pa.\"name\"::text AS area_name,
pa.parent_id::text AS pid,
CASE WHEN pa.parent_id is null
THEN 1 ELSE 0 END AS ar_check FROM ft inner join public.full_path pa on ft.area_id = pa.id::text union all select atb.obj_id,
concat (pa.\"name\", atb.area_name)::text as area_name, pa.parent_id::text as pid,
CASE WHEN pa.parent_id is null then 1 else 0 end as ar_check from area_tab atb
INNER JOIN public.full_path pa on atb.pid = pa.id::text ) ,
other_tab AS ( select ft.obj_id, ft.num, ft,rd_code, ft.procent, ft.due_date,
pua.organization AS app_org, pua.\"position\" AS app_pos,
pue.organization AS ex_org, pue.\"position\" AS ex_pos,
ft.lab_type AS lab_type from ft LEFT JOIN public.user pua ON ft.app_id = pua.id::TEXT LEFT JOIN public.user pue ON ft.ex_id = pue.id::TEXT)
SELECT CASE WHEN {reportDate} is not null
THEN to_char({reportDate}::date, 'DD.MM.YYYY')
ELSE ' ' END AS req_date, ot.num, ot.rd_code, ot.procent, ot.due_date,
CASE WHEN atb.area_name IS NOT NULL
THEN atb.area_name ELSE '' END AS area,
CASE WHEN ot.app_org IS NOT NULL
THEN ot.app_org ELSE '' END AS app_org,
CASE WHEN ot.app_pos IS NOT NULL THEN ot.app_pos
ELSE '' END AS app_pos, CASE WHEN ot.ex_org IS NOT NULL
THEN ot.ex_org
ELSE '' END AS exec_org,
CASE WHEN ot.ex_pos IS NOT NULL THEN ot.ex_pos
ELSE '' END AS exec_pos,
CASE WHEN ot.lab_type IS NOT NULL THEN ot.lab_type
ELSE '' END AS lab_type FROM other_tab ot LEFT JOIN (SELECT * FROM area_tab WHERE ar_check = 1) atb ON ot.obj_id = atb.obj_id" }]

Template#

Загруженный шаблон отчета. Файл Шаблона загружается в хранилище. Он будет доступен по прямой ссылке.

Шаблон таблицы для Template#

Наименование

Тип данных

id

text

name

text

report_kind

text

last_modified_date

timestamp without time zone

last_modified_by_user

text

url

text

file_name

text

isMultyTasks

boolean

sql_fields

jsonb

owner

text

create_date

timestamp without time zone

_extra_props

jsonb