627 lines
46 KiB
Markdown
627 lines
46 KiB
Markdown
# Настройка внутрисистемных уведомлений
|
||
|
||
На проекте есть возможность настроить уведомления для пользователей. Для этого необходимо произвести настройку (сделаем на примере оповещения о начале отпуска по основному месту работы). Пользователь должен обладать правами Администратора.
|
||
|
||
## Конструктор документов
|
||
|
||
* Перейдите _Администрирование - Документооборот - Кадровый ЭДО - Конструктор документов_
|
||
|
||

|
||
|
||
В открывшемся реестре проверьте, не присутствует ли уже добавленный ранее шаблон "Уведомления Lexema". Если присутствует, то пропустите шаг по по созданию конструктора документов и перейдите в раздел [Справочник рассылок для документа Уведомление Lexema](#справочник_рассылок_для_документа_уведомление_lexema). Данный шаблон конструктора должен быть в единичном экземпляре. Если он отсутствует, то его необходимо создать. Для этого в реестре шаблонов нажмите **Создать**. Подробнее про конструктор документов можно узнать в статье [Конструктор документов](../Конструктор документов/Конструктор документов.md).
|
||
|
||
В поле **Группа** выберите **Уведомления Lexema**. Если она отсутствует, то ее необходимо создать в [Настройках документов](./../Настройка документов/Настройка документов.md)
|
||
|
||
В поле **Служебное наименование** введите **NotificationLexema**.
|
||
|
||
В поле **Подтип документа** выберите **Уведомления Lexema**. Если такого подтипа нет, его необходимо [создать](../Справочники/Документооборот/Подтипы документов/Подтипы документов.md). Настройка документов относится к полю Группа (см. комм. выше).
|
||
|
||
Поставьте галочку напротив **Автоматически формировать маршрут**.
|
||
|
||
Нажмите сохранить и закрыть.
|
||
|
||
{: .zoom}
|
||
|
||
## Справочник рассылок для документа Уведомление Lexema
|
||
Данный документ предназначен для формирования рассылки уведомлений для действующего/применяемого для определённого набора сотрудников. С помощью данного справочника в системе электронного документооборота можно направлять пользователям уведомления, и они будут находиться у них в панели документооборота как напоминание. В справочнике содержатся преднастроенные задачи, которые можно по необходимости включать и выключать на проекте. При необходимости появления новой задачи для рассылки её вносят в справочник рассылок.
|
||
|
||
Для создания рассылки, перейдите _Администрирование - Рассылка электронных писем - Справочник рассылок для документа Уведомление Lexema._
|
||
|
||

|
||
|
||
В открывшемся реестре нажмите кнопку **"Создать"**.
|
||
|
||
### Настройки
|
||
|
||
В открывшейся вкладке необходимо заполнить следующие поля:
|
||
|
||
**Подтип документов** - из выпадающего списка выбирается подтип документа, по которому будет действовать справочник рассылок.
|
||
|
||
**Наименование задачи**, которое будет отображаться в качестве названия задачи.
|
||
|
||
Состояние **"Включено"** данного реквизита означает выполнение задачи в планировщике, если галочка не стоит,значит задача выполняться не будет.
|
||
|
||
**Проверять отправку уведомления в течение дней:** проверяет в течение определенного количества дней ушло ли уведомление пользователю. Проверка осуществляется с помощью таблицы уведомлений. Она находится в процедуре, которая вызывается при отработке ее в планировщике задач.
|
||
|
||
В блоке **Настройка расписания рассылки** выбирается, в какой день недели какого месяца и т.д. будет выполняться рассылка
|
||
|
||
В **тексте задачи** указывается часть с динамическим запросом, содержащим непосредственно текст для генерации документа.
|
||
|
||
Пример:
|
||
|
||
```
|
||
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker", "DateBeg", "Days", "TypeVacation", "Vacation", "DateEnd", "CopyTo", "txtSMS", "txtTelegram")
|
||
select pc_ch."Code" as "User", null as "txt",
|
||
p."VCode" as "link",p."TypeName", null /*case when "TypeName" = 'Base.RP_DocVacationChanges' then 'Переносы отпусков' else 'График отпусков' end*/,
|
||
null, /*'Уведомление работника о времени начала отпуска',*/
|
||
m."IdWorker", coalesce(m."DateBegPer",m."DateBeg")::date, coalesce(m."DaysPer",m."Days"), m."HolidayTypeGuid", coalesce(tw."Name",ex.name1c), coalesce(m."DateEndPer",m."DateEnd") , null, null as "txtSMS", null as "txtTelegram"
|
||
from aw."RP_DocVacation" p
|
||
join aw."RP_WorkerVacation" m on p."VCode" = m."Pcode"
|
||
cross join (select (now() + '8 day'::interval)::date as bd, (now() + '8 day'::interval)::date as ed ) dt
|
||
cross join (select "LocationProtocol" || '//' || "LocationHostName" as "link_txt" from comdoc."DocflowSettings") l
|
||
join rp."RP_Worker" w_ch on w_ch."VCode" = m."IdWorker"
|
||
join rp."RP_Person" p_ch on w_ch."IdPerson" = p_ch."VCode"
|
||
join rp."RP_PersonContact" pc_ch on p_ch."VCode" = pc_ch."Pcode" and pc_ch."IdTypeContact" = 6
|
||
left join odata.exchange1cguids ex on m."HolidayTypeGuid" = ex.guid and ex.atype = 'TypeVacation' and ex.corg= p."COrg"
|
||
left join aw."VTypeTimeWork" tw on m."TypeVacation" = tw."VCode"
|
||
where p."COrg" <> 4 and
|
||
coalesce(m."DateBegPer",m."DateBeg")>= dt.bd and coalesce(m."DateBegPer",m."DateBeg") <=dt.ed and
|
||
not exists (select 1
|
||
from "dfd"."UniversalDocument" AS "ud"
|
||
join comdoc."ReadListItem" "rl" on "ud"."VCode" = "rl"."DocCode"
|
||
join comdoc."DocflowLink" "dl" on "dl"."DocCode2" = p."VCode" and "dl"."DocCode1" = "ud"."VCode"
|
||
join dfd."DocumentAdditionalAttribute" atr on "ud"."VCode" = atr."PCode"
|
||
join dfd."DocumentCategoryAttributeType" atrtype on "atr"."CategoryAttributeType" = atrtype."VCode" and "ud"."DocumentCategory" = atrtype."PCode" and atrtype."AttributeType" = 'Date' and atrtype."ColumnName" = '#bdate#'
|
||
where "rl"."DocflowUser" = pc_ch."Code" and
|
||
"ud"."TypeName" = 'NotificationLexema' and
|
||
atr."DateValue" = coalesce(m."DateBegPer",m."DateBeg")
|
||
--"ud"."Text" like '%'|| to_char(coalesce(m."DateBegPer",m."DateBeg")::date, 'DD.MM.YYYY') ||'%'
|
||
) and
|
||
w_ch."DateEDM" is not null and
|
||
w_ch."DateEnd" is null and
|
||
--проверка на созданное заявление с завершенным маршрутом, на отпуск или на перенос
|
||
not exists (select 1
|
||
from "dfd"."UniversalDocument" AS "ud"
|
||
join dfd."DocumentAdditionalAttribute" atr on "ud"."VCode" = atr."PCode"
|
||
join dfd."DocumentCategoryAttributeType" atrtype on "atr"."CategoryAttributeType" = atrtype."VCode" and "ud"."DocumentCategory" = atrtype."PCode" and atrtype."AttributeType" = 'Date' and atrtype."ColumnName" = '#bdate#'
|
||
join dfd."DocumentConstructor" dc on "ud"."DocumentCategory" = dc."VCode"
|
||
join dfd."DocumentSubtype" ds on dc."DocumentSubtype" = ds."VCode"
|
||
join comdoc."Route" r on ud."VCode" = r."DocCode" and ud."TypeName" = r."DocType" and r."RouteStatus" = 3
|
||
where "ud"."TypeName" = 'EmployeeStatement' and
|
||
"ud"."IdWorker" = m."IdWorker" and
|
||
atr."DateValue" = coalesce(m."DateBegPer",m."DateBeg") and
|
||
ds."InternalName" in ('EmployeeStatementVacation','EmployeeStatementTransperVacation') and
|
||
ud."Removed" is not true and
|
||
not exists (select 1 from dfd."CancellationAct" a where a."DocCode" = ud."VCode" and a."DocType" = ud."TypeName") and
|
||
not exists (select 1
|
||
from comdoc."Route" r
|
||
join comdoc."RouteStage" rs on r."VCode" = rs."PCode"
|
||
join comdoc."StageItem" si on rs."VCode" = si."PCode"
|
||
inner join comdoc."DocflowDocumentSettings" as sts on sts."DocType" = r."DocType"
|
||
inner join comdoc."DocflowDocumentSettingsDetail" as dfs on dfs."PCode" = sts."VCode" and
|
||
dfs."DocumentAction" = si."DocumentAction" and
|
||
dfs."DocumentStatus" = si."DocumentStatus"
|
||
where r."DocCode" = "ud"."VCode" and
|
||
r."DocType" = p."TypeName" and
|
||
dfs."NegativeStatus" is true)
|
||
)
|
||
|
||
```
|
||
|
||
Таблица **"#forInsNotification"** представляет собой список логинов и текстов сообщений:
|
||
```xml
|
||
"DocflowUser" логин пользователя, кому будет отправлено сообщение
|
||
"txt" текст сообщения
|
||
"Link" код документа для записи в Связанные документы
|
||
"DocType" тип связанного документа
|
||
"DocName" наименование связанного документа
|
||
"DocSubject" описание связанного документа
|
||
В cross join указывается количество дней за сколько до начала отпуска будет направляться уведомление (например 14)
|
||
```
|
||
|
||
После заполнения всех полей нажмите Сохранить и закрыть.
|
||
|
||
{: .zoom}
|
||
|
||
Далее необходимо настроить [задачу](https://lexema-ecm.readthedocs.io/ru/latest/Admin manuals/service/sheduler/Config/) c помощью планировщика (если не настроенно ранее) **Уведомления Lexema**.
|
||
|
||
{: .zoom}
|
||
|
||
Задача отслеживает дату начала отпуска при заданных конфигурационных параметрах, и за указанное ранее количество дней отправляет пользователю уведомление. Оно появляется в Документообороте. В данном примере указано что 03.06.2022 было отправлено уведомление о начале отпуска сотрудника с 10.06.2022.
|
||
|
||

|
||
|
||
Внутри документа будет уведомление о приближающейся дате начала отпуска. В документ можно перейти по ссылке, или по вложенным документам.
|
||
|
||
{: .zoom}
|
||
|
||
Внутри документа можно сразу создать заявление на отпуск. Для этого нажмите на кнопку "Операции" и выберите "Создать заявление от сотрудника". Автоматически откроется документ ["Заявления от сотрудника"](../../../User manuals/Кадровый ЭДО/Заявления от сотрудников.md)
|
||
|
||
{: .zoom}
|
||
|
||
### Настройки рассылки
|
||
|
||
На данной вкладке в блоке заполняется при необходимости дополнительная информация:
|
||
|
||
**Не создавать документ Уведомление** при включенной функции уведомление будет направлено только на почту пользователю, без создания документа "Уведомления".
|
||
|
||
**Email получателей** - указывается электронная почта кому необходимо направить уведомление. Чтобы добавить несколько получателей необходимо нажать кнопку "+ Получателя". Во всплывающем окне выбрать дополнительных получателей и нажать "Добавить".
|
||
|
||

|
||
|
||
**Email копия** - указывается электронная почта кому необходимо направить уведомление в копию. Добавление несколько получателей производится аналогично как добавление основных получателей.
|
||
|
||
**По вопросу** - указывается тема уведомления.
|
||
|
||
**Документ** - указывается наименование документа для отображения в системе.
|
||
|
||
**Добавить ссылку на документ** - при включенной галочке в текст уведомления добавляется ссылка на документ.
|
||
|
||
**Текст для ссылки** - в данном поле можно задавать свой текст для гиперссылки.
|
||
|
||
**Исключить пользователей из рассылки** выбираются пользователи, которые не должны получать уведомление по данной задаче.
|
||
|
||

|
||
|
||
## Ручное создание уведомления
|
||
|
||
Для ручного создания уведомления, перейдите в Меню - Кадровый документооборот. Реестры - Уведомления. В открывшемся реестре необходимо нажать кнопку "Создать".
|
||
|
||

|
||
|
||
В блоке "Основной текст" заполните необходимый текст уведомления.
|
||
|
||
{: .zoom}
|
||
|
||
В меню "Рассылка" добавьте и выберите пользователей, которым необходимо отправить уведомление, после чего нажмите кнопку "Отправить"
|
||
|
||
{: .zoom}
|
||
|
||
В документообороте у пользователя, которому было направлено уведомление, появится соответствующий документ на обработку.
|
||
|
||
{: .zoom}
|
||
|
||
Для ознакомления с данным документом нажмите на кнопку "Рассылка" после этого внутри всплывающего окна кнопку"Подтвердить ознакомление"
|
||
|
||
{: .zoom}
|
||
|
||
## Примеры рассылок
|
||
|
||
### Уведомления об отпуске на основании Графика отпусков по внешним совместителям
|
||
|
||
```
|
||
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker", "DateBeg", "Days", "TypeVacation", "Vacation", "DateEnd", "CopyTo")
|
||
select "User", "txt", "link", "TypeName", "DocName", "DocSubject"
|
||
, "IdWorker"
|
||
, "DateBeg", "Days", "TypeVacation", "Vacation", "DateEnd", "CopyTo"
|
||
from (
|
||
select distinct pc_ch."Code" as "User", '<font size="4"> </font><p style="text-align: center;">' || p_ch."Name" || ' ' || coalesce(p_ch."Father", '') || ', добрый день!</p><p style="text-align: center;"><br></p>
|
||
|
||
<p> На основании
|
||
статьи 123 Трудового кодекса Российской Федерации и согласно утвержденному графику отпусков на ' || p."Year"::text ||' год информируем о дате начала Вашего оплачиваемого отпуска (<b>' || coalesce(tw."Name",ex.name1c,'')||') </b> с <strong>' || to_char(coalesce(m."DateBegPer",m."DateBeg")::date, 'DD.MM.YYYY') || '</strong> сроком на <strong>' || coalesce(m."DaysPer",m."Days")::text
|
||
|| '</strong> календарных
|
||
дня(ей). Дата выхода на работу <strong>' ||to_char((coalesce(m."DateEndPer",m."DateEnd") + '1 day'::interval)::date, 'DD.MM.YYYY')
|
||
|| '</strong>. В случае, если дата выхода на
|
||
работу приходится на выходной день, она переносится на ближайший рабочий день.</p>
|
||
|
||
<p> </p>
|
||
|
||
<p> ВАЖНО! </p>
|
||
|
||
<p><em>В связи с
|
||
вышеизложенным Вам следует подать заявление о предоставлении отпуска для
|
||
своевременного проведения расчетов и подготовки соответствующих документов. </em></p>
|
||
|
||
<p><em>Если Вы не
|
||
планируете использовать отпуск в указанные даты, обязательно сформируйте
|
||
заявление о переносе отпуска. </em></p>
|
||
|
||
<p><strong> </strong></p>
|
||
|
||
<p><strong> Заявление на
|
||
отпуск или перенос отпуска необходимо сформировать в системе КЭДО Lexema при
|
||
помощи кнопки «Операции» на панели инструментов данного
|
||
уведомления.</strong></p>
|
||
|
||
<p><strong> </strong></p>
|
||
|
||
<p><strong> Уведомление
|
||
можно закрыть только после выполнения одного из действий.</strong></p>
|
||
|
||
<p><br>
|
||
Приятного отдыха! </p>
|
||
<font size="4"></font>' as txt,
|
||
p."VCode" as "link",p."TypeName",
|
||
null as "DocName" /*case when "TypeName" = 'Base.RP_DocVacationChanges' then 'Переносы отпусков' else 'График отпусков' end*/,
|
||
null as "DocSubject", /*'Уведомление работника о времени начала отпуска',*/
|
||
m."IdWorker", coalesce(m."DateBegPer",m."DateBeg")::date as "DateBeg", coalesce(m."DaysPer",m."Days") as "Days",
|
||
m."HolidayTypeGuid" as "TypeVacation", coalesce(tw."Name",ex.name1c) as "Vacation",
|
||
coalesce(m."DateEndPer",m."DateEnd") as "DateEnd", null as "CopyTo", "IdTypeBusy", "IdPerson"
|
||
from aw."RP_DocVacation" p
|
||
join aw."RP_WorkerVacation" m on p."VCode" = m."Pcode"
|
||
cross join (select (now() + '1 day'::interval)::date as bd, (now() + '6 day'::interval)::date as ed ) dt
|
||
cross join (select "LocationProtocol" || '//' || "LocationHostName" as "link_txt" from comdoc."DocflowSettings") l
|
||
join rp."RP_Worker" w_ch on w_ch."VCode" = m."IdWorker"
|
||
join rp."RP_WorkerMove" rpwm on rpwm."IdWorker" = w_ch."VCode"
|
||
join rp."RP_Person" p_ch on w_ch."IdPerson" = p_ch."VCode"
|
||
join rp."RP_PersonContact" pc_ch on p_ch."VCode" = pc_ch."Pcode" and pc_ch."IdTypeContact" = 6
|
||
left join odata.exchange1cguids ex on m."HolidayTypeGuid" = ex.guid and ex.atype = 'TypeVacation' and ex.corg= p."COrg"
|
||
left join aw."VTypeTimeWork" tw on m."TypeVacation" = tw."VCode"
|
||
where coalesce(m."DateBegPer",m."DateBeg")>= dt.bd and coalesce(m."DateBegPer",m."DateBeg") <=dt.ed and
|
||
not exists (select 1
|
||
from "dfd"."UniversalDocument" AS "ud"
|
||
join comdoc."ReadListItem" "rl" on "ud"."VCode" = "rl"."DocCode"
|
||
join comdoc."DocflowLink" "dl" on "dl"."DocCode2" = p."VCode" and "dl"."DocCode1" = "ud"."VCode"
|
||
where "rl"."DocflowUser" = pc_ch."Code" and
|
||
"ud"."TypeName" = 'NotificationLexema' and
|
||
"ud"."Text" like '%'|| to_char(coalesce(m."DateBegPer",m."DateBeg")::date, 'DD.MM.YYYY') ||'%')
|
||
and (rpwm."DateEnd" is null
|
||
OR (now()::date <= coalesce(rpwm."DateEnd", '2100-01-01'::date)))
|
||
and coalesce(rpwm."IdTypeBusy",1) = 3
|
||
) as v
|
||
where not exists(select 1
|
||
from aw."RP_WorkerVacation" t_wv
|
||
join rp."RP_Worker" t_w on t_w."VCode" = t_wv."IdWorker"
|
||
join rp."RP_WorkerMove" t_rpwm on t_rpwm."IdWorker" = t_w."VCode"
|
||
join rp."RP_Person" t_p on t_p."VCode" = t_w."IdPerson"
|
||
where t_p."VCode" = v."IdPerson"
|
||
and (t_rpwm."DateEnd" is null
|
||
OR (now()::date <= coalesce(t_rpwm."DateEnd", '2100-01-01'::date)))
|
||
and v."DateBeg" = coalesce(t_wv."DateBegPer",t_wv."DateBeg")
|
||
and v."Days" = coalesce(t_wv."DaysPer",t_wv."Days")
|
||
and coalesce(t_rpwm."IdTypeBusy",1) in (1,2)
|
||
)
|
||
```
|
||
|
||
### Уведомления об отпуске на основании Графика отпусков по внутренним совместителям
|
||
|
||
```
|
||
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker", "DateBeg", "Days", "TypeVacation", "Vacation", "DateEnd", "CopyTo")
|
||
select pc_ch."Code" as "User", '<font size="4"> </font><p style="text-align: center;">' || p_ch."Name" || ' ' || coalesce(p_ch."Father", '') || ', добрый день!</p><p style="text-align: center;"><br></p>
|
||
|
||
<p> На основании
|
||
статьи 123 Трудового кодекса Российской Федерации и согласно утвержденному графику отпусков на ' || p."Year"::text ||' год информируем о дате начала Вашего оплачиваемого отпуска (<b>' || coalesce(tw."Name",ex.name1c,'')||') </b> с <strong>' || to_char(coalesce(m."DateBegPer",m."DateBeg")::date, 'DD.MM.YYYY') || '</strong> сроком на <strong>' || coalesce(m."DaysPer",m."Days")::text
|
||
|| '</strong> календарных
|
||
дня(ей). Дата выхода на работу <strong>' ||to_char((coalesce(m."DateEndPer",m."DateEnd") + '1 day'::interval)::date, 'DD.MM.YYYY')
|
||
|| '</strong>. В случае, если дата выхода на
|
||
работу приходится на выходной день, она переносится на ближайший рабочий день.</p>
|
||
|
||
<p> </p>
|
||
|
||
<p> ВАЖНО! </p>
|
||
|
||
<p><em>В связи с
|
||
вышеизложенным Вам следует подать заявление о предоставлении отпуска для
|
||
своевременного проведения расчетов и подготовки соответствующих документов. </em></p>
|
||
|
||
<p><em>Если Вы не
|
||
планируете использовать отпуск в указанные даты, обязательно сформируйте
|
||
заявление о переносе отпуска. </em></p>
|
||
|
||
<p><strong> </strong></p>
|
||
|
||
<p><strong> Заявление на
|
||
отпуск или перенос отпуска необходимо сформировать в системе КЭДО Lexema по
|
||
соответствующей операции через кнопку «Операции» на панели инструментов данного
|
||
уведомления.</strong></p>
|
||
|
||
<p><strong> </strong></p>
|
||
|
||
<p><strong> Уведомление
|
||
можно закрыть только после выполнения одного из действий.</strong></p>
|
||
|
||
<p><br>
|
||
Приятного отдыха! </p>
|
||
<font size="4"></font>' as txt,
|
||
p."VCode" as "link",p."TypeName",
|
||
null /*case when "TypeName" = 'Base.RP_DocVacationChanges' then 'Переносы отпусков' else 'График отпусков' end*/,
|
||
null, /*'Уведомление работника о времени начала отпуска',*/
|
||
m."IdWorker",
|
||
coalesce(m."DateBegPer",m."DateBeg")::date as "DateBeg", coalesce(m."DaysPer",m."Days") as "Days",
|
||
m."HolidayTypeGuid", coalesce(tw."Name",ex.name1c), coalesce(m."DateEndPer",m."DateEnd") as "DateEnd", null as "CopyTo"
|
||
from aw."RP_DocVacation" p
|
||
join aw."RP_WorkerVacation" m on p."VCode" = m."Pcode"
|
||
cross join (select (now() + '1 day'::interval)::date as bd, (now() + '6 day'::interval)::date as ed ) dt
|
||
cross join (select "LocationProtocol" || '//' || "LocationHostName" as "link_txt" from comdoc."DocflowSettings") l
|
||
join rp."RP_Worker" w_ch on w_ch."VCode" = m."IdWorker"
|
||
join rp."RP_Person" p_ch on w_ch."IdPerson" = p_ch."VCode"
|
||
join rp."RP_PersonContact" pc_ch on p_ch."VCode" = pc_ch."Pcode" and pc_ch."IdTypeContact" = 6
|
||
left join odata.exchange1cguids ex on m."HolidayTypeGuid" = ex.guid and ex.atype = 'TypeVacation' and ex.corg= p."COrg"
|
||
left join aw."VTypeTimeWork" tw on m."TypeVacation" = tw."VCode"
|
||
where coalesce(m."DateBegPer",m."DateBeg")>= dt.bd and coalesce(m."DateBegPer",m."DateBeg") <=dt.ed and
|
||
not exists (select 1
|
||
from "dfd"."UniversalDocument" AS "ud"
|
||
join comdoc."ReadListItem" "rl" on "ud"."VCode" = "rl"."DocCode"
|
||
join comdoc."DocflowLink" "dl" on "dl"."DocCode2" = p."VCode" and "dl"."DocCode1" = "ud"."VCode"
|
||
where "rl"."DocflowUser" = pc_ch."Code" and
|
||
"ud"."TypeName" = 'NotificationLexema' and
|
||
"ud"."Text" like '%'|| to_char(coalesce(m."DateBegPer",m."DateBeg")::date, 'DD.MM.YYYY') ||'%')
|
||
and 2 = coalesce((select "IdTypeBusy"
|
||
from rp."RP_WorkerMove" rpwm
|
||
where rpwm."IdWorker" = w_ch."VCode"
|
||
and (rpwm."DateEnd" is null
|
||
OR (now()::date <= coalesce(rpwm."DateEnd", '2100-01-01'::date)))
|
||
limit 1)
|
||
, 1)
|
||
```
|
||
|
||
### Документы не пришедшие на подписание в систему из 1С
|
||
|
||
```
|
||
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker")
|
||
select distinct rlU."DocflowUser" , 'Следующие документы не пришли на подписание из 1С: : <br/>' ||
|
||
string_agg(dd."txt", ', <br/>') ,
|
||
null::bigint as "link", 'Первичный документ', 'Первичный документ',
|
||
'Информационное сообщение о документах, не пришедших из 1С',
|
||
(select w."VCode"
|
||
from rp."RP_Worker" w
|
||
join rp."RP_PersonContact" pc on w."IdPerson" = pc."Pcode" and pc."IdTypeContact" = 6 and pc."Code" = rlU."DocflowUser"
|
||
order by w."DateBeg" desc
|
||
limit 1
|
||
) as "IdWorker"
|
||
from (
|
||
select r."name1c" || ' ' || "Workers" || ' (' || to_char(r."WDate"::date, 'DD.MM.YYYY') || ')' || '<a href=' || l."link_txt" || '#/view/'|| r."TypeName" ||'Form' ||'/' || r."VCode" || '> перейти ' || l."link_txt" || '#/view/'|| r."TypeName" ||'Form' ||'/' || r."VCode" || '</a>' as txt
|
||
from odata."getExchange1CGuidsRegistry"(null, null, null, null, null, null, null, null, null, null) r
|
||
cross join (select "LocationProtocol" || '//' || "LocationHostName" as "link_txt" from comdoc."DocflowSettings") l
|
||
where r."VCode" is not null and
|
||
r."DFS_VCode" is null and
|
||
r."guid" is not null and
|
||
r.name1c not ilike '%больнич%' and
|
||
r. "DocumentDate" >= '20221001')
|
||
dd
|
||
join comdoc."ReadListGroup" rl on rl."Name" = 'Рассылка для менеджера по персоналу' and rl."DocTypes" ilike '%NotificationLexema%'
|
||
join comdoc."ReadListGroupUsers" rlU on rl."VCode" = rlU."PCode"
|
||
group by rlU."DocflowUser"
|
||
```
|
||
!!! Примечание
|
||
В строке `join comdoc."ReadListGroup" rl on rl."Name" = 'Рассылка для менеджера по персоналу'` указывается наименование [группы рассылки](../Справочники/Документооборот/Группы рассылки/Группы рассылки.md)
|
||
|
||

|
||
|
||
### Напоминание об обработке документа руководителю на этапе "Согласование"
|
||
|
||
```
|
||
with "approve" as
|
||
( select distinct r."Initiator", i."StageUser", r."DocName", i."BeginDate",
|
||
i."ActionDate", i."DaysForAction", r."DocType",
|
||
(select "LocationProtocol" || '//' || "LocationHostName" || coalesce(':'||"LocationPort",'') from comdoc."DocflowSettings" order by "CDate" desc limit 1)
|
||
|| '/#/view/' || se."DocForm" || '/' || r."DocCode" as "ref",
|
||
r."DocCode",
|
||
false as "Terminal", coalesce(dd."COrg", comdoc."getFilial"()) as "Org"
|
||
from comdoc."StageItem" i
|
||
join comdoc."RouteStage" st on st."VCode" = i."PCode"
|
||
join comdoc."Route" r on r."VCode" = st."PCode"
|
||
join dfd."UniversalDocument" dd on r."DocCode" = dd."VCode" AND r."DocType" = dd."TypeName"
|
||
join comdoc."DocflowUser" du on i."StageUser" = du."UserName"
|
||
join comdoc."DocflowUser" dui on r."Initiator" = dui."UserName"
|
||
join comdoc."DocflowDocumentSettings" se on r."DocType" = se."DocType"
|
||
left join dfd."DocumentConstructor" cons on dd."DocumentCategory" = cons."VCode"
|
||
|
||
where (coalesce(st."IsMarked",false)!=true)
|
||
AND r."RouteStatus" = 2
|
||
AND i."StageItemStatus" = 2
|
||
AND st."Status" = 2
|
||
and "DocumentAction"= 1
|
||
and st."StageName"='Согласование руководителем'
|
||
)
|
||
|
||
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker")
|
||
|
||
select a."StageUser" as "DocflowUser",
|
||
|
||
'Добрый день, ' || '<b> '|| du."SmallName" ||' </b>' ||'. <br>' ||
|
||
|
||
'<br> Вам поступил документ на обработку.'||
|
||
'<br> Организация: ' || f."Name" ||
|
||
'<br> Задача: Согласовать' ||
|
||
'<br> Документ: ' || a."ref" ||
|
||
'<br> Предыдущий этап маршрута: Инициатор '
|
||
'<br>' || dui."SmallName" || '- Подписан ЭП '
|
||
as "txt",
|
||
null as "Link", null as "DocType", a."DocName" as "DocName", --это для физ уведомления
|
||
'Lexema. ' || f."Name" || 'Согласовать. ' || a."DocName" as "DocSubject",
|
||
|
||
(select w."VCode"
|
||
from rp."RP_Worker" w
|
||
join rp."RP_PersonContact" pc on w."IdPerson" = pc."Pcode" and pc."IdTypeContact" = 6 and pc."Code" = a."StageUser"
|
||
order by w."DateBeg" desc
|
||
limit 1
|
||
) as "IdWorker"
|
||
from "approve" a
|
||
join comdoc."DocflowUser" du on a."StageUser" = du."UserName"
|
||
join comdoc."DocflowUser" dui on a."Initiator" = dui."UserName"
|
||
join comdoc."VFilials" f on a."Org" = f."VCode"
|
||
where now() > a."BeginDate" + '2 hour'::interval
|
||
and a."StageUser" = 'HRDirector'
|
||
;
|
||
```
|
||
!!! Примечание
|
||
В строке `and st."StageName"='Согласование руководителем'` - указывается название этапа в [шаблоне маршруте](../Настройка шаблонов маршрутов/Настройка шаблонов маршрутов.md).
|
||
|
||
В строке `and a."StageUser" = 'HRDirector'` - указывается логин пользователя руководителя
|
||
|
||
|
||

|
||
|
||
### Об окончании испытательного срока
|
||
|
||
В настройках учетной политики необходимо указать константу **СЭД_Уведомления_Предупреждение_об_окончании_испытательного_срока** и заполнить значение в календарных дней.
|
||
|
||

|
||
|
||
```
|
||
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker")
|
||
select distinct rlU."DocflowUser" , '<font size="3"> <b>Уведомляем об окончании испытательного срока сотрудников : </b> <br/>' ||
|
||
string_agg(dd."txt", ', <br/>') || '</font>' ,
|
||
null::bigint as "link", 'Первичный документ', 'Первичный документ',
|
||
'Инф. сообщение об окончании испыт. срока',
|
||
(select w."VCode"
|
||
from rp."RP_Worker" w
|
||
join rp."RP_PersonContact" pc on w."IdPerson" = pc."Pcode" and pc."IdTypeContact" = 6 and pc."Code" = rlU."DocflowUser"
|
||
order by w."DateBeg" desc
|
||
limit 1
|
||
) as "IdWorker"
|
||
from (select w."NameFull" || ' ' || coalesce(w."NumTab", '') || ' (' || coalesce(dep."Name", '') || case when coalesce(wm."IdPost",0) <>0 then ', ' else '' end || coalesce(post."Name", '') || case when coalesce(wm."IdPost",0) <>0 or coalesce(wm."IdDepartment",0) > 0 then ', ' else '' end || ' Испыт.срок: ' || wm."Probation"::text || 'мес. Дата приема: '||to_char(w."DateBeg", 'DD.MM.YYYY') || ')' as txt
|
||
from rp."RP_Worker" w
|
||
join rp."RP_WorkerMove" wm on w."VCode" = wm."IdWorker" and now() between coalesce(wm."DateBeg", '20010101') and coalesce(wm."DateEnd", '20700101')
|
||
left join comdoc."Department" dep on wm."IdDepartment" = dep."VCode"
|
||
left join rp."RP_Post" post on wm."IdPost" = post."VCode"
|
||
LEFT JOIN LATERAL comdoc."getAccountingConstantValues"(w."COrg", 'СЭД_Уведомления_Предупреждение_об_окончании_испытательного_срока', NULL) cv on true
|
||
where now() between (w."DateBeg" + (wm."Probation"::text || ' month')::interval) - (coalesce(cv."valueConst",14)||' day')::interval and (w."DateBeg" + (wm."Probation"::text || ' month')::interval) and
|
||
w."DateEnd" is null and
|
||
coalesce(wm."Probation",0) > 0
|
||
)
|
||
dd
|
||
join comdoc."ReadListGroup" rl on rl."Name" = 'Рассылка для менеджера по персоналу' and rl."DocTypes" ilike '%NotificationLexema%'
|
||
join comdoc."ReadListGroupUsers" rlU on rl."VCode" = rlU."PCode"
|
||
group by rlU."DocflowUser"
|
||
|
||
```
|
||
!!! Примечание
|
||
В строке `join comdoc."ReadListGroup" rl on rl."Name" = 'Рассылка для менеджера по персоналу'` указывается наименование [группы рассылки](../Справочники/Документооборот/Группы рассылки/Группы рассылки.md)
|
||
|
||

|
||
|
||
### Отсутствие планового графика отпусков по подразделению
|
||
|
||
В настройках учетной политики необходимо указать константу **срок подготовки планового графика отпусков** и заполнить значение в календарных дней за сколько дней направлять руководителю уведомление.
|
||
|
||
```
|
||
with "chiefStruct" as
|
||
(select * from vac."SendingLateApplicationNotice"())
|
||
insert into "#forInsNotification" ("DocflowUser","CopyTo", "txt")
|
||
select /*main."ChiefLogin"*/ 'Loginovasa@lexema.ru', (select DISTINCT string_agg(coalesce(ch."ChiefLogin",''),', ') from "chiefStruct" ch
|
||
where ch."IdWorker" = main."Chief" and main."ChiefLogin"<>coalesce(ch."ChiefLogin",'')),
|
||
'Добрый день, ' || '<b>'||RTRIM(coalesce(du."FirstName",'') || ' ' || coalesce(du."MiddleName",''))||'</b>' ||
|
||
'. <br><br>' ||
|
||
'<br> По следующим сотрудникам не сформированы заявки на отпуск на '||main."planYear"::text||' год:'||
|
||
'<br><br>' ||
|
||
replace(
|
||
replace(replace(
|
||
'<table style = "border-collapse:collapse">
|
||
<tr>
|
||
<th style="text-align:center; border-left: 1px solid black; border-right: 1px solid black; border-bottom: 1px solid black; border-top: 1px solid black">Организация</th>
|
||
<th style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black; border-top: 1px solid black">Подразделение</th>
|
||
<th style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black; border-top: 1px solid black">Работник</th>
|
||
<th style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black; border-top: 1px solid black">Должность</th>
|
||
</tr>'||
|
||
(SELECT DISTINCT string_agg(x."link", '')
|
||
FROM(select '<tr><td style="text-align:center; border-left: 1px solid black; border-right: 1px solid black; border-bottom: 1px solid black">'||fil||'</td>
|
||
<td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black">'||dep||'</td>
|
||
<td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'||fio||'</td>
|
||
<td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'||post||'</td>
|
||
</tr>' as "link" from (select distinct f."Name" as fil, coalesce(dep."Name",'') as "dep", coalesce(w."NameShort",w."NameFull",'') as fio , coalesce(rp."Name",'') as post
|
||
from "chiefStruct" p2
|
||
left join rp."RP_Worker" w on w."VCode" = p2."IdWorker"
|
||
left join comdoc."Department" dep on dep."VCode" = p2."IdDepartment"
|
||
left join rp."RP_Post" rp on rp."VCode" = p2."IdPost"
|
||
left join comdoc."VFilials" f on w."COrg" = f."VCode"
|
||
where coalesce(p2."ChiefLogin",'') = coalesce(main."ChiefLogin",'')) qw
|
||
order by fil, "dep", fio ) as x)||'</table>'
|
||
,'<','<'),'>','>'),
|
||
'&','&') as "Body"
|
||
from "chiefStruct" main
|
||
inner join comdoc."DocflowUser" du on main."ChiefLogin" = du."UserName"
|
||
group by main."Chief", coalesce(du."FirstName",''), coalesce(du."MiddleName",''), main."ChiefLogin", main."planYear";
|
||
```
|
||
|
||

|
||
|
||
### Оповещение о необходимости замены паспорта
|
||
|
||
```
|
||
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker")
|
||
select distinct pc."Code" , '<font size="3"> <b>Настоящим сообщаем, что приближается срок замены паспорта </b> <br/>' || '</font>' ,
|
||
null::bigint as "link", '', '',
|
||
'Инф. сообщение о замене паспорта',
|
||
w."VCode" as "IdWorker"
|
||
from rp."RP_Person" p
|
||
join rp."RP_Worker" w on p."VCode" = w."IdPerson"
|
||
join rp."RP_WorkerMove" wm on w."VCode" = wm."IdWorker" and now() between coalesce(wm."DateBeg", '20010101') and coalesce(wm."DateEnd", '20700101')
|
||
left join comdoc."Department" dep on wm."IdDepartment" = dep."VCode"
|
||
left join rp."RP_Post" post on wm."IdPost" = post."VCode"
|
||
left join rp."RP_PersonContact" pc on p."VCode" = pc."Pcode" and pc."IdTypeContact" = 6
|
||
LEFT JOIN LATERAL comdoc."getAccountingConstantValues"(w."COrg", 'СЭД_Уведомления_Сообщения_о_замене_паспорта', NULL) cv on true
|
||
where
|
||
now() between p."DateBirth" - (coalesce(cv."valueConst",30) || ' day')::interval + (date_part('year',age(p."DateBirth"))+1 || 'year')::interval and
|
||
p."DateBirth" + (date_part('year',age(p."DateBirth"))+1 || 'year')::interval and
|
||
date_part('year',age(p."DateBirth" - (coalesce(cv."valueConst",30) || ' day')::interval ))::int in (20,45)
|
||
|
||
```
|
||

|
||
|
||
### Сообщения о приближающемся юбилее работы в компании
|
||
|
||
```
|
||
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker")
|
||
select distinct rlU."DocflowUser" , '<font size="3"> <b>Список юбиляров : </b> <br/>' ||
|
||
string_agg(dd."txt", ', <br/>') || '</font>' ,
|
||
null::bigint as "link", '', '',
|
||
'Инф. сообщение о юбилее работы в компании',
|
||
(select w."VCode"
|
||
from rp."RP_Worker" w
|
||
join rp."RP_PersonContact" pc on w."IdPerson" = pc."Pcode" and pc."IdTypeContact" = 6 and pc."Code" = rlU."DocflowUser"
|
||
order by w."DateBeg" desc
|
||
limit 1
|
||
) as "IdWorker"
|
||
from (select w."NameFull" || ' ' || coalesce(w."NumTab", '') || ' (' || coalesce(dep."Name", '')
|
||
|| case when coalesce(wm."IdPost",0) <>0 then ', ' else '' end || coalesce(post."Name", '')
|
||
|| ' Дата приема: '||to_char(w."DateBeg", 'DD.MM.YYYY') || ')' as txt
|
||
from rp."RP_Worker" w
|
||
join rp."RP_WorkerMove" wm on w."VCode" = wm."IdWorker" and now() between coalesce(wm."DateBeg", '20010101') and coalesce(wm."DateEnd", '20700101')
|
||
left join comdoc."Department" dep on wm."IdDepartment" = dep."VCode"
|
||
left join rp."RP_Post" post on wm."IdPost" = post."VCode"
|
||
LEFT JOIN LATERAL comdoc."getAccountingConstantValues"(w."COrg", 'СЭД_Уведомления_Сообщения_о_юбилее_работы_в_компании', NULL) cv on true
|
||
where
|
||
w."DateEnd" is null and
|
||
date_part('year',age(w."DateBeg"- (coalesce(cv."valueConst",30) || ' day')::interval))::int >1 and
|
||
date_part('year',age(w."DateBeg" - (coalesce(cv."valueConst",30) || ' day')::interval))::int % 5 = 0 and
|
||
now() between w."DateBeg" - (coalesce(cv."valueConst",30) || ' day')::interval + (date_part('year',age(w."DateBeg"))+1 || 'year')::interval and
|
||
w."DateBeg" + (date_part('year',age(w."DateBeg"))+1 || 'year')::interval) dd
|
||
join comdoc."ReadListGroup" rl on rl."Name" = 'Рассылка для менеджера по персоналу' and rl."DocTypes" ilike '%NotificationLexema%'
|
||
join comdoc."ReadListGroupUsers" rlU on rl."VCode" = rlU."PCode"
|
||
group by rlU."DocflowUser"
|
||
```
|
||
|
||
!!! Примечание
|
||
В строке `join comdoc."ReadListGroup" rl on rl."Name" = 'Рассылка для менеджера по персоналу'` указывается наименование [группы рассылки](../Справочники/Документооборот/Группы рассылки/Группы рассылки.md)
|
||
|
||

|
||
|
||
### Сообщение о приближающихся юбилеях
|
||
|
||
```
|
||
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker")
|
||
select distinct rlU."DocflowUser" , '<font size="3"> <b>Список юбиляров : </b> <br/>' ||
|
||
string_agg(dd."txt", ', <br/>') || '</font>' ,
|
||
null::bigint as "link", '', '',
|
||
'Инф. сообщение о юбилярах',
|
||
(select w."VCode"
|
||
from rp."RP_Worker" w
|
||
join rp."RP_PersonContact" pc on w."IdPerson" = pc."Pcode" and pc."IdTypeContact" = 6 and pc."Code" = rlU."DocflowUser"
|
||
order by w."DateBeg" desc
|
||
limit 1
|
||
) as "IdWorker"
|
||
from (select w."NameFull" || ' ' || coalesce(w."NumTab", '') || ' (' || coalesce(dep."Name", '')
|
||
|| case when coalesce(wm."IdPost",0) <>0 then ', ' else '' end || coalesce(post."Name", '')
|
||
|| ' Дата рождения: '||to_char(p."DateBirth", 'DD.MM.YYYY') || ')' as txt
|
||
from rp."RP_Person" p
|
||
join rp."RP_Worker" w on p."VCode" = w."IdPerson"
|
||
join rp."RP_WorkerMove" wm on w."VCode" = wm."IdWorker" and now() between coalesce(wm."DateBeg", '20010101') and coalesce(wm."DateEnd", '20700101')
|
||
left join comdoc."Department" dep on wm."IdDepartment" = dep."VCode"
|
||
left join rp."RP_Post" post on wm."IdPost" = post."VCode"
|
||
LEFT JOIN LATERAL comdoc."getAccountingConstantValues"(w."COrg", 'СЭД_Уведомления_Сообщения_о_юбилярах', NULL) cv on true
|
||
where
|
||
now() between p."DateBirth" - (coalesce(cv."valueConst",30) || ' day')::interval + (date_part('year',age(p."DateBirth"))+1 || 'year')::interval and
|
||
p."DateBirth" + (date_part('year',age(p."DateBirth"))+1 || 'year')::interval and
|
||
date_part('year',age(p."DateBirth" - (coalesce(cv."valueConst",30) || ' day')::interval ))::int % 5 = 0
|
||
) dd
|
||
join comdoc."ReadListGroup" rl on rl."Name" = 'Рассылка для менеджера по персоналу' and rl."DocTypes" ilike '%NotificationLexema%'
|
||
join comdoc."ReadListGroupUsers" rlU on rl."VCode" = rlU."PCode"
|
||
group by rlU."DocflowUser"
|
||
```
|
||
|
||
!!! Примечание
|
||
В строке `join comdoc."ReadListGroup" rl on rl."Name" = 'Рассылка для менеджера по персоналу'` указывается наименование [группы рассылки](../Справочники/Документооборот/Группы рассылки/Группы рассылки.md)
|
||
|
||
 |