Compare commits

...

4 Commits

30 changed files with 516 additions and 224 deletions

View File

@ -62,7 +62,7 @@
В форме заявки отображается такая информация как: заказчик, подразделение, организация, суть обращения и текст заявки. В форме заявки отображается такая информация как: заказчик, подразделение, организация, суть обращения и текст заявки.
![Заявка](media/zayavka.png) ![Заявка](media/screen1.png)
Во вложениях на панели инструментов инициатор прикрепляет файлы при наличии(скриншот ошибки, уточняющие документы и т.п.). Во вложениях на панели инструментов инициатор прикрепляет файлы при наличии(скриншот ошибки, уточняющие документы и т.п.).
@ -106,7 +106,9 @@
* Согласование ЗНИ. * Согласование ЗНИ.
В ЗНИ открываются 3 поля. Два из них надо заполнить при расчёте затрат: В ЗНИ открываются 3 поля. Два из них надо заполнить при расчёте затрат:
* Затраты (часов) - сколько часов чистого времени требуется для решения проблемы. * Затраты (часов) - сколько часов чистого времени требуется для решения проблемы.
* Время выполнения (часов) - сколько времени реально потребуется для решения проблемы, отсчитывая от даты согласования ЗНИ. Столько часов будет выделено Исполнителю на его этапе в маршруте. * Время выполнения (часов) - сколько времени реально потребуется для решения проблемы, отсчитывая от даты согласования ЗНИ. Столько часов будет выделено Исполнителю на его этапе в маршруте.
![Часы](media/hour.png) ![Часы](media/hour.png)
@ -131,11 +133,23 @@
После регистрации заявки, она поступает на исполнение ответственному исполнителю. После исполнения заявки, исполнитель должен заполнить "Отчет об исполнении". После регистрации заявки, она поступает на исполнение ответственному исполнителю. После исполнения заявки, исполнитель должен заполнить "Отчет об исполнении".
![Отчет](media/otchet.png) ![Отчет](media/screen2.png)
Далее он подтверждает исполнение соответствующей кнопкой в панели инструментов. Заявка направляется инициатору данной заявки на ознакомление, фактический срок исполнения проставляется автоматически, статус заявка автоматически назначается "Выполнено". Далее он подтверждает исполнение соответствующей кнопкой в панели инструментов. Заявка направляется инициатору данной заявки на ознакомление, фактический срок исполнения проставляется автоматически, статус заявка автоматически назначается "Выполнено".
![Исполнение](media/ispolnenie.png) ![Исполнение](media/ispolnenie.png)
В данной форме имеется выпадающий список с названием "Вид обращения". Через этот выпадающий список есть возможность группировать заявки в техническую поддержку. В выпадающем списке появляются варианты групп, при выборе которой можно определить данную заявку в необходимую подгруппу.
![Рисунок](media/screen3.png)
Так же подгруппы можно создавать из заявки в техническую поддержку. На скриншоте ниже видно как через "Кнопку быстрого создания" можно создать необходимую группировку.
![Рисунок](media/screen4.png)
После нажатия "Кнопки быстрого создания" откроется окошко в котором указывается наименование группировки. После чего необходимо нажать на кнопку "Сохранить" и новая группа будет отображаться в выпадающем списке.
![Рисунок](media/screen5.png)
### Статусы заявки ### Статусы заявки

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,154 @@
# Диадок
## Описание
**Диадок** — это система юридически значимого электронного документооборота. Пользователи сервиса подписывают документы квалифицированной электронной подписью и обмениваются ими с контрагентами без дублирования на бумаге.
![Рисунок](media/article14022022-1.png)
## Настройка работы Диадока
Для интеграции системы с сервисом Диадок необходимо настроить следующие библиотеки:
- Диадок
- диадок-Сервис
## Подключение библиотек
В настройках конфигурации сайта (конфиги) прописываются настройки сервиса Диадок для каждой организации. Прописываются такие параметры как:
- путь
- логин
- пароль
- ключ который предоставляется Контур.Диадок при заключении договора организации с диадоком (API-ключ для интеграции с Контур.Диадок)
Ниже приведен скрин с примером:
![Pictures](media/screen-9.png)
## Работа Диадока
Для работы Диадока необходимо настроить задания планировщика:
1. **Загрузка boxid** - это идентификаторы на которые будут отправляться и приниматься контрагенты.
2. **Обновление статусов** - считывает текущие статусы контрагента (принятые, подписанные, аннулированные и т.д).
3. **Загрузка новых событий** - факты подписания документов контрагентов и загрузка файла.
![Pictures](media/screen-1.png)
Для работы с Диадоком в Лексеме необходимо иметь определенную роль, подробнее можно ознакомиться в разделе [Технические роли](https://ecm-administrator-manuals.readthedocs.io/ru/latest/Admin%20manuals/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5%20%D1%80%D0%BE%D0%BB%D0%B8/#%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5).
В системе имеется 2 формы Диадока:
**Документы Диадока** - форма документа которая хранит все данные о том что отправляли или принимали по Диадоку.
**Реестр документа Диадока** - аналитическая форма, она необходима для оптимизированной работы документов по Диадоку.
![Pictures](media/screen-3.png)
Создание документа Диадока происходит автоматически в процессе отправки документа в Диадок. Система автоматически заполняет всю информацию по документу.
Имеется 2 вида документов Диадока:
1. **_Входящие документы_** - формируются по задачи шедулера по проверке новых событий в ящике "Диадок".
2. **_Исходящие документы_** - формируются из формы документа "Договор" и "Доп. Соглашения" к договору.
![Pictures](media/screen-2.png)
При отправке договора или доп. соглашения в Диадок, система определяем кем был подписан докумен подписью КЭП и вместе с файлом во вложении отправляется в диадок. Если на сотрудника подписавшего документ, существует дейтвующая МЧД, ЭДО то в диадок отправляется идентификатор доверенности.
После того как договор был подписан, в документ вкладывается скан-файл с типом вложения "Оригинал PDF". На каждое вложение формируется новый документ Диадок. Ему присваивается **Messageid** и **Entityid**.
??? Информация
**_Messageid_** — уникальный идентификатор, который используется для идентификации сообщений.
**_Entityid_** - это уникальный идентификатор, который используется для однозначного представления сущности (объекта) в системе или контексте, где она существует.
Чтобы отправить договор в Диадок необходимо по кнопке "Операции" в панели управления выбрать строку "Отправить документ в Диадок".
![Pictures](media/screen-4.png)
После выбора действия "Отправить документ в Диадок" в реестре "Документы Диадок" формируется новый исходящий документ, в котором автоматически заполняются информация:
- от имени какой организации отправился документ и какой организации отправился (строка идентификатор ящика отправителя)
- с какого ящика диадок отправился и на какой ящик другой организации (строка идентификатор ящика получателя)
- строка с именем файла отправленного с документом (строка файл)
![Pictures](media/screen-6.png)
Так же по кнопке "Перейти" есть возможность перейти в договор или Доп. Соглашение отправленного в Диадок.
![Pictures](media/screen-5.png)
## Настройка интеграции с Диадок
Система автоматически загрузит в раздел "Реквизиты Диадока" реквизиты контрагента по задачам загрузки **boxid**, **Guid** и таблицу с информацией о том с каким юридическим лицом интегрированы по Диадоку. Проще говоря, это те контрагенты которые приняли приглашение для обмена по Диадоку с указанным контрагентом в строке "Идентификатор участника ЭДО".
В карточке контрагента на вкладке "Настройка интеграции с Диадок" указана информация по данному контрагенту в системе Диадока:
![Pictures](media/screen-10.png)
Если необходимо указать инедтификатор участника ЭДО, отличный от того который загружен автоматически, то необходимо заполнить поле "Идентификатора" участника ЭДО. Для редактирования этого поля у пользователя должна быть роль **_responsible_accountant_diadoc_**.
- **Идентификатор участника ЭДО** - поле с запросом которое выводит реквизиты по контрагенту из Диадока
- **идентификатор участника ЭДО сверен** - чекбокс признак необходимый для того чтобы другой идентификатор не загружался в систему.
![Pictures](media/screen-6.png)
Далее необходимо нажать кнопку "Загрузить реквизиты из Диадока".
![Pictures](media/screen-7.png)
**boxid (ручной ввод)** - заполняется в ручную в случае если необходим для работы с ним один конкретный ящик, а у контрагента имеется разное множество ящиков.
**boxid (загруженный)** - строка которая заполняется автоматически при работе задачи **"Загрузка boxid ящиков Диадок контрагентов"**
![Pictures](media/screen-8.png)
??? Пример "Пример JSON формата данных контрагента"
```json
"OrgIdGuid": "0581-JHY-862",
"OrgId": "0581-JHY-8620", --Guid
"Inn": "1234567890",
"Kpp": "1234567890",
"FullName": "Акционерное общество \"Радуга\"",
"ShortName": "АО \"Радуга\"",
"JoinedDiadocTreaty": true,
"Boxes": [
{
"BoxId": "111abc654@diadoc.ru", --boxId
"BoxIdGuid": "111abc-654",
"Title": "АО \"Радуга\"",
"InvoiceFormatVersion": "v5_02",
"EncryptedDocumentsAllowed": false
}
],
"Ogrn": "1234567890",
"FnsParticipantId": "2BH47rDA", --Идентификатор учатсника ЭДО
```
При нажатии на кнопку "Операции" в документе договор или доп. соглашение, имеются две операции:
1. **Отправить в Диадок** - документ направляется в систему Диадока c помощью сервиса API, где его при необходимости возможно отредактировать.
2. **Отправить в Диадок шаблон** - отправляется шаблон документа который не возможно редактировать.
В окне "История" в панели управления документа Диадока показывается история документа, например _"Ожидается подпись контрагентом"_, _"Подписан контрагентом"_, _"Аннулирован контрагентом"_ и т.п.
![Рисунок](media/configi.jpg)
Также во вложении будет файл, который имеет подписание с двух сторон с водяным знаком.
При каждой новой отправке в Диадок система отправляет те файлы, которые не были отправлены ранее, с последней подписью КЭП.

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -206,6 +206,7 @@
**ЭЦП_количество_дней_за_сколько_отправтить_заявкуа_перевыпуск** | осуществляет автоматическую [заявку на выпуск сертификата](../Выпуск ОНЭП/index.md#Заявки-на-выпуск-ЭП) пользователям у которых закончился срок действия сертификата электронной подписи. Указывается значение количества дней по которому нужно проверять срок окончания сертификатов | | 7 **ЭЦП_количество_дней_за_сколько_отправтить_заявкуа_перевыпуск** | осуществляет автоматическую [заявку на выпуск сертификата](../Выпуск ОНЭП/index.md#Заявки-на-выпуск-ЭП) пользователям у которых закончился срок действия сертификата электронной подписи. Указывается значение количества дней по которому нужно проверять срок окончания сертификатов | | 7
**заявкаа_выпуск_сертификата_проверка_КЭП_МЧД** | Позволяет включать и отключать проверку на строку "Доверенность" в заявке на выпуск сертификата. Если константа включена то и проверка на строку (выпадающий список) "Доверенность" работает. **заявкаа_выпуск_сертификата_проверка_КЭП_МЧД** | Позволяет включать и отключать проверку на строку "Доверенность" в заявке на выпуск сертификата. Если константа включена то и проверка на строку (выпадающий список) "Доверенность" работает.
**empowerment_word_report** | Позволяет выводить QR-код в отчете доверенностей через формат Word. Отчет формата Word открывается через панель управления с помощью печатной формы. **empowerment_word_report** | Позволяет выводить QR-код в отчете доверенностей через формат Word. Отчет формата Word открывается через панель управления с помощью печатной формы.
**СЭД_ВХД_показать_кнопку_печать** | Позволяет отоброжать в тулбаре (в палени управления) кнопку "Печать" во входящих документах.
#### Автосоздание_пользователей_Регистрировать_только_согласныха_КЭДО #### Автосоздание_пользователей_Регистрировать_только_согласныха_КЭДО

View File

@ -175,7 +175,7 @@
limit 1 limit 1
) )
``` ```
<!-- ### Примеры запросов ### Примеры запросов
#### Просроченные документы #### Просроченные документы
@ -226,6 +226,8 @@
??? note "Запрос" ??? note "Запрос"
![alt text](media/image-24.png)
Основной запрос: Основной запрос:
Итоговая выборка: Итоговая выборка:
@ -297,7 +299,9 @@
В реестре отображаются документы, которые в данный момент находятся в HR службе в работе В реестре отображаются документы, которые в данный момент находятся в HR службе в работе
??? note "Запрос" ??? note "Запрос"
![alt text](media/image-25.png)
Основной запрос: Основной запрос:
@ -331,7 +335,9 @@
В реестре отображаются документы, которые были обработаны сегодня службой HR сегодня. В реестре отображаются документы, которые были обработаны сегодня службой HR сегодня.
??? note "Запрос" ??? note "Запрос"
![alt text](media/image-26.png)
Основной запрос: Основной запрос:
@ -366,6 +372,8 @@
??? note "Запрос" ??? note "Запрос"
![alt text](media/image-27.png)
Основной запрос: Основной запрос:
```sql ```sql
@ -601,7 +609,9 @@
#### Договоры и доп. соглашения #### Договоры и доп. соглашения
??? note "Запрос" ??? note "Запрос"
![alt text](media/image-29.png)
Основной запрос: Основной запрос:
@ -1235,4 +1245,103 @@
join comdoc."VFilials" f on p."COrg" = f."VCode" join comdoc."VFilials" f on p."COrg" = f."VCode"
where now()::date between coalesce(p."BeginDate",'19700101') and coalesce(p."EndDate",'20700101') where now()::date between coalesce(p."BeginDate",'19700101') and coalesce(p."EndDate",'20700101')
; ;
``` --> ```
#### Аналитическая форма по расписанию задач
??? note "Запрос"
![alt text](media/image-28.png)
Основной запрос:
```sql
INSERT INTO "tmp_calcWithBaseParams_for_documentStatusJournalProc"( "DocCode" )
select null;
```
Итоговая выборка:
```sql
insert into "tmp_finresult"( "DocCode" , "DocType" , "DocForm" , "DocTypeName", "DocName", "DocumentDate",
"AnyColumnA" , "AnyColumnB" , "AnyColumnC" , "AnyColumnD" , "AnyColumnE",
"AnyColumnF", "AnyColumnG", "AnyColumnH", "AnyColumnI", "AnyColumnJ")
select dd."Id", 'task'::text, 'taskForm'::text, ('Шедулер' || dd."Name")::text, 'Планировщик задач ' ||dd."Name" , dd."CDate"::date,
dd."Name" as "AnyColumnA" , dd."Description" as "AnyColumnB" ,
dd."Minutes" as "AnyColumnC" , dd."Hours" as "AnyColumnD" , dd."Days" as "AnyColumnE" , dd."Months" as "AnyColumnF" , dd."DaysOfTheWeek" as "AnyColumnG" ,dd. "Note" as "AnyColumnH" ,dd. "TypeTask" as "AnyColumnI"
, sum(comdoc."datediff"('minute',j."TimeStart" , j."TimeEnd"))/ count(j."Id") as "AnyColumnJ"
from (
select t."Id", t."Name", t."Description",
sh."Crontab",
max(case when s."VCode" = 1 then s."PartString" else '' end) as "Minutes",
max(case when s."VCode" = 2 then s."PartString" else '' end) as "Hours",
max(case when s."VCode" = 3 then s."PartString" else '' end) as "Days",
max(case when s."VCode" = 4 then s."PartString" else '' end) as "Months",
max(case when s."VCode" = 5 then s."PartString" else '' end) as "DaysOfTheWeek",
'по гринвичу' as "Note", 'Шедулер' as "TypeTask", t."CDate"
from lex."Task" t
join lex."Schedule" sh on t."Id" = sh."Parent"
LEFT JOIN LATERAL comdoc."LexStringToListNew"(replace(sh."Crontab",' ','Ё'),'Ё',0) s on true
join (select 1 as "VCode", 'мин.' as "Name"
union all
select 2 as "VCode", 'часы' as "Name"
union all
select 3 as "VCode", 'день' as "Name"
union all
select 4 as "VCode", 'месяц' as "Name"
union all
select 5 as "VCode", 'дни недели' as "Name"
) d on s."VCode" = d."VCode"
-- inner join lex."StepJournalEntryDetail" s on j."Id" = s."PCode"
where coalesce(t."Toggle",false) = true
group by t."Id", t."Name", t."Description", sh."Crontab", t."CDate"
)dd
left join lex."TaskJournalEntry" j on dd."Id" = j."TaskId" and j."TimeStart">= now()::date - '1 month'::interval and j."TimeEnd" is not null
--where j."TimeStart">= now()::date - '1 month'::interval and j."TimeEnd" is not null
group by dd."Id", dd."Name", dd."Description", dd."Crontab", "Minutes", "Hours", "Days", "Months", "DaysOfTheWeek", "Note", "TypeTask", dd."CDate"
union all
select t."VCode", 'NotificationLexemaDirectory'::text, 'NotificationLexemaDirectoryForm'::text , '', ( 'Задачи планировщика ' ||t."TaskName") ::text, t."CDate"::date,
t."TaskName" as "AnyColumnA" , null::text as "AnyColumnB" ,
t."Minutes" as "AnyColumnC" , t."Hours" as "AnyColumnD" , t."Days" as "AnyColumnE" , t."Months" as "AnyColumnF" , t."DaysOfTheWeek" as "AnyColumnG" ,'серверное время' as "AnyColumnH" ,'Задачи планировщика' as "AnyColumnI",
null::int as "AnyColumnJ"
from dfd."NotificationLexemaDirectory" t
where coalesce(t."Included",false) = true;
```
#### Логи отправки почты и СМС
Необходимо дополнительно настроить [задачу планировщика](../Функции%20планировщика%20задач/#переносогов_отправки_почты_и_смс_в_таблицу_sendlog)
??? note "Запрос"
![alt text](media/image-30.png)
Основной запрос:
```sql
INSERT INTO "tmp_calcWithBaseParams_for_documentStatusJournalProc"( "DocCode")
select 1 from dfd."OutgoingEmailLog" where 1 = 1
limit 1;
```
Итоговая выборка:
```sql
do $myQ$
declare _str text;
begin
_str := '
insert into "tmp_finresult"("AnyColumnA", "AnyColumnB", "AnyColumnC", "AnyColumnD", "AnyColumnE", "AnyColumnF", "AnyColumnG", "AnyColumnH", "AnyColumnI", "AnyColumnJ", "AnyColumnK", "AnyColumnL", "AnyColumnM")
select p."Level", p."type", p."To", p."Subject", p."Body", p."Cc", p."Bcc", p."phones", p."text", p."errorText",
to_char(p."CDateLog",''DD.MM.YYYY hh:mi'') as "CDateLog", p."CUserLog", p."CHostLog"
from comdoc."SendLog" p
where coalesce( p."CDateLog"::date,'_bdate'::date) between '_bdate'::date and '_edate'::date
order by p."CDateLog" desc'
_topcount ;
execute _str;
end;
$myQ$;
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

View File

@ -15,6 +15,7 @@
[Анализ плановых графиков отпусков](https://ecm-user-manuals.readthedocs.io/ru/latest/User%20manuals/Анализ%20плановых%20графиков%20сотрудников/) | analytvacationplan_read | analytvacationplan_write | [Анализ плановых графиков отпусков](https://ecm-user-manuals.readthedocs.io/ru/latest/User%20manuals/Анализ%20плановых%20графиков%20сотрудников/) | analytvacationplan_read | analytvacationplan_write |
[Анализ просроченных документов](https://ecm-user-manuals.readthedocs.io/ru/latest/User%20manuals/Анализ%20и%20отчетность/#анализ_просроченныхокументов) | | dashboardcharts_write | [Анализ просроченных документов](https://ecm-user-manuals.readthedocs.io/ru/latest/User%20manuals/Анализ%20и%20отчетность/#анализ_просроченныхокументов) | | dashboardcharts_write |
Анкета соискателя (регистрация) | registrationrequest_read | registrationrequest_write | Анкета соискателя (регистрация) | registrationrequest_read | registrationrequest_write |
Вид обращения|treatmentofdocument_read| treatmentofdocument_write|
[Вид обучения](../Вид обучения/) | stafftrainingkind_read, StaffTraining_Admin | stafftrainingkind_write, StaffTraining_Admin | [Вид обучения](../Вид обучения/) | stafftrainingkind_read, StaffTraining_Admin | stafftrainingkind_write, StaffTraining_Admin |
Виды адресов | rpdictionaries_read | super,administrator_reg_personnel,rpdictionaries_write | Виды адресов | rpdictionaries_read | super,administrator_reg_personnel,rpdictionaries_write |
Виды воинской обязанности | rpdictionaries_read | super,administrator_reg_personnel,rpdictionaries_write | Виды воинской обязанности | rpdictionaries_read | super,administrator_reg_personnel,rpdictionaries_write |
@ -48,6 +49,7 @@
[Группы рассылки](../Группы рассылки/) | readlistgroup_read | docflowAdmin,readlistgroup_admin,readlistgroup_write | [Группы рассылки](../Группы рассылки/) | readlistgroup_read | docflowAdmin,readlistgroup_admin,readlistgroup_write |
Группы учета (запас) | rpdictionaries_read | super,administrator_reg_personnel,rpdictionaries_write | Группы учета (запас) | rpdictionaries_read | super,administrator_reg_personnel,rpdictionaries_write |
[Действие обученности при смене работодателя](../Действие обученности при смене работодателя/) | activityoftraining_read, StaffTraining_Admin | activityoftraining_write, StaffTraining_Admin | [Действие обученности при смене работодателя](../Действие обученности при смене работодателя/) | activityoftraining_read, StaffTraining_Admin | activityoftraining_write, StaffTraining_Admin |
Диадок||responsible_accountant_diadoc| Роль позволяет редактировать поле "Идентификатор ЭДО" в карточке контрагента, в разделе "Настройки интеграции с Диадок"|
Доверенности | empowerment_read | empowerment_write | create_origin_pdf_empowerment - роль для формирования финальной части в формат PDF, empovermentvisibleremove, showallnotremovedempowerment - отображение кнопки "Удалить" (перевод в статус "Удаленно") внутри доверенности, **docconstructor_write** - открывает доступ к переходу в конструктор документа по данному типу/подтипу документа, **routetemplate_write** - открывает доступ к переходу в настройки шаблона маршрута по данному документу, **documentsubtype_write** - открывает доступ к переходу в настройки подтипа документа Доверенности | empowerment_read | empowerment_write | create_origin_pdf_empowerment - роль для формирования финальной части в формат PDF, empovermentvisibleremove, showallnotremovedempowerment - отображение кнопки "Удалить" (перевод в статус "Удаленно") внутри доверенности, **docconstructor_write** - открывает доступ к переходу в конструктор документа по данному типу/подтипу документа, **routetemplate_write** - открывает доступ к переходу в настройки шаблона маршрута по данному документу, **documentsubtype_write** - открывает доступ к переходу в настройки подтипа документа
Формирование вложений в доверенностях (PDF, Word)| empowerment_pdf_report, empowerment_word_report | | **empowerment_pdf_report** открывает доступ pdf отчету через печатную форму, файл вкладывается после формирования во вложения документа. **empowerment_word_report** открывает доступ к word отчету через печатную форму, сформированный отчет так же как и pdf вкладывается во вложение документа. Формирование вложений в доверенностях (PDF, Word)| empowerment_pdf_report, empowerment_word_report | | **empowerment_pdf_report** открывает доступ pdf отчету через печатную форму, файл вкладывается после формирования во вложения документа. **empowerment_word_report** открывает доступ к word отчету через печатную форму, сформированный отчет так же как и pdf вкладывается во вложение документа.
[Договоры](https://ecm-user-manuals.readthedocs.io/ru/latest/User%20manuals/%D0%94%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D1%80/) | contract_read | super,jurist,contract_write | **master_jurist** - позволяет редактировать полный, внутренний, входящий номера в договоре на любом этапе маршрута. **projects_write** предоставляет возможность создания формы «Новый проект» из документа "Договор". Открывает доступ к кнопке «Создать проект». Данная роль предоставляется пользователю, который в системе заполняет справочник проектов. видеть_конфиденциальныеоговора позволяет видеть договора с признаком "Конфиденциальность". **contract_editor** - предоставляет возможность редактировать договор в процессе согласования | [Договоры](https://ecm-user-manuals.readthedocs.io/ru/latest/User%20manuals/%D0%94%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D1%80/) | contract_read | super,jurist,contract_write | **master_jurist** - позволяет редактировать полный, внутренний, входящий номера в договоре на любом этапе маршрута. **projects_write** предоставляет возможность создания формы «Новый проект» из документа "Договор". Открывает доступ к кнопке «Создать проект». Данная роль предоставляется пользователю, который в системе заполняет справочник проектов. видеть_конфиденциальныеоговора позволяет видеть договора с признаком "Конфиденциальность". **contract_editor** - предоставляет возможность редактировать договор в процессе согласования |

View File

@ -255,244 +255,256 @@ search:
### Документы, не пришедшие из 1с ### Документы, не пришедшие из 1с
```sql ??? Задача
with "no1c"
as
(select r."COrgName" , 'таб.№ ' || r."NumTab"|| ' ' || r."Workers" as "Workers" ,r."PostWorkers" ,
r."name1c" || ' По заявлению № ' || r."DocumentNumber" || ' от ' || to_char( "DocumentDate"::date, 'DD.MM.YYYY') as "name1c"
, l."link_txt" || '#/view/'|| r."TypeName" ||'Form' ||'/' || r."VCode" as "link"
from odata."getExchange1CGuidsRegistry"(null, null, (now()::date+ '-45 day'::interval)::date , (now()::date+ '-3 day'::interval)::Date , null) r
cross join (select "LocationProtocol" || '//' || "LocationHostName" as "link_txt" from comdoc."DocflowSettings") l
where
coalesce( "DeletionMark",'false') = 'false ' and
r."VCode" is not null and
r."DFS_VCode" is null and
r."guid" is not null and
r.name1c not ilike '%больнич%'
and
r.name1c not ilike '%НДФЛ%'
and
r.name1c not ilike '%вычет%'
and
r.name1c not ilike '%мат%пом%'
and
r. "DocumentDate" >= now()::date+ '-45 day'::interval
and
r. "DocumentDate" <= now()::date+ '-3 day'::interval
)
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker")
select distinct 'Personnel' as "DocflowUser" ,
--rlU."DocflowUser" ,
'Следующие документы не пришли на подписание из 1С : <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."Body", '')
FROM(select '<tr><td style="text-align:center; border-left: 1px solid black; border-right: 1px solid black; border-bottom: 1px solid black">'|| coalesce(p2."COrgName",'')||'</td>
<td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'||coalesce(p2."Workers",'')||'</td>
<td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'||coalesce(p2."PostWorkers",'')||'</td>
<td style="text-align:center; border-left: 1px solid black; border-right: 1px solid black; border-bottom: 1px solid black">' ||
'<a href="' || coalesce(p2."link",'') || '">' ||coalesce(p2."name1c",'')|| '</a>'::text || '</td>
</tr>' as "Body" from "no1c" p2
order by p2."COrgName", p2."Workers" ) x)||'</table>'
,'&lt;','<'),'&gt;','>'),
'&amp;','&') as txt,
null::bigint as "link", 'Первичный документ', 'Первичный документ',
'Информационное сообщение о документах, не пришедших из 1С',
null::bigint as "IdWorker"
from "no1c" dd
/*join comdoc."ReadListGroup" rl on rl."Name" = 'Кадровики для рассылки документов, не пришедших из 1С'
and rl."DocTypes" ilike '%NotificationLexema%'
join comdoc."ReadListGroupUsers" rlU on rl."VCode" = rlU."PCode"*/
--group by rlU."DocflowUser"
``` ```sql
with "no1c"
as
(select r."COrgName" , 'таб.№ ' || r."NumTab"|| ' ' || r."Workers" as "Workers" ,r."PostWorkers" ,
r."name1c" || ' По заявлению № ' || r."DocumentNumber" || ' от ' || to_char( "DocumentDate"::date, 'DD.MM.YYYY') as "name1c"
, l."link_txt" || '#/view/'|| r."TypeName" ||'Form' ||'/' || r."VCode" as "link"
from odata."getExchange1CGuidsRegistry"(null, null, (now()::date+ '-45 day'::interval)::date , (now()::date+ '-3 day'::interval)::Date , null) r
cross join (select "LocationProtocol" || '//' || "LocationHostName" as "link_txt" from comdoc."DocflowSettings") l
where
coalesce( "DeletionMark",'false') = 'false ' and
r."VCode" is not null and
r."DFS_VCode" is null and
r."guid" is not null and
r.name1c not ilike '%больнич%'
and
r.name1c not ilike '%НДФЛ%'
and
r.name1c not ilike '%вычет%'
and
r.name1c not ilike '%мат%пом%'
and
r. "DocumentDate" >= now()::date+ '-45 day'::interval
and
r. "DocumentDate" <= now()::date+ '-3 day'::interval
)
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker")
select distinct 'Personnel' as "DocflowUser" ,
--rlU."DocflowUser" ,
'Следующие документы не пришли на подписание из 1С : <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."Body", '')
FROM(select '<tr><td style="text-align:center; border-left: 1px solid black; border-right: 1px solid black; border-bottom: 1px solid black">'|| coalesce(p2."COrgName",'')||'</td>
<td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'||coalesce(p2."Workers",'')||'</td>
<td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'||coalesce(p2."PostWorkers",'')||'</td>
<td style="text-align:center; border-left: 1px solid black; border-right: 1px solid black; border-bottom: 1px solid black">' ||
'<a href="' || coalesce(p2."link",'') || '">' ||coalesce(p2."name1c",'')|| '</a>'::text || '</td>
</tr>' as "Body" from "no1c" p2
order by p2."COrgName", p2."Workers" ) x)||'</table>'
,'&lt;','<'),'&gt;','>'),
'&amp;','&') as txt,
null::bigint as "link", 'Первичный документ', 'Первичный документ',
'Информационное сообщение о документах, не пришедших из 1С',
null::bigint as "IdWorker"
from "no1c" dd
/*join comdoc."ReadListGroup" rl on rl."Name" = 'Кадровики для рассылки документов, не пришедших из 1С'
and rl."DocTypes" ilike '%NotificationLexema%'
join comdoc."ReadListGroupUsers" rlU on rl."VCode" = rlU."PCode"*/
--group by rlU."DocflowUser"
```
### Задача по изменению фамилии в карточке пользователя + склонение в карточке физического лица ### Задача по изменению фамилии в карточке пользователя + склонение в карточке физического лица
```sql ??? Задача
do $$
begin
IF NOT comdoc."isTableExists"('#fio', 'temp') THEN
CREATE TEMP TABLE "#fio"("Id" bigint, "OldFam" text, "OldName" text, "OldOtch" text,
"IdPerson" bigint, "NewFam" varchar(255), "NewName" varchar(255), "NewOtch" varchar(255), "UserName" varchar(255), "Code" varchar(2550)
) ON COMMIT DROP;
END IF;
insert into "#fio"
select m."Id",m."LastName", m."FirstName", m."MiddleName", per."VCode", per."Family", per."Name", per."Father", m."UserName" , c."Code"
from lex."UserMeta" m
join rp."RP_PersonContact" c on c."IdTypeContact" = 6 and m."UserName" = c."Code"
join rp."RP_Person" per on per."VCode" = c."Pcode"
where (lower(coalesce(m."LastName",''))<> lower(coalesce(per."Family",'')) or lower(coalesce(m."FirstName",''))<> lower(coalesce(per."Name",''))
or lower(coalesce(m."MiddleName",''))<>lower(coalesce(per."Father",'')))
and (select count(a."Pc") from (select distinct c."Pcode" as "Pc" from rp."RP_PersonContact" c
join rp."RP_Person" per on per."VCode" = c."Pcode"
where c."Code" =m."UserName")a) =1;
update lex."UserMeta" m set "LastName" = q."NewFam", "FirstName" = q."NewName", "MiddleName" = q."NewOtch"
from "#fio" q
where q."Id" = m."Id";
update rp."RP_Person" per set "Note" = case when per."Note" is not null then per."Note" ||' ```sql
' else '' end ||to_char(now(),'DD.MM.YYYY') do $$
|| (select ' изменено ФИО с '||coalesce(f."OldFam",'')||' '||coalesce(f."OldName",'')||' '||coalesce(f."OldOtch",'')||' на ' begin
||coalesce(f."NewFam",'')||' '||coalesce(f."NewName",'')||' '||coalesce(f."NewOtch",'')from "#fio" f where f."IdPerson" = per."VCode" limit 1), IF NOT comdoc."isTableExists"('#fio', 'temp') THEN
"FNFAccusative" = comdoc."Lexsklon"(per."Family", per."Name", per."Father", case when per."Sex" = 1 then 'Ж' else 'M' end, 1), CREATE TEMP TABLE "#fio"("Id" bigint, "OldFam" text, "OldName" text, "OldOtch" text,
"FNFDative" = comdoc."Lexsklon"(per."Family", per."Name", per."Father", case when per."Sex" = 1 then 'Ж' else 'M' end, 0), "IdPerson" bigint, "NewFam" varchar(255), "NewName" varchar(255), "NewOtch" varchar(255), "UserName" varchar(255), "Code" varchar(2550)
"FNFGenitive" = comdoc."Lexsklon"(per."Family", per."Name", per."Father", case when per."Sex" = 1 then 'Ж' else 'M' end, 2) ) ON COMMIT DROP;
from "#fio" q END IF;
where per."VCode" = q."IdPerson"; insert into "#fio"
select m."Id",m."LastName", m."FirstName", m."MiddleName", per."VCode", per."Family", per."Name", per."Father", m."UserName" , c."Code"
from lex."UserMeta" m
join rp."RP_PersonContact" c on c."IdTypeContact" = 6 and m."UserName" = c."Code"
join rp."RP_Person" per on per."VCode" = c."Pcode"
where (lower(coalesce(m."LastName",''))<> lower(coalesce(per."Family",'')) or lower(coalesce(m."FirstName",''))<> lower(coalesce(per."Name",''))
or lower(coalesce(m."MiddleName",''))<>lower(coalesce(per."Father",'')))
and (select count(a."Pc") from (select distinct c."Pcode" as "Pc" from rp."RP_PersonContact" c
join rp."RP_Person" per on per."VCode" = c."Pcode"
where c."Code" =m."UserName")a) =1;
update lex."UserMeta" m set "LastName" = q."NewFam", "FirstName" = q."NewName", "MiddleName" = q."NewOtch"
from "#fio" q
where q."Id" = m."Id";
update rp."RP_Person" per set "Note" = case when per."Note" is not null then per."Note" ||'
' else '' end ||to_char(now(),'DD.MM.YYYY')
|| (select ' изменено ФИО с '||coalesce(f."OldFam",'')||' '||coalesce(f."OldName",'')||' '||coalesce(f."OldOtch",'')||' на '
||coalesce(f."NewFam",'')||' '||coalesce(f."NewName",'')||' '||coalesce(f."NewOtch",'')from "#fio" f where f."IdPerson" = per."VCode" limit 1),
"FNFAccusative" = comdoc."Lexsklon"(per."Family", per."Name", per."Father", case when per."Sex" = 1 then 'Ж' else 'M' end, 1),
"FNFDative" = comdoc."Lexsklon"(per."Family", per."Name", per."Father", case when per."Sex" = 1 then 'Ж' else 'M' end, 0),
"FNFGenitive" = comdoc."Lexsklon"(per."Family", per."Name", per."Father", case when per."Sex" = 1 then 'Ж' else 'M' end, 2)
from "#fio" q
where per."VCode" = q."IdPerson";
end; end;
$$; $$;
``` ```
### Оповещение о необходимости замены паспорта ### Оповещение о необходимости замены паспорта
```sql ??? Задача
insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker")
select distinct pc."Code" , '<font size="3"> <b>Настоящим сообщаем, что приближается срок замены паспорта </b> <br/>' || '</font>' , ```sql
null::bigint as "link", '', '', insert into "#forInsNotification" ("DocflowUser", "txt", "Link", "DocType", "DocName", "DocSubject", "IdWorker")
'Инф. сообщение о замене паспорта', select distinct pc."Code" , '<font size="3"> <b>Настоящим сообщаем, что приближается срок замены паспорта </b> <br/>' || '</font>' ,
w."VCode" as "IdWorker" null::bigint as "link", '', '',
from rp."RP_Person" p 'Инф. сообщение о замене паспорта',
join rp."RP_Worker" w on p."VCode" = w."IdPerson" w."VCode" as "IdWorker"
left join rp."RP_WorkerMove" wm on w."VCode" = wm."IdWorker" and now() between coalesce(wm."DateBeg", '20010101') and coalesce(wm."DateEnd", '20700101') from rp."RP_Person" p
left join comdoc."Department" dep on wm."IdDepartment" = dep."VCode" join rp."RP_Worker" w on p."VCode" = w."IdPerson"
left join rp."RP_Post" post on wm."IdPost" = post."VCode" left join rp."RP_WorkerMove" wm on w."VCode" = wm."IdWorker" and now() between coalesce(wm."DateBeg", '20010101') and coalesce(wm."DateEnd", '20700101')
left join rp."RP_PersonContact" pc on p."VCode" = pc."Pcode" and pc."IdTypeContact" = 6 left join comdoc."Department" dep on wm."IdDepartment" = dep."VCode"
LEFT JOIN LATERAL comdoc."getAccountingConstantValues"(w."COrg", 'СЭД_Уведомления_Сообщения_оамене_паспорта', NULL) cv on true left join rp."RP_Post" post on wm."IdPost" = post."VCode"
where ( left join rp."RP_PersonContact" pc on p."VCode" = pc."Pcode" and pc."IdTypeContact" = 6
now() between p."DateBirth" - (coalesce(cv."valueConst",30) || ' day')::interval + (date_part('year',age(p."DateBirth"))+1 || 'year')::interval and LEFT JOIN LATERAL comdoc."getAccountingConstantValues"(w."COrg", 'СЭД_Уведомления_Сообщения_оамене_паспорта', NULL) cv on true
p."DateBirth" + (date_part('year',age(p."DateBirth"))+1 || 'year')::interval and where (
date_part('year',age(p."DateBirth" - (coalesce(cv."valueConst",30) || ' day')::interval ))::int in (20,45) now() between p."DateBirth" - (coalesce(cv."valueConst",30) || ' day')::interval + (date_part('year',age(p."DateBirth"))+1 || 'year')::interval and
) or w."VCode" = 53 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)
) or w."VCode" = 53
```
### Оповещение о списке работников, которые не создали заявление об отпуске из уведомления ### Оповещение о списке работников, которые не создали заявление об отпуске из уведомления
```sql ??? Задача
with list as (
select ud."VCode", ud."IdWorker", atr."Value" as "Vacation", to_char(atrD."DateValue",'DD.MM.YYYY') as "DateBeg" , f."Name" as "COrgName"
from dfd."UniversalDocument" AS ud
join dfd."DocumentConstructor" dc on ud."DocumentCategory" = dc."VCode"
join dfd."DocumentSubtype" ds on dc."DocumentSubtype" = ds."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" = 'string' and atrtype."ColumnName" = '#typeVacation#'
join dfd."DocumentAdditionalAttribute" atrD on ud."VCode" = atrD."PCode"
join dfd."DocumentCategoryAttributeType" atrtypeD on atrD."CategoryAttributeType" = atrtypeD."VCode" and ud."DocumentCategory" = atrtypeD."PCode" and
atrtypeD."AttributeType" = 'Date' and atrtypeD."ColumnName" = '#bdate#'
join comdoc."VFilials" f on ud."COrg" = f."VCode"
where ud."TypeName" = 'NotificationLexema' and
ds."InternalName" = 'NotificationVacation' and
not exists (select 1
from dfd."UniversalDocument" es
join comdoc."DocflowLink" dle on ud."VCode" = dle."DocCode2" and
((dle."DocType2" = ud."TypeName" and ud."VCode" = dle."DocCode2") or
(dle."DocType1" = ud."TypeName" and ud."VCode" = dle."DocCode1")
)
where es."TypeName" = 'EmployeeStatement' ) and
atrD."DateValue" > now()::date )
insert into "#forInsNotification" ( "txt", "txtSMS", "txtTelegram") ```sql
select null as "txt", null as "txtSMS", null as "txtTelegram" with list as (
from (select ('<table><tr><th align="left">Организация</th><th align="left">Сотрудник</th><th align="left">Отпуск</th></tr>' || select ud."VCode", ud."IdWorker", atr."Value" as "Vacation", to_char(atrD."DateValue",'DD.MM.YYYY') as "DateBeg" , f."Name" as "COrgName"
(SELECT DISTINCT string_agg(x."link", '') from dfd."UniversalDocument" AS ud
FROM ( SELECT '<tr><td>' || coalesce(l."COrgName",'') || '</td><td>' || coalesce(r."NameFull",'') || '</td>' || join dfd."DocumentConstructor" dc on ud."DocumentCategory" = dc."VCode"
'<td>' || coalesce(l."Vacation", '') || ' ' || l."DateBeg" || '</td>' join dfd."DocumentSubtype" ds on dc."DocumentSubtype" = ds."VCode"
||'</tr>' as "link" join dfd."DocumentAdditionalAttribute" atr on ud."VCode" = atr."PCode"
FROM list l join dfd."DocumentCategoryAttributeType" atrtype on atr."CategoryAttributeType" = atrtype."VCode" and ud."DocumentCategory" = atrtype."PCode" and
join rp."RP_Worker" r on l."IdWorker" = r."VCode") AS x) || '</table>' atrtype."AttributeType" = 'string' and atrtype."ColumnName" = '#typeVacation#'
) ::text as "data") d join dfd."DocumentAdditionalAttribute" atrD on ud."VCode" = atrD."PCode"
``` join dfd."DocumentCategoryAttributeType" atrtypeD on atrD."CategoryAttributeType" = atrtypeD."VCode" and ud."DocumentCategory" = atrtypeD."PCode" and
atrtypeD."AttributeType" = 'Date' and atrtypeD."ColumnName" = '#bdate#'
join comdoc."VFilials" f on ud."COrg" = f."VCode"
where ud."TypeName" = 'NotificationLexema' and
ds."InternalName" = 'NotificationVacation' and
not exists (select 1
from dfd."UniversalDocument" es
join comdoc."DocflowLink" dle on ud."VCode" = dle."DocCode2" and
((dle."DocType2" = ud."TypeName" and ud."VCode" = dle."DocCode2") or
(dle."DocType1" = ud."TypeName" and ud."VCode" = dle."DocCode1")
)
where es."TypeName" = 'EmployeeStatement' ) and
atrD."DateValue" > now()::date )
таблица.столбец | описание | # для шаблона insert into "#forInsNotification" ( "txt", "txtSMS", "txtTelegram")
----------------|----------|-------------- select null as "txt", null as "txtSMS", null as "txtTelegram"
d."data" | Список | #query_list# from (select ('<table><tr><th align="left">Организация</th><th align="left">Сотрудник</th><th align="left">Отпуск</th></tr>' ||
(SELECT DISTINCT string_agg(x."link", '')
FROM ( SELECT '<tr><td>' || coalesce(l."COrgName",'') || '</td><td>' || coalesce(r."NameFull",'') || '</td>' ||
'<td>' || coalesce(l."Vacation", '') || ' ' || l."DateBeg" || '</td>'
||'</tr>' as "link"
FROM list l
join rp."RP_Worker" r on l."IdWorker" = r."VCode") AS x) || '</table>'
) ::text as "data") d
```
таблица.столбец | описание | # для шаблона
----------------|----------|--------------
d."data" | Список | #query_list#
### Отсутствие планового графика отпусков по подразделению ### Отсутствие планового графика отпусков по подразделению
```sql ??? Задача
with "chiefStruct" as
(select * from vac."SendingLateApplicationNotice"()) ```sql
insert into "#forInsNotification" ("DocflowUser","CopyTo", "txt") with "chiefStruct" as
select /*main."ChiefLogin"*/ 'Loginovasa@lexema.ru', (select DISTINCT string_agg(coalesce(ch."ChiefLogin",''),', ') from "chiefStruct" ch (select * from vac."SendingLateApplicationNotice"())
where ch."IdWorker" = main."Chief" and main."ChiefLogin"<>coalesce(ch."ChiefLogin",'')), insert into "#forInsNotification" ("DocflowUser","CopyTo", "txt")
'Добрый день, ' || '<b>'||RTRIM(coalesce(du."FirstName",'') || ' ' || coalesce(du."MiddleName",''))||'</b>' || select /*main."ChiefLogin"*/ 'Loginovasa@lexema.ru', (select DISTINCT string_agg(coalesce(ch."ChiefLogin",''),', ') from "chiefStruct" ch
'. <br><br>' || where ch."IdWorker" = main."Chief" and main."ChiefLogin"<>coalesce(ch."ChiefLogin",'')),
'<br> По следующим сотрудникам не сформированы заявки на отпуск на '||main."planYear"::text||' год:'|| 'Добрый день, ' || '<b>'||RTRIM(coalesce(du."FirstName",'') || ' ' || coalesce(du."MiddleName",''))||'</b>' ||
'<br><br>' || '. <br><br>' ||
replace( '<br> По следующим сотрудникам не сформированы заявки на отпуск на '||main."planYear"::text||' год:'||
replace(replace( '<br><br>' ||
'<table style = "border-collapse:collapse"> replace(
<tr> replace(replace(
<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> '<table style = "border-collapse:collapse">
<th style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black; border-top: 1px solid black">Подразделение</th> <tr>
<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-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>
</tr>'|| <th style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black; border-top: 1px solid black">Работник</th>
(SELECT DISTINCT string_agg(x."link", '') <th style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black; border-top: 1px solid black">Должность</th>
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> </tr>'||
<td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black">'||dep||'</td> (SELECT DISTINCT string_agg(x."link", '')
<td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'||fio||'</td> 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;">'||post||'</td> <td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black">'||dep||'</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 <td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'||fio||'</td>
from "chiefStruct" p2 <td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'||post||'</td>
left join rp."RP_Worker" w on w."VCode" = p2."IdWorker" </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
left join comdoc."Department" dep on dep."VCode" = p2."IdDepartment" from "chiefStruct" p2
left join rp."RP_Post" rp on rp."VCode" = p2."IdPost" left join rp."RP_Worker" w on w."VCode" = p2."IdWorker"
left join comdoc."VFilials" f on w."COrg" = f."VCode" left join comdoc."Department" dep on dep."VCode" = p2."IdDepartment"
where coalesce(p2."ChiefLogin",'') = coalesce(main."ChiefLogin",'')) qw left join rp."RP_Post" rp on rp."VCode" = p2."IdPost"
order by fil, "dep", fio ) as x)||'</table>' left join comdoc."VFilials" f on w."COrg" = f."VCode"
,'&lt;','<'),'&gt;','>'), where coalesce(p2."ChiefLogin",'') = coalesce(main."ChiefLogin",'')) qw
'&amp;','&') as "Body" order by fil, "dep", fio ) as x)||'</table>'
from "chiefStruct" main ,'&lt;','<'),'&gt;','>'),
inner join comdoc."DocflowUser" du on main."ChiefLogin" = du."UserName" '&amp;','&') as "Body"
group by main."Chief", coalesce(du."FirstName",''), coalesce(du."MiddleName",''), main."ChiefLogin", main."planYear"; 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";
```
```sql
call dfd."updateUsersDefaultOrganization" (null, 'Admin;EVIvaschenko')
/* 1 - коды исключен физ лиц через ;
2 - логины исключения через ; */
```
### Создание отзывов доверенностей МЧД по уволенным ### Создание отзывов доверенностей МЧД по уволенным
```sql ??? Задача
with res as (select * , ```sql
'<tr> with res as (select * ,
<td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'|| '<tr>
'<a href="' || <td style="text-align:center; border-right: 1px solid black; border-bottom: 1px solid black;">'||
(select "LocationProtocol" || '//' || "LocationHostName" || coalesce(':'||"LocationPort",'') from comdoc."DocflowSettings" order by "CDate" desc limit 1) '<a href="' ||
|| '/#/view/' || se."DocForm" || '/' || r."VCode"::text (select "LocationProtocol" || '//' || "LocationHostName" || coalesce(':'||"LocationPort",'') from comdoc."DocflowSettings" order by "CDate" desc limit 1)
|| '">' || case when r."TypeName" = 'EmpowermentRevocation' then 'Отзыв доверенности' else 'Доверенность' end || ' № ' ||coalesce(r."DocumentNumber",'') || ' от ' || to_char(r."DocumentDate",'DD.MM.YYYY') || '/#/view/' || se."DocForm" || '/' || r."VCode"::text
|| '</a>'::text ||'</td> </tr>' as "ref_link" || '">' || case when r."TypeName" = 'EmpowermentRevocation' then 'Отзыв доверенности' else 'Доверенность' end || ' № ' ||coalesce(r."DocumentNumber",'') || ' от ' || to_char(r."DocumentDate",'DD.MM.YYYY')
from dfd."createEmpowermentRevocationUvol" () r || '</a>'::text ||'</td> </tr>' as "ref_link"
join comdoc."DocflowDocumentSettings" se on r."TypeName" = se."DocType" from dfd."createEmpowermentRevocationUvol" () r
) join comdoc."DocflowDocumentSettings" se on r."TypeName" = se."DocType"
)
insert into "#forInsNotification" ("DocflowUser", "txt") insert into "#forInsNotification" ("DocflowUser", "txt")
select d."DocflowUser", null as "txt" select d."DocflowUser", null as "txt"
from (select distinct r."DocflowUser", (select string_agg(coalesce(r1."ref_link",''),'') from (select distinct r."DocflowUser", (select string_agg(coalesce(r1."ref_link",''),'')
from res r1 where r."DocflowUser" = r1."DocflowUser") as list from res r1 where r."DocflowUser" = r1."DocflowUser") as list
from res r from res r
) d ) d
``` ```
таблица.столбец | описание | # для шаблона таблица.столбец | описание | # для шаблона
----------------|----------|-------------- ----------------|----------|--------------
d.list | Список документов | #query_list# d.list | Список документов | #query_list#
### Перенос логов отправки почты и СМС в таблицу SendLog
??? Задача
```sql
call comdoc."PostToSendLog"();
```