...

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

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

  1. v.sabirov

    v.sabirov New Member

    Прошу помочь с кодом сценария. Намучался, правильного результата не получается.
    У разработчика есть готовое решение 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 New Member

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

    v.sabirov New Member

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

    fkam New Member

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

    Вложения:

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

    v.sabirov New Member

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

    fkam New Member

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

    v.sabirov New Member

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

    v.sabirov New Member

    Попробовал ваш код. Не работает(, показывает ошибку, выделил красным. И под "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 New Member

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