...

Поздравление с днем рождения

Тема в разделе "Примеры сценариев", создана пользователем ELMA365, 1 дек 2021.

  1. ELMA365

    ELMA365 Moderator

    Сценарии можно использовать не только для сложных вычислений, интеграций и изменения объектов, но и для решения необычных и приятных для сотрудников задач. В этой статье, я покажу как настроить процесс, который будет автоматически проверять, у кого из сотрудников сегодня день рождения, и отправлять поздравление.

    Создадим бизнес-процесс «Поздравление с днем рождения». Процесс будет запускаться автоматически каждый день. В ходе процесса сценарий будет искать пользователей, у которых день рождения совпадает с днем запуска, и отправлять сообщение с поздравлением в ленту, где его увидят все пользователи. Если на текущую дату именинники не найдены, процесс завершится.

    В контексте процесса создадим две переменные:

    Все пользователи (код — all_users) — тип Пользователи, Несколько;

    Именинники (код — birthday_today) — тип Пользователи, Несколько.

    [​IMG]

    На схему процесса добавим зону ответственности «Все пользователи» со следующими настройками:

    [​IMG]

    В зоне ответственности «Все пользователи» разместим операции Сценарий и Оповещение, а между ними поставим шлюз «или/или»:

    [​IMG]

    Переход шлюза, ведущий в конечное событие, выберем как переход по умолчанию. В переходе к оповещению установим условие:

    [​IMG]

    Подробнее о настройках читайте в статье справки Переходы.

    Таким образом, если ни один из пользователей не окажется именинником, процесс завершится.

    В настройках блока Сценарий создадим новую функцию. На вкладке Сценарии используем код:

    Код:
    
    async function findBirthdays(): Promise {
    // Получаем текущую дату
    const today = new Datetime();
    // Создаем функцию для сравнения дня рождения пользователя с текущей датой
    const isBirthdayToday = (userUserItem): boolean =>
    user.data.birthDate !== undefined
    && user.data.birthDate.month === today.month
    && user.data.birthDate.day === today.day;
    // Получаем всех пользователей
    const all await Context.fields.all_users.fetchAll();
    // Фильтруем пользователей и записываем в контекст тех, у кого сегодня день рождения
    Context.data.birthday_today all.filter(isBirthdayToday);
    }
    Настроим блок Оповещение. В тексте сообщения будем использовать переменную Именинники, в которую мы записали всех пользователей, у которых сегодня день рождения:

    [​IMG]

    В получателях сообщения оставляем «Текущий пользователь».

    Настроим автоматический запуск процесса, для ежедневной проверки и отправки поздравления.

    [​IMG]

    Таким образом, процесс будет каждый день проверять, есть ли у кого-то сегодня день рождения, и отправлять поздравление в ленту.
    Последнее редактирование: 3 дек 2021
  2. kurbatov-la

    kurbatov-la Активный участник

    Удалите все атрибуты с формы стартового события.
  3. safetycenter

    safetycenter Новичок

    Коллеги, добрый день!
    Прошу подсказать как адаптировать данный процесс для поиска днёй рождений контактов. У нас в карточке контакта создано поле "День рождения". Соответственно нужно выводить в календарь события по каждому контакту.
    Заранее спасибо за ответ!
  4. sultanov

    sultanov Техническая поддержка

    Добрый день.

    Предлагаю пример возможного решения вопроса:

    1. Решать задачу будем в приложении типа "Событие", поэтому создадим его с такими контекстными переменными:
    поле "Участники" - необязательно
    поле "Контакт" - приложение CRM > Контакты , один
    upload_2022-8-25_16-47-18.png
    2. Создаем БП на уровне этого приложения (для удобства поиска)
    upload_2022-8-25_15-19-10.png
    3. В контекст сценария нужно добавить переменные для работы сценария:
    • Текущую дату (dateNow): тип "Дата", поставить чек-бокс устанавливать текущую дату
    • Контакты (contacts): тип "Приложение", один
    • Строка с именами клиентов для поздравления (clients_for_congratulations): тип "Строка"
    • Вспомогательную переменную для шлюза (isnow): тип "Да/Нет"
    4. Блок "Сценарий":
    ```
    async function getBirthdayClients(): Promise<void> {

    const dateNow = Context.data.datenow!;
    const clients = await Global.ns._clients.app._contacts.search().all();
    let startDate: TDate; //Переменная для наполнения значением старта события

    Context.data.clients_for_congratulations = ''; //Очищаем переменную от undefined

    //Проходимся по нашим клиентам и создаем события в календаре
    for (let client of clients) {
    //Т.к. в основном календарь смотрим за месяц, то наполнять будем помесячно,
    //проверяем у кого в этом месяце ДР
    if (client.data.birthday?.month === dateNow.month) {
    //Записываем дату начала события
    startDate = new TDate(dateNow.year, client.data.birthday.month, client.data.birthday.day);
    //Создаем элемент приложения (событие) и наполняем его данными
    let app_schedule = Global.ns.congratulations.app.clients_birthdays.create();
    app_schedule.data.__name = `С днем рождения ${client.data.__name}`
    app_schedule.data.kontakt = client;
    app_schedule.data.__startAt = new Datetime(startDate.format());
    app_schedule.data.__endAt = new Datetime(startDate.format());
    app_schedule.save(); //Сохраняем результат

    }
    //Проверим есть ли сегодня у кого-то ДР и наполним строку именами клиентов
    if (client.data.birthday?.month === dateNow.month && client.data.birthday?.day === dateNow.day) {

    Context.data.isnow = true; //Отправляем по нужному руслу шлюза
    Context.data.clients_for_congratulations += client.data.__name; //Наполняем именами

    }
    }

    }

    ```
    5. Поправим теперь наш шлюз: сделаем переход по умолчанию на выход, а на оповещение по условию "isNow" = Да
    upload_2022-8-25_16-56-41.png
    6. Поправим оповещение:
    upload_2022-8-25_16-57-15.png
    7. Чтобы автоматизировать этот процесс, запустим аналогично текущему треду запуск по расписанию с теми же настройками.
    8. Получаем результат:
    upload_2022-8-25_17-1-14.png
    upload_2022-8-25_17-1-39.png
    upload_2022-8-25_17-2-17.png

    Вложения:

  5. v.sabirov

    v.sabirov Участник

    Все вроде сделал по инструкции) Установил дату ДР пользователя сегодня. Запускаю отладку - переменные в контексте не заполняются (пустые). Что возможно сделал не так?
    Только вот эту сроку поменял с
    async function findBirthdays(): Promise {
    на
    async function findBirthdays(): Promise<void> {
    иначе подчеркивало ошибку и функция не определялась
    Последнее редактирование: 15 сен 2022
  6. sultanov

    sultanov Техническая поддержка

    Добрый день.

    Да, у меня тоже не заполнялись переменные. Тогда я поправил немного сценарий и все заработало.

    Код:
    
    async function findBirthdays(): Promise<void> {
        
    // Получаем текущую дату
        
    const today = new Datetime();
        
    // Создаем функцию для сравнения дня рождения пользователя с текущей датой
        
    const isBirthdayToday = (userUserItem): boolean =>
        
    user.data.birthDate !== undefined
        
    && user.data.birthDate.month === today.month
        
    && user.data.birthDate.day === today.day;
        
    // Получаем всех пользователей
        
    Context.data.polzovateli await System.users.search().all();
        
    // Фильтруем пользователей и записываем в контекст тех, у кого сегодня день рождения
        
    Context.data.imeninniki Context.data.polzovateli.filter(isBirthdayToday);
    }
    Как видно из сценария, поправил последние две строчки. Я получаю всех пользователей из System и записываю в контекстную переменную polzovateli (all_users). Затем ее (polzovateli) и использую для получения пользователей, которые сегодня празднуют день рождения.
  7. v.sabirov

    v.sabirov Участник

    Не работает((( Теперь поле Пользователи возвращает несколько юзеров (похоже у кого поле ДР не заполнен, но может не всех таких), а в поле изменники никого не возвращает, хотя я принудительно тестовым пользователям указываю ДР в день тестирования. Вроде все просто, а не работает как нужно. Как проверить на ошибки возможные (не отладкой, а доп. кодом)?
  8. v.sabirov

    v.sabirov Участник

    НЕ решено. Поможет кто-нибудь? Хотя бы у себя поставить и написать работает или нет. Может не для всех сценарий подходит.
  9. sultanov

    sultanov Техническая поддержка

    Приложите скриншоты бизнес-процесса, его контекста и код, где происходит логика
  10. v.sabirov

    v.sabirov Участник


    Возвращает некоторых пользователей, но не одного именинника. Пользователей возвращает, похоже, которые с пустым полем Дата рождения в справочнике. Хотя это не точно, так как их всего штук 10, а пользователей без даты рождения больше.
    БП находится на уровне Компания.

    Вложения:

    Последнее редактирование: 17 окт 2022
  11. sultanov

    sultanov Техническая поддержка

    Нашел ошибку, проблема заключается в том, что поисковик (метод Search) без определения конкретного числа (метод size()) выполняет поиск первых 10 элементов (описание работы методов имеется в справке TS SDK https://tssdk.elma365.com/ru/interfaces/_04_application_.usersearch.html).

    В данном примере опущено это уточнение, т.к. зависит от количества пользователей в системе и логики работы.


    Код:
    
    async function findBirthdays(): Promise<void> {
        
    // Получаем текущую дату
        
    const today = new Datetime();
        
    // Создаем функцию для сравнения дня рождения пользователя с текущей датой
        
    const isBirthdayToday = (userUserItem): boolean =>
        
    user.data.birthDate !== undefined
        
    && user.data.birthDate.month === today.month
        
    && user.data.birthDate.day === today.day;
        
    // Получаем всех пользователей
        
    Context.data.polzovateli await System.users.search().size(10000).all(); //добавлен метод size с аргументом 10000
        // Фильтруем пользователей и записываем в контекст тех, у кого сегодня день рождения
        
    Context.data.imeninniki Context.data.polzovateli.filter(isBirthdayToday);
    }
    В случае, если у вас более 10000 пользователей требуется разбить поиск на порции.
  12. v.sabirov

    v.sabirov Участник

    Точно, всё заработало, спасибо!!! Просто поиск не доходил до именинника, и до меня не дошло)
  13. shumovskayaam

    shumovskayaam Новичок

    Добрый день. У меня не находит именинников((
  14. aleksander-lead

    aleksander-lead Участник

    Тоже пробовал повторить описанное. Не сработало. Может быть, по возможности может кто-то подсказать? Как в итоге реализовать данную возможность? Хотелось бы в системе видеть уведомления и напоминания и по дням рождения сотрудников и по дням рождения клиентов.
  15. olegsykarev

    olegsykarev Новичок

    Скорей всего Вы переменные не поменяли.
    Вот так надо:


    async function findBirthdays(): Promise<void> { // Асинхронная функция для поиска пользователей, у которых сегодня день рождения
    const today = new Datetime(); // Получение текущей даты
    const isBirthdayToday = (user: UserItem): boolean => // Определение функции для проверки, является ли текущий день днем рождения пользователя
    user.data.birthDate !== undefined // Убедиться, что у пользователя указана дата рождения
    && user.data.birthDate.month === today.month // Сравнить месяцы
    && user.data.birthDate.day === today.day; // Сравнить дни
    Context.data.all_users = await System.users.search().size(1000).all(); // Получить список всех пользователей (до 1000)
    Context.data.birthday_today = Context.data.all_users.filter(isBirthdayToday); // Отфильтровать пользователей, у которых сегодня день рождения
  16. olegsykarev

    olegsykarev Новичок

    [​IMG]
    Еще чуток допилили: теперь дополнительно раз в месяц, первого числа текущего месяца, выводится весь список именинников.

    async function findBirthdays(): Promise<void> { // функция для поиска пользователей, у которых сегодня день рождения
    const today = new Datetime(); // Получение текущей даты
    const isBirthdayToday = (user: UserItem): boolean => // Определение функции для проверки, является ли текущий день днем рождения пользователя
    user.data.birthDate !== undefined // Убедиться, что у пользователя указана дата рождения
    && user.data.birthDate.month === today.month // Сравнить месяцы
    && user.data.birthDate.day === today.day; // Сравнить дни
    Context.data.all_users = await System.users.search().size(1000).all(); // Получить список всех пользователей (до 1000)
    Context.data.birthday_today = Context.data.all_users.filter(isBirthdayToday); // Отфильтровать пользователей, у которых сегодня день рождения
    }

    async function monthBirthday(): Promise<void> { // функция для фильтрации пользователей с днем рождения в текущем месяце
    const today = new Datetime(); // Получаем текущую дату
    if (today.day !== 1) { // Проверяем, является ли сегодня первое число месяца
    return; // Если не первое число, выходим из функции
    }
    Context.data.all_users = await System.users.search().size(1000).all(); // Получаем список всех пользователей, ограничивая количество до 1000
    // Функция для проверки, есть ли день рождения у пользователя в текущем месяце и не заблокирован ли он
    const isBirthdayThisMonth = (user: UserItem): boolean =>
    user.data.birthDate !== undefined // Проверяем, указана ли дата рождения
    && user.data.birthDate.month === today.month // Сравниваем месяц даты рождения с текущим месяцем
    && !user.data.isBlocked; // Проверяем, что пользователь не заблокирован
    // Фильтрация пользователей с днем рождения в текущем месяце
    Context.data.birthday_month = Context.data.all_users.filter(isBirthdayThisMonth);
    }
  17. labin.pavel

    labin.pavel Новичок

    У меня заработало вот в таком виде:

    1.Схема и настройка блока "Сценарий"

    [​IMG]

    2 Настройка шлюза

    Не забудьте условия перехода (настраивается шлюз\переходы\оповещение на email 1\вкладка условия перехода поставить Именинники - не пустое значение)

    [​IMG] 3.Вкладка контекст

    [​IMG] 4. Вкладка сценарий

    [​IMG] Дублирую текстом

    async function findBirthdays(): Promise<void> {

    // Получаем текущую дату

    const today = new Datetime();

    // Создаем функцию для сравнения дня рождения пользователя с текущей датой

    const isBirthdayToday = (user: UserItem): boolean =>

    user.data.birthDate !== undefined

    && user.data.birthDate.month === today.month

    && user.data.birthDate.day === today.day;

    // Получаем всех пользователей

    Context.data.all_users = await System.users.search().size(10000).all(); //добавлен метод size с аргументом 10000

    // Фильтруем пользователей и записываем в контекст тех, у кого сегодня день рождения

    Context.data.birthday_today = Context.data.all_users.filter(isBirthdayToday);

    }