Хочу поделиться примером, как можно написать функцию для формирования списка фильтров, для поиска элементов приложений, избегая дублирования кода. Я часто сталкиваюсь с этой задачей при разработке отчетов с набором фильтров, которыми могут управлять пользователи.
Допустим, вы работаете в CRM ELMA365 и хотите построить отчёт по переговорам. В отчёте обычно есть фильтры, например:
Статус (В работе, Закрыто, Отменено)
Контрагент (с каким клиентом работаете)
Дата начала или окончания переговоров
Пользователь может заполнить все фильтры, может только один или вообще ни один. А разработчикам, важно сделать так, чтобы отчёт подстраивался под введённые условия, и не приходилось для каждой комбинации писать свой запрос или скрипт.
В моем примере, фильтры для поиска элементов приложения добавляются в зависимости от заполнения полей (фильтров в отчете).
Код:
let tasks = await Namespace.app.conversations.search().where(function (f, g) {
let filters: Filter[] = [];
filters.push(f.__deletedAt.eq(null));
if (Context.data.status) {
let status = Namespace.app.conversations.fields.__status.variants[Context.data.status!.code]
if (status) filters.push(f.__status.eq(status));
}
if (Context.data.conterparty?.length) {
filters.push(f.contractor.link(Context.data.conterparty));
}
if (Context.data.start_date && Context.data.end_date) {
filters.push(f.date.gte(Context.data.start_date))
filters.push(f.date.lte(Context.data.end_date))
}
else if (!Context.data.start_date && Context.data.end_date) {
filters.push(f.date.lte(Context.data.end_date))
}
else if (Context.data.start_date && !Context.data.end_date) {
filters.push(f.date.gte(Context.data.start_date))
}
return g.and(...filters);
}).sort('__startAt', true).size(100).all()
Еще больше полезной информации в ТГ канале WhatDaELMA365