Требуется в сгенерированном документе отображать его уникальный номер (Акт №(х)
, Акт №(х+1)
).
Нумератор должен быть сквозным по документам одного типа (шаблона).
Генератор документов ozma.io не имеет функционала сквозной нумерации, на стороне генератора сейчас нигде не сохраняется информация о количестве генераций, однако можно реализовать этот нумератор внутри самого решения и использовать его.
Заводим таблицу, в которой будем хранить информацию о шаблоне/типе документа и счетчик:
document_template_schema
- схема шаблонаdocument_template_name
- название шаблонаgenerates_counter
- количество сгенерированных документовЗаполняем данными о шаблонах документов, в поле generates_counter
можно поставить 0, чтобы при первой генерации был получен документ с №1
Пишем экшн.
Суть: получаем на вход данные для генерации (и опционально идентификатор записи из таблицы со счетчиками - полезно, если счетчик сквозной на несколько типов документов). Увеличиваем значение счетчика на один, возвращаем в качестве результата данные о генерации.
import { getEntityColumnsByFields } from "user/simple_select";
export default async function handleEvent(args) {
const templateId = args.counter;
const documentTemplate = args.document_template;
const documentArgs = args.args;
const documentFilename = args.filename;
let templateData;
if (templateId) {
templateData = await getEntityColumnsByFields({
schema: 'reports', name: 'document_generator'
},
['id', 'document_template_name', 'document_template_schema', 'generates_counter'],
{
id: templateId
}
);
} else if (documentTemplate.schema && documentTemplate.name) {
templateData = await getEntityColumnsByFields({
schema: 'reports', name: 'document_generator'
},
['id', 'document_template_name', 'document_template_schema', 'generates_counter'],
{
document_template_schema: documentTemplate.schema,
document_template_name: documentTemplate.name
}
);
} else {
return null;
}
if (!templateData.length)
return null;
const template = templateData[0];
await FunDB.updateEntity({
schema: 'reports', name: 'document_generator'
},
template.id,
{ generates_counter: template.generates_counter + 1}
);
return {
document_template: documentTemplate,
filename: documentFilename,
args: documentArgs
}
}
getEntityColumnsByFields
- функция из пользовательского модуля - возвращает значения указанных во втором аргументе полей сущности по условиям из третьего аргумента.Кнопка на форме Сделки, генерирующая документ, будет выглядеть примерно так:
{
name: 'Генерация документа',
action: {
schema: 'reports',
name: 'increment_counter_and_generate'
},
args: {
document_template: {
schema: 'crm',
name: 'opportunity_doc'
},
filename: 'Opportunity-' || $id,
args: {
id: $id
}
}
}
Вызываем по кнопке экшн reports.increment_counter_and_generate
, который будет инкрементировать счетчик для документа типа crm.opportunity_doc
и генерировать документ из шаблона crm.opportunity_doc
Данные для генерации документа будут браться из представления reports.opportunity_info
.
Представление возвращает какие-то данные о Сделке (в нашем простом случае - название), текущую дату и текущее значение счетчика с id = 2
(соответствует шаблону crm.opportunity_doc
)
{
$id reference(crm.opportunities)
}:
SELECT
subject,
(
SELECT generates_counter
FROM reports.document_generator
WHERE id = 2
) as number,
$$transaction_time as now
FROM
crm.opportunities
WHERE
id = $id
Простой пример шаблона документа:
Шаблон использует представление reports.opportunity_info
c полями
number
- значение счетчика для этого шаблонаsubject
- название сделкиnow
- текущие дата и времяПри нескольких последовательных генерациях документов одного типа получаем документы, отличающиеся номером