...

Получение сотрудника (пользователя) в БП "Нотификатор окончания испытательных сроков" в ELMA "HR"

Тема в разделе "Вопросы по платформе", создана пользователем v.sabirov, 18 ноя 2022.

  1. v.sabirov

    v.sabirov Участник

    Прошу помочь с кодом сценария. Намучался, правильного результата не получается.
    У разработчика есть готовое решение HR. Там есть БП "Нотификатор окончания испытательных сроков". Сценарий его ниже, я его немного переделал по требованию нашего ОК, так как требуется раньше извещать об окончании испытательного срока, чем 1 и 3 дня как было в исходном замысле разработчика. Также нужно чтобы вместе с оповещением БП ставил задачу сотруднику (новому Пользователю) подготовки отчета о прохождении испытательного срока. Проблема в том (для меня, по крайней мере:), что на момент приема сотрудника такого пользователя в системе нет, это пока поле ФИО приложения, а задачу через некоторое время нужно поставить уже Пользователю системы с таким же ФИО. Сценарий ниже получает ФИО сотрудников, у которых заканчивается испытательный срок, но как из этих данных получить ФИО этих Пользователей?
    async function TrialEndingSearch(): Promise<void> {
    // получение дат предупреждения за 3 и 14 дней
    const todayEndsDate = (new TDate()).addDate(0, 0, 3);
    const tomorrowEndsDate = (new TDate()).addDate(0, 0, 14);
    // поиск сотрудников, чей испытательный срок закончится через 3 или 14 дней
    const todayTrialEnds = await Namespace.app.employees.search().size(10000).where((f, g) => g.and(f.trialPeriodEndDate.lte(todayEndsDate), f.__deletedAt.eq(null))).all();
    const tomorrowTrialEnds = await Namespace.app.employees.search().size(10000).where((f, g) => g.and(f.trialPeriodEndDate.lte(tomorrowEndsDate), f.trialPeriodEndDate.gt(todayEndsDate), f.__deletedAt.eq(null))).all();
    Context.data.trialEndsTodayWorkers = [];
    Context.data.tomorrowTrialEndsWorkers = [];
    // отбор только сотрудников со статусом "на испытательном сроке"
    for (const worker of todayTrialEnds) {
    if (worker.data.__status!.code == worker.fields.__status.variants.trial.code) {
    Context.data.trialEndsTodayWorkers!.push(worker);
    }
    }

    for (const worker of tomorrowTrialEnds) {
    if (worker.data.__status!.code == worker.fields.__status.variants.trial.code) {
    Context.data.tomorrowTrialEndsWorkers!.push(worker);
    }
    }
    }
  2. fkam

    fkam Участник

    Добрый день!
    Думаю, должна быть связь Приложении сотрудников с Пользователями.
    Если нет связи, то поиск по _name в "Пользователи":
    let user = await System.users.search().where(x=>x.__name.eq(ФИО сотрудника)).first()
  3. v.sabirov

    v.sabirov Участник

    Спасибо. Когда заводится карточка сотрудника, он еще не вышел на работу, это поле типа ФИО только. А как сделать, чтобы сценарий сам подставлял ФИО, которые записаны в trialEndsTodayWorkers и tomorrowTrialEndsWorkers и возвращал список ФИО уже пользователей?
  4. fkam

    fkam Участник

    Добрый день!
    Примерно накидал вариант, попробуйте, сам еще не пробовал создавать пользователей. Только осторожно с циклом, сперва протестируйте по 1 пользователю

    Вложения:

    • users.txt
      Размер файла:
      587 байт
      Просмотров:
      12
    Последнее редактирование: 22 ноя 2022
  5. v.sabirov

    v.sabirov Участник

    Спасибо за помощь. Я правильно понимаю, что данный код создает новых пользователей? Просто это не требуется, так как пользователь уже создан к моменту окончания испытательного срока. То есть в реалии процесс выглядит как обычно. Пока сотрудник не вышел на работу, на него заводится карточка (элемент приложения) с полем типа ФИО на форме (не пользователь). Когда сотрудник выходит на работу он заводится именно как пользователь в системе. Далее проходит три месяца, процесс нотификации окончания испытательного срока (писал разработчик, код приведен выше, запускается каждый день) находит в карточках сотрудников приложения (не пользователей), у кого заканчивается испытательный срок и выдает оповещение. То есть целевая задача - находить именно уже заведенных пользователей в системе, у которых такое же ФИО, которое возвращает trialEndsTodayWorkers и tomorrowTrialEndsWorkers. А потом я сделаю процесс, который будет именно им (пользователям) ставить задачу по подготовке отчета о прохождении испытательного срока.
  6. fkam

    fkam Участник

    Поэтому вам и нужна связь сотрудника с пользователям, а ФИО не всегда уникальные.
  7. v.sabirov

    v.sabirov Участник

    Ну да. Просто код, который вы написали выше, создает пользователей, а они уже созданы к моменту запуска данного сценария.
  8. v.sabirov

    v.sabirov Участник

    Попробовал ваш код. Не работает(, показывает ошибку, выделил красным. И под "fio" нужно вручную каждый раз ФИО сотрудника из Приложения указывать?
    let users:UserItemRef[]=[];//сюда будем записывать всех пользователей
    for (let i=0; i< Context.data.trialEndsTodayWorkers.length; i++)
    {
    let row = Context.data.trialEndsTodayWorkers.data;
    let us = System.users.create();
    us.data.__name = row.fio;//ваш фио
    await us.save();
    users.push(us);
    }
    for (let i=0; i< Context.data.tomorrowTrialEndsWorkers.length; i++)
    {
    let row = Context.data.tomorrowTrialEndsWorkers.data;
    let us = System.users.create();
    us.data.__name = row.fio;//ваш фио
    await us.save();
    users.push(us);
    }
  9. fkam

    fkam Участник

    Добрый день! Тогда без data, просто i в квадратных скобках, и все. После чего можете выходить на поля вашего приложения
    UPD. Или кажется await-а не хватает перед объявлением приложения
    Последнее редактирование: 5 дек 2022
  10. v.sabirov

    v.sabirov Участник

    Кто-нибудь может подсказать как можно решить проблему. Задача сводится на самом деле, что по полю ФИО приложения найти такого пользователя в системе и вернуть в контекст.
  11. nuriahmetov

    nuriahmetov Активный участник

    Так можно
    Context.data.user = await System.users.search()
    .where((f,g) =>g.fts(fio!.lastname + ' ' + fio!.firstname + ' ' + fio!.middlename))
    .first()
  12. fkam

    fkam Участник

    не советую, так как сломается, если один из них будет пустым
  13. v.sabirov

    v.sabirov Участник

    Так и не сделал( может кто поможет?
  14. grebina

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

    Добрый день.
    Привожу пример сценария для поиска пользователей по ФИО из переменной trialEndsTodayWorkers. Аналогично можно дополнить код для переменной tomorrowTrialEndsWorkers

    Код:
    
    async function userSearch(): Promise<void> {
        
    Context.data.users = []
        if (
    Context.data.trialEndsTodayWorkers && Context.data.trialEndsTodayWorkers.length>0)
        {
           for (const 
    employees of Context.data.trialEndsTodayWorkers!) {
           
    let employeesItem await employees.fetch()//фетчим элемент массива для получения ссылки на элемент приложения
           
    let fioString ''
           
    if (employeesItem.data.fullname!.lastname && employeesItem.data.fullname!.firstname)
           {
              
    fioString employeesItem.data.fullname!.lastname " " employeesItem.data.fullname!.firstname//записываем фамилию и имя в строку
              
    if (employeesItem.data.fullname!.middlename)
              {
                  
    fioString+= " " +employeesItem.data.fullname!.middlename//добавляем отчество, если оно заполнено
              
    }
           }
          
    let user await System.users.search().where(c=>c.__name.eq(fioString)).first();//ищем пользователя по строке с ФИО
          
    Context.data.users.push(user!)//записываем в переменную типа Пользователи-Несколько
         
    }  
        
        }
    }
    В данном примере подразумевается, что в карточке сотрудника заполнена фамилия и имя, отчество - опционально.
    Найденные пользователи записываются в переменную Context.data.users типа Пользователи-Несколько
    Последнее редактирование: 2 мар 2023
  15. v.sabirov

    v.sabirov Участник

    Спасибо!!! Только ошибку выдает: "TypeError: Cannot read property 'id' of undefined",? Это где нужно поправить?
    Последнее редактирование: 6 мар 2023
  16. grebina

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

    Добрый день.
    В тексте ошибки сказано, что в сценарии осуществляется обращение к id пустого элемента, но в приведённом мной примере нет обращения к id (id вообще нигде не используется).
    Для более детального анализа ошибки рекомендуем обратиться в техническую поддержку.
  17. fkam

    fkam Участник

    Context.data.users.push(user!) - вот здесь ломается, так как пользователя не находит. Сделайте if (user)
    Context.data.users.push(user)