ред статей

This commit is contained in:
mirzakaev_tf 2023-05-15 16:32:37 +05:00
parent 3459ca5da0
commit 4d252088bc
62 changed files with 0 additions and 1453 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,141 +0,0 @@
# Интеграция с почтовым клиентом
## Общая информация
Для подключения почтового клиента к dbmail следует пройти несколько шагов:
1. Настроить почту, с которой должна осуществляться рассылка.
2. Настроить конфигурационный файл проекта.
3. Настроить роли сервера.
4. Создать учётную запись и профиль в SQL Server Management Studio (SSMS).
5. Проверить работоспособность рассылки при помощи SQL-запроса.
## Настройка почты
Настройка почты, с которой должна осуществляться рассылка, хорошо описана [здесь](https://www.advantshop.net/help/pages/email-google-yandex). К рассмотрению рекомендуется раздел "Примеры настроек для различных почтовых сервисов" для "Почта Яндекс", включая такие подпункты как "Пароли приложения" и "Возможные ошибки при использовании @yandex.ru и SSL настройки".
## Настройка конфигурационного файла проекта
### Настройки сервиса электронной почты и смс сообщений
Чтобы отправка писем на почту работала, необходимо подключить почтовый ящик в разделе **applications.post.emails**.
!!! note
Раздел applications { post { }} конфигурационного файла ./config/production.js
- _**protocol**_ используемый веб-протокол (по умолчанию `'http'`).
- _**host**_ имя хоста (по умолчанию `'localhost'`).
- _**port**_ порт для запуска (по умолчанию `3066`).
- _**route**_ используемый маршрут (по умолчанию `'/api/v2.0/post'`).
- _**script**_ путь к модулю, запускающему сервис (по умолчанию `'ecosoft-lexema8/post'`).
- _**attachmentRequestTimeout**_ максимальное время ожидания загрузки файла в миллисекундах (по умолчанию `1000`).
- _**defaultEmailId**_ идентификатор почтового ящика, который используется по умолчанию.
- _**emails**_ словарь с описанием используемых почтовых ящиков. Ключом является уникальный идентификатор почтового ящика, а значением объект со свойствами:
* *host* имя хоста smtp-сервера.
* *port* порт smtp-сервера.
* *secure* включить/выключить доставку по электронной почте с использованием TLS/STARTTLS (по умолчанию `false`). Доступные значения: `true`, `false`. (Для 'smtp.yandex.ru' значение должно быть `true`)
* *user* логин.
* *pass* пароль.
* *userName* имя отображаемое при отправке почты.
### Пример
``` js
applications: {
// ...
post: {
defaultEmailId: 'default',
emails: {
default: {
host: 'smtp.gmail.com',
port: 587,
secure: false,
user: 'lexemaecm@gmail.com',
pass: 'password',
userName: 'Lexema'
}
},
// ...
}
```
## Настройка ролей сервера
Для дальнейшей настройки в SSMS потребуется назначить текущем пользователю роль _sysadmin_ (или использовать пользователя с такой ролью). Для этого необходимо открыть "Обозреватель объектов". В нижней его части раскрыть папку "Безопасность" -> "Имена для входа (Logins)" -> кликнуть правой кнопкой мыши (ПКМ) по логину интересующего пользователя -> выбрать пункт "Свойства" и перейти в раздел "Роли сервера". Слева от роли sysadmin должна стоять галочка.
## Учётная запись и профиль в SSMS
Настройку dbmail в SSMS можно произвести двумя путями: с помощью SQL-запросов и с помощью интерфейса самой программы SSMS. Ниже приведена инструкция по настройке при помощи интерфейса. Требующиеся для аналогичной настройки на текущем и последующих шагах команды можно найти [здесь](https://habr.com/ru/post/179819/).
В SSMS необходимо открыть "Обозреватель объектов". В нижней его части раскрыть папку "Управление" и кликнуть ПКМ по пункту "Компонент Database Mail" и выбрать действие "Настроить компонент Database Mail".
![Рисунок 1 "Настроить компонент Database Mail"](component-step1.jpg)
Далее необходимо создать учётную запись и профиль. Обязательные поля выделены красными прямоугольниками.
![Рисунок 2.1 Учетная запись. Обязательные поля](component-step20.jpg)
Следующие изображения с вариантами заполнения полей служат в качестве примера.
![Рисунок 2.2 Учетная запись. Пример](component-step2.jpg)
![Рисунок 3.1 Профиль. Обязательные поля](component-step30.jpg)
В поле "Профиль по умолчанию" (Default Profile) можно выбрать "Да" (Yes), если на проекте используется только этот профиль.
![Рисунок 3.2 Профиль. Пример](component-step3.jpg)
## Проверка работоспособности рассылки при помощи SQL-запроса
Ниже приведен запрос для первой отправки сообщения от подключенной почты при помощи dbmail. Непосредственно отправка письма осуществляется при помощи выполнения команды ```exec msdb.dbo.sp_send_dbmail```, остальные служат для донастройки (при необходимости) и проверки статуса отправки письма (```msdb.dbo.sysmail_allitems```, ```msdb.dbo.sysmail_event_log```)
``` sql
-- в настройках нужно указать созданный профиль:
--update DocflowSettings set EMailProfile='bitedo'
-- Сначала включим Service broker он необходим для создания очередей писем, используемых DBMail
IF (SELECT is_broker_enabled FROM sys.databases WHERE [name] = 'msdb') = 0
ALTER DATABASE msdb SET ENABLE_BROKER WITH ROLLBACK AFTER 10 SECONDS
GO
-- Включим непосредственно систему DBMail
sp_configure 'show advanced options', 1; -- если стоит 0, то следующая настройка не сработает
GO
RECONFIGURE;
GO
sp_configure 'Database Mail XPs', 1
GO
RECONFIGURE
GO
-- Далее нужно проверить, запущена ли служба DBMail:
EXECUTE msdb.dbo.sysmail_help_status_sp
-- И если она не запущена (ее статус не «STARTED»), то запустить ее запросом
EXECUTE msdb.dbo.sysmail_start_sp
-- ищем здесь свой @profile_name
EXECUTE msdb.dbo.sysmail_help_principalprofile_sp --@principal_name = 'bitedo'
-- отправим тестовое сообщение
exec msdb.dbo.sp_send_dbmail @profile_name = 'bitedo' -- отправитель
, @recipients = 'user@lexema.ru' -- получатели, указывается через ;
, @subject = 'theme' -- тема
, @body = 'hello world' -- содержание
, @body_format = 'html'
-- если статус sent значит отправлено
select * from msdb.dbo.sysmail_allitems
--where sent_status not like 'failed'
order by mailitem_id desc
-- если возникли ошибки, см. логи:
select * from msdb.dbo.sysmail_event_log order by log_id desc
```
## Преодоление СПАМ-фильтра
Письма с созданного почтового ящика могут быть не отправлены по причине сработавшего СПАМ-фильтра почтового провайдера. В логах такая ошибка описана следующим образом:
```
The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 10 (2021-06-24T14:52:04). Exception Message: Cannot send mails to mail server. (Transaction failed. The server response was: 5.7.1 [2] Message rejected under suspicion of SPAM; https://ya.cc/1IrBc 1624528324-AOJQDun5U8-q32WauIb).)
```
Существует несколько рекомендаций, описанных в статье на сайте [carrotquest](https://www.carrotquest.io/blog/kak-ne-popast-v-spam/). В случае, если после выполнения приведенных рекомендаций отправка писем остается проваленной, можно обратиться в службу поддержки почтового сервиса.

View File

@ -1,4 +0,0 @@
* [Конфигурирование экземпляра приложения]( ./config_app.md)
* [Конфигурирование сервисов Docker](./config_docker.md)
* [Сборка образа Docker](./build_docker.md)
* [Конфигурирование клиента Packet](./config_npm.md)

View File

@ -1,26 +0,0 @@
# Сборка Docker образа сервиса конфигурации
Для сборки образа сервиса конфигурации необходимо перейти в каталог с файлами пакета конфигурации и выполнить команду сборки.
Сборка образа
``` bash
docker build -f configuration.dockerfile -t <имя создаваемого образа> <путь до каталога>
```
Пример
``` bash
docker build -f configuration.dockerfile -t bitedo.configuration-service .
```
После сборки готовый образ нужно скопировать на сервер приложений.
Образ содержит все настройки и готов к созданию контейнера в составе приложения.
!!! note
Команды docker для сборки, выгрузки и загрузки можно посмотреть по ссылке https://docs.docker.com/engine/reference/commandline/cli/.
<!-- Можно использовать [шпаргалки](./mini_notes.md) для работы с docker -->

View File

@ -1,27 +0,0 @@
# Конфигурирование экземпляра приложения
Конфигурация приложения разделена на несколько файлов
основой служит сервис конфигурации который считывает файл и отдает его содержимое по апи
!!! warning
Необходимо помнить что файлы конфигурации содержат информацию для ограниченного доступа
Каталог с файлами сервиса конфигурации содержит следующие файлы:
| Имя | Описание |
|-----|----------|
| ./config/production.js | - конфигурация для сервисов приложения
| ./nginx/default.conf | - настройки сервиса entrypoint (маршруты)
| ./SQL/ | - настроечные скрипты для сервера БД (для ручного запуска)
Для каждого дополнительного сервиса может быть создан отдельный каталог с его настройками.
Например, для сервиса работы с ОЭП(dss-service) в конфигурации может присутствовать каталог dss c файлами настроек.
Если каталог с дополнительными настройками сервиса не присутствует - то сервис запускается с настройками по умолчанию.
!!! note
Для конфигурирования отдельных экземпляров приложения рекомендуется создавать отдельные каталоги для каждого экземпляра.
## Подготовка файлов конфигурации приложения
2. проверить настройки в файле ./config/production.js. Других файлов в каталоге ./config/ быть не должно.
3. необходимо проверить маршруты описанные в /nginx/default.conf. Они должны отображаться на сервисы используемые в приложении.

View File

@ -1,4 +0,0 @@
# Настройки приложения при поставке Docker
Файл docker-compose.yml содержит список необходимых для работы приложения сервисов и параметры их запуска
Файл .env содержит переменные окружения, которые автоматически применятся для текущего экземпляра приложения.

View File

@ -1,3 +0,0 @@
# Настройки приложения при поставке NPM
файл ecosystem.config.js содержит список необходимых для работы приложения сервисов и параметры их запуска

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

View File

@ -1,75 +0,0 @@
# Настройка обозревателя аналитик
## Общее описание назначения документа
Настройка обозревателя аналитик (ОА) служит для выделения уникальных узлов в справочнике, открывающемся по кнопке <img src="../media/uaButton.png" style="height:30px;border:0px">, нажатие на которую открывает всплывающее окно с формой обозревателя аналитик. Так, если существует настройка ОА для контрагентов, то по нажатию на кнопку рядом с соответствующим полем
![Пример лукапа с ОА](./media/lookupExample.png)
откроется всплывающее окна с ОА, содержащее в качестве верхнего узла "Контрагенты".
![Пример ОА для лукапа](./media/uaExample.png){: .zoom}
## Реестр
Чтобы открыть реестр настроек обозревателя аналитик, необходимо в меню в папке "Администрирование", подпапке "Обозреватель аналитик" выбрать пункт "Настройка обозревателя аналитик".
![Меню](./media/menu.png)
Откроется реестр документов.
![Реестр "Настройка обозревателя аналитик"](./media/registry.png){: .zoom}
Для создания нового документа необходимо нажать на кнопку "Создать" на верхней панели инструментов
![](./media/create.png)
## Документ
В поле "Наименование" необходимо заполнить одним из стандартных значений из [таблицы ниже](#таблица).
В поле "Код" содержатся все узлы ОА. Нужный узел можно выбрать при помощи самого ОА, нажав на кнопку <img src="../media/uaButton.png" style="height:30px;border:0px">.
![Пример настройки для контрагентов](./media/docExample.png)
## Таблица сочетаний наименований и кодов {#таблица}
Наименование | Код
-------------|----
Base.Projects | Проекты
Woker | Кадры
Contract | Договоры
Department | Подразделения
Contacts | Контактные лица
Contractor | Контрагент
Interest | Интересы
Project | Проекты
AdditionalContract | Дополнительные документы
Currency | Валюта
NotRezident | A-Z Иностранные организации (нерезиденты)
Storage | Склады
BasicMeans | Объекты учета
ItemOfExpenses | Статьи затрат
Bank | Банки
PrimaryDocument | Первичные документы
MaterialGroup | Номенклатура/материалы/услуги
Investment | Капиталовложения
VatRate | Ставки НДС
ItemOfBdds | Статьи ДДС
Measure | Единицы измерения
SegmentValue | Отрасль
ExpensesFuture | Расходы будущих периодов
Bill | Вексель
ArticleOfExpenses | Статьи доходов и расходов
TaxablePeriod | Налоговые периоды
RP_Person | Физические лица
NotRezident_Interest | A-Z Иностранные организации (нерезиденты)
TaxLiability | Виды активов и обязательств
TaxGroup | Налоговые группы ОС
TaxRateProps | Статьи налога на имущество
EquipmentGroup | Оборудование
MaterialGeneralizedName | Обобщенная номенклатура
Zero | 0-9
Origin | Корень
Direction | Направления
TypesOfFixed | Виды выбытия ОС

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

View File

@ -1,159 +0,0 @@
# Настройка архива вложенных документов
## Общее описание
Настройка архива вложенных документов необходима для работы аналитической формы [Архив вложенных документов](./../../../../User manuals/archivedoc.md#архив_вложенныхокументов) и происходит в несколько этапов:
* В документ «Справочники поисковой системы» заносятся поля для фильтра, по которым будут собираться вложения.
* В справочник «Итоговые выборки поисковой системы» добавить документ с выборкой из некоторой таблицы для документа или группы документов, если их сущности извлекаются одинаково.
* В документе "Настройка документа" на вкладке "Контекстный поиск" заполнить несколько полей.
* Обновить страницу (клавиша F5), чтобы изменения вступили в силу.
## Справочники поисковой системы
Чтобы открыть документ «Справочники поисковой системы», необходимо в меню в папке "Администрирование", подпапке "Документооборот", подпапке "Поисковая система" выбрать пункт «Справочники поисковой системы».
![Меню](./media/CustomFTSFiltersMenu.png)
Откроется документ "Справочники FTS". В нём необходимо заполнить таблицу "Фильтры".
![Справочники FTS](./media/CustomFTSFiltersForm.png){: .zoom}
Существует строго определённый набор значений поля "Id", приведённый в [таблице ниже](#таблица). Соответствующее им поле "Name" заполняется произвольно. В справочнике «Итоговые выборки поисковой системы» этим значениям будут поставлены в соответствие поля в таблицах, по которым будет осуществляться поиск и фильтрация документов с вложениями.
## Итоговые выборки поисковой системы
Чтобы открыть справочник «Итоговые выборки поисковой системы», необходимо в меню в папке "Администрирование", подпапке "Документооборот", подпапке "Поисковая система" выбрать пункт «Итоговые выборки поисковой системы».
![Меню](./media/ResultFTSMenu.png)
Откроется реестр "Итоги FTS".
![Итоги FTS](./media/ResultFTSRegistry.png){: .zoom}
Значения этого справочника будут предлагаться для выбора в документе "Настройка документа". Для создания нового документа необходимо нажать на кнопку "Создать" на верхней панели инструментов.
![Кнопка "Создать"](./media/create.png)
В поле "Выборка" необходимо ввести обозначение для документа или группы документов, если их сущности извлекаются одинаково, которое будет использоваться в качестве одного из значений в настройках документов. В поле "Примечание" можно внести пояснения, например, к каким именно документам относится выборка.
![Пример заполнения полей "Выборка" и "Примечание"](./media/ResultFTSHeader.png)
Под полем "Выборка" необходимо прописать результирующий селект, который в процессе расчета будет выполнять система. Структура селекта для всех выборок должна быть одинаковой, они будут объединяться с помощью оператора ```UNION```. Выборка состоит из следующих полей:
* ```DocCode``` - уникальный код документа, используемый в системе; как правило ```VCode```.
* ```DocType``` - тип документа; как правило ```TypeName```.
* ```DocDate``` - дата документа; свойство, которое указывается в *Настройке документа* и передаётся в качестве параметра; указывается ```:DateProperty```.
* ```DocNumber``` - номер документа; свойство, которое указывается в *Настройке документа* и передаётся в качестве параметра; указывается ```:NumberProperty```.
* ```ContractorId``` - уникальный код контрагента, используемый в системе.
* ```ContractId``` - уникальный код договора, используемый в системе.
* ```AddContractId``` - уникальный код дополнительного документа к договору, используемый в системе.
* ```ProjectId``` - уникальный код проекта, используемый в системе.
В зависимости от подключаемых документов будут меняться таблица, стоящая после оператора ```FROM```, и присваиваемые значения установленных в селекте полей. Если для них есть соответствующие им поля в таблице, их необходимо присвоить. Например, полю ```ContractId``` должен соответствовать код договора, который есть в таблице ```dbo.DocflowDocument``` под названием ```Contract```. Если такого поля в таблице нет, необходимо присвоить значение ```null```. Например, в таблице ```dbo.DocflowDocument``` не указывается код дополнительного документа к договору, поэтому значению ```AddContractId``` присваивется ```null```.
В таблицу справа "Фильтры" необходимо занести значения из *Справочника поисковой системы*, по которым будет осуществляться фильтр, и SQL-скрипт кусок кода, который будет подставлен в предложение WHERE результирующего селекта. Значение, сравниваемое с ```an.Value```, будет совпадать со значением в столбце ```ID``` таблицы "Фильтр". Значение, сравниваемое с ```an.Value```, будет совпадать с полем таблицы, которое присваивается одному из полей селекта.
![Пример документа "Итог FTS"](./media/ResultFTSForm.png){: .zoom}
Программа при такой настройке будет выполнять следующий код:
```sql
select DocCode = t.VCode
, DocType = t.TypeName
, DocDate = :DateProperty
, DocNumber = :NumberProperty
, ContractorId = t.Contractor
, ContractId = t.Contract
, AddContractId = CONVERT(bigint, NULL)
, ProjectId = t.Projects
from dbo.[DocflowDocument] as t
where t.COrg = @orgId
and exists(
select 1 from #anFilters as an where an.Id = 'Contractor' and an.Value = t.Contractor
)
and exists(
select 1 from #anFilters as an where an.Id = 'Contract' and an.Value = t.Contract
)
and exists(
select 1 from #anFilters as an where an.Id = 'Project' and an.Value = t.Projects
)
```
Временная таблица ```#anFilters``` создаётся внутри результирующей процедуры расчета и содержит указанные пользователем фильтры.
Для PostgreSQL-версии селект имеет следующий вид:
```sql
SELECT t."VCode" AS "DocCode"
, t."TypeName" AS "DocType"
, :DateProperty AS "DocDate"
, :NumberProperty AS "DocNumber"
, t."Contractor" AS "ContractorId"
, t."VCode" AS "ContractId"
, NULL::bigint AS "AddContractId"
, t."Projects" AS "ProjectId"
FROM contract."Contract" as t
WHERE t."COrg" = _orgidparam
and exists(
select 1 from "tmp_anFilters_for_attachmentArchive" as an where an."id" = 'Contractor' and an."value" = cast(t."Contractor" as character varying)
)
and exists(
select 1 from "tmp_anFilters_for_attachmentArchive" as an where an."id" = 'Contract' and an."value" = cast(t."VCode" as character varying)
)
and exists(
select 1 from "tmp_anFilters_for_attachmentArchive" as an where an."id" = 'Project' and an."value" = cast(t."Projects" as character varying)
)
```
## Настройка документов
После заполнения справочника «Итоговые выборки поисковой системы» необходимо перейти в реестр "Настройка документов". В документе необходимо заполнить поля ```typeNameProperty```, ```dateProperty``` и ```numberProperty``` соответствующими им наименованиями полей таблицы: типа документа, даты документа и номера документа. Также необходимо в поле "Итоги" выбрать одно из значений справочника «Итоговые выборки поисковой системы». После заполнения этих полей необходимо поставить галочку в поле **FTS2** и обновить страницу, чтобы изменения вступили в силу.
![Пример документа "Настройка документа"](./media/DocflowDocumentForm.png){: .zoom}
## Таблица сочетаний полей фильтра и примеры скриптов {#таблица}
ID | Пример Name | Пример SQLScript (на основе таблицы ```dbo.AdditionalContract```) | Пример SQLScript на языке PostgreSQL (на основе таблицы ```dbo.AdditionalContract```)
---|-------------|-----------------|-----------------
Contractor | Контрагент | ```and exists(select 1 from #anFilters as an where an.Id = 'Contractor' and an.Value = t.Contractor)``` | ```and exists( select 1 from "tmp_anFilters_for_attachmentArchive" as an where an."id" = 'Contractor' and an."value" = cast(t."Contractor" as character varying))```
Contract | Договор | ```and exists(select 1 from #anFilters as an where an.Id = 'Contract' and an.Value = t.Contract)``` | ```and exists( select 1 from "tmp_anFilters_for_attachmentArchive" as an where an."id" = 'Contract' and an."value" = cast(t."Contract" as character varying) )```
AdditionalContract | Доп. документ к договору | ```and exists(select 1 from #anFilters as an where an.Id = 'AdditionalContract' and an.Value = t.VCode)``` | ```and exists( select 1 from "tmp_anFilters_for_attachmentArchive" as an where an."id" = 'AdditionalContract' and an."value" = cast(t."VCode" as character varying) )```
Project | Проект | ```and exists(select 1 from #anFilters as an where an.Id = 'Project' and an.Value = t.Projects)``` | ```and exists( select 1 from "tmp_anFilters_for_attachmentArchive" as an where an."id" = 'Project' and an."value" = cast(t."Projects" as character varying) )```
## Автоматическое формирование отчета заявления с ЭП
На проекте возможно настроить автоматическое формирование отчета заявления с электронными подписями по завершению маршрута. Для этого в документе "Настройка учетной политики предприятия" нужно настроить константу **Интеграция с 1С с помощью сервиса ODATA** со значением 1
![Константа](media/constant.png){: .zoom}
По завершению маршрута в окно вложений заявления добавится печатная форма с ЭП. Архив с ЭП можно будет скачать по кнопке "Скачать архив с ЭП".
![Вложения](media/attachments.png){: .zoom}
Скачать архив с ЭП можно только когда в маршруте пройдены все этапы с действием "Подписан ЭП" и текущий этап
не требует подписания документа.
![Этапы](media/stages.png){: .zoom}
Архив скачается в папку "Загрузки" (Downloads).
![Загрузки](media/Downloads.png){: .zoom}
В архиве будут находиться: оригинал заявления, отчет по подписанию и файл с информацией о подписании данного документа по каждому сотруднику.
![Архив ЭП](media/arhiv.png){: .zoom}
## Настройка отчета без включения пропущенных этапов подписания
В проекте есть возможность не добавлять в отчет тех сотрудников, кто включен в маршрут через **ИЛИ** и **НЕ ПРОШЕЛ** этап подписания.
![Статус пропущен](media/skipped.png){: .zoom}
Для этого в документе "Настройка учетной политики предприятия" нужно настроить константу **Скрывать участников маршрута без действий** со значением 1.
![Константа2](media/constant2.png){: .zoom}
Результат сформированного отчета:
![Отчет маршрута](media/skippedPrint.png){: .zoom}

View File

@ -1,21 +0,0 @@
# Самостоятельное развертывание системы
* [Описание]( ./config_app.md)
* [Конфигурирование сервисов Docker]( ./config_docker.md)
* [Сборка образа Docker]( ./build_docker.md)
* [Конфигурирование клиента Packet]( ./config_npm.md)
* Настройки клиентской части
* [Front](../../service/front/index.md)
* Настройки серверной части
* [Entrypoint](../../service/entrypoint/index.md)
* [MSSQL](../Prepare/prepare_mssql.md)
* [Redis](../../service/redis/redis.md)
* [RabbitMQ](../../service/rabbitMQ/index.md)
* [Gate](../../service/gate/index.md)
* [Logic](../../service/logic/index.md)
* [File](../../service/file/index.md)
* [Post](../../service/post/index.md)
* [Radio](../../service/radio/index.md)
* [Jsreport](../../service/jsreport/index.md)
* [Preview](../../service/preview/index.md)
* [Scheduler](../../sheduler/index.md)

View File

@ -1,2 +0,0 @@
* [Docker образы](./deploy_docker.md)
* [NPM пакеты](./deploy_npm.md)

View File

@ -1,16 +0,0 @@
# Распространение приложения использованием образов Docker
Для развертывания сконфигурированного ранее приложения необходимо выполнить следующие шаги:
1. Cкопировать файлы развертывания приложения __docker-compose.yml__, __.env__ на сервер приложения. Эти файлы идут в составе поставки пакета сервиса конфигурации приложения. Если сборка образа конфигурации была на текущем сервере - тогда этот шаг можно пропустить.
2. Запустить приложение
```bash
docker-compose up -d
```
!!!warning
Обратите внимание что образ сервиса конфигурации с **файлами конфигурации** конкретного экземпляра приложения собирается отдельно от образов содержащих сервисы приложения, и содержит все необходимые настройки для экземпляра приложения. Такой подход позволяет переиспользовать образы сервисов приложения с разными **сервисами конфигурации**.
Файл docker-compose.yml содержит описание необходимых для запуска сервисов.

View File

@ -1,16 +0,0 @@
# Распространение приложения через npm-пакеты
Необходимо:
1. Получить исходные коды сервисов приложения.
Дистрибутив поставляется в виде zip архива
(Выполнить команду установки зависимостей.)
2. Скопировать конфигурационные файлы в папку исходных кодов т.к. исходные коды приложения хранятся отдельно от конфигурационных файлов приложения.
3. Запустить сервисы командой
``` bash
pm2 restart ecosystem.config.js
```

View File

@ -1,23 +0,0 @@
# Создание БД
1. Необходимо развернуть из резервной копии заранее подготовленные базы данных
* << app >>
* << app_history >>
2. Установить для учетной записи администратора следующие привилегии:
+ Включить администратора в роль DB_OWNER для следующих БД:
* << app >>
* << app_history >>
+ Предоставить администратору разрешения на следующие операции:
* ALTER ANY CONNECTION
* ALTER ANY LOGIN
* ALTER TRACE
3. Создать план обслуживания БД включив в него шаг резервного копирования.
4. Настроить расписание для плана обслуживания

View File

@ -1,4 +0,0 @@
* [update](update.md)
* [backup](backup.md)
* [clearing](clearing.md)
* [monitoring](monitoring.md)

View File

@ -1,7 +0,0 @@
# Backup & Restore
Резервное копирование баз данных и хранение копий в папке названной по версии приложения
для развертывания экземпляра из резервной копии необходимо
- восстановить базы данных
- запустить экземпляр сервера приложений нужной версии, с настройками на восстановленные базы данных

View File

@ -1,4 +0,0 @@
# Очиска системы от старых Docker образов приложения
Для удаления старых образов создается файл clearing.sh
при выполнении он удаляет все предшествующие текущему образы.

View File

@ -1,26 +0,0 @@
# monitoring
## Базовый мониторинг приложения в Windows
При запуске сервисов в среде Windows наблюдение за ними происходит в консоли запушенного приложения
Логи сервисов выводятся в эту-же консоль.
## Базовый мониторинг контейнеров Docker
наблюдение за сервисами приложения
```bash
docker-compose ps
```
просмотр логов контейнеров
```bash
docker-compose logs
```
!!! note
Сервисы в контейнере app пишут логи в файлы расположенные на подключеном к контейнеру VOLUME
эти логи можно посмотреть только подключившись к этому VOLUME
## Использование коллектора логов fluentd
В корпоративной среде лоя сбора логов контейнеров Docker можно использовать коллектор [fluentd](https://www.fluentd.org/)

View File

@ -1,9 +0,0 @@
# Update
Обновление версии приложения при поставке в виде Docker образов происходит следующим методом:
- на сервер приложения загружаются новые Docker образы
- останавливается предыдущий экземпляр приложения
- запускается новый экземпляр приложения
- открывается страница применения миграций схемы БД и выполняются необходимые миграции

View File

@ -1,571 +0,0 @@
# Сборка документов, участвующих в документообороте, в БД
## Общее описание
Для участия документов определенного типа и успешного запуска этих документов по маршруту необходимо:
1. В БД прописать таблицу, на которой построен тип документа, в представлении ```DocflowExists```.
2. Выполнить для типа документа "Настройку документа" (после чего обновить страницу).
3. Создать для типа документа шаблон маршрута.
В данном разделе описывается первый шаг: настройка представления ```DocflowExists```. В ней содержатся данные обо всех документах, участвующих в документообороте. Не внесённые в неё типы документов не отображаются на панели "Документооборот" на главной форме и не отправляются по маршруту.
## Назначение полей
Представление ```DocflowExists``` содержит данные о разных типах документов, для каждого из которых можно сопоставить следующие поля:
- **VCode** обязательное, целое число. Содержит уникальный код документа.
- **TypeName** обязательное. Содержит тип документа.
- **Subject** содержит тему документа.
- **Text** содержит основной текст документа.
- **DateOfExecution** содержит плановую дату исполнения.
- **RealDateOfExecution** содержит фактическую дату исполнения.
- **DocDescription** содержит описание документа.
- **Description** содержит описание содержимого документа.
- **DateControl** содержит дату проверки.
- **COrg** содержит код организации, в которой находился создавший документ пользователь на момент создания документа.
- **DocumentDate** содержит дату документа.
- **DocumentNumber** содержит номер документа, который может настраиваться с помощью [журнала регистрации](../../../СЭД/Журнал регистрации/Журнал регистрации.md).
- **VirtualCUser** содержит логин виртуального (замещаемого) пользователя.
- **Projects** содержит уникальный код проекта.
- **SourceDocumentCode** содержит уникальный код документа-источника, из которого был создан текущий.
- **SourceDocumentType** содержит тип документа-источника.
- **GlobalId** содержит глобальный уникальный идентификатор, .
Не все поля обязательны к заполнению. Если такие поля не участвуют в бизнес-процессе документа, им присваивается ```NULL```.
Для внесения в представление документов определённого типа необходимо подключать соответствующие им таблицы. Подключение новых таблиц происходит через ```union all```.
## Примеры
Ниже приведены примеры представления ```DocflowExists``` на двух разных проектах. В первом может быть интересна настройка карточек СЭД (```from dbo.DocflowDocument```), во втором содержится настройка большего количества типов документов.
### Пример 1
``` sql
ALTER VIEW [dbo].[DocflowExists]
AS
select a.VCode, a.TypeName, a.[Subject], a.[Text], a.DateOfExecution, a.RealDateOfExecution, a.DocDescription, a.[Description], a.DateControl, a.COrg, a.DocumentDate, a.DocumentNumber, a.VirtualCUser,Projects =CONVERT(bigint, null ),
a.GlobalID, a.DocumentSubtype, a.SourceDocumentCode,a.SourceDocumentType
from (
select VCode, TypeName, [Subject], [Text] = convert(varchar(max), NULL),
DateOfExecution = case TypeName when 'Instruction' then DateOfExecution
when 'IncomingDocument' then DateOfExecution
else convert(datetimeoffset, NULL) end,
RealDateOfExecution = case TypeName when 'Instruction' then RealDateOfExecution else convert(datetimeoffset, NULL) end,
DocDescription = convert(varchar(max), NULL), [Description] = convert(varchar(max), NULL),
DateControl = convert(datetimeoffset, NULL), COrg,
DocumentDate = case when TypeName in ('IncomingDocument', 'OrganizationalDocument', 'OutgoingDocument')
then convert(date,(coalesce([DateOfRegistration],[DocumentDate])))
else convert(date,DocumentDate) end,
DocumentNumber,
VirtualCUser = coalesce(VirtualCUser, CUser),
GlobalID,
DocumentSubtype,
SourceDocumentCode = convert(bigint,null),
SourceDocumentType = convert(varchar(255),null)
from dbo.DocflowDocument
union all
select VCode, TypeName, [Subject] = SubjectOfContract, [Text] = convert(varchar(max), NULL), DateOfExecution = convert(datetimeoffset, NULL),
RealDateOfExecution = convert(datetimeoffset, NULL), DocDescription = convert(varchar(max), NULL), [Description] = convert(varchar(max), NULL),
DateControl = convert(datetimeoffset, NULL), COrg,
DocumentDate = DateContract,
DocumentNumber = VhodNumber,
VirtualCUser = coalesce(VirtualCUser, CUser),
GlobalID = convert(uniqueidentifier, null),
DocumentSubtype = convert(bigint,null),
SourceDocumentCode = convert(bigint,null),
SourceDocumentType = convert(varchar(255),null)
from dbo.[Contract]
union all
select VCode, TypeName, [Subject] = SubjectOfContract, [Text] = convert(varchar(max), NULL), DateOfExecution = convert(datetimeoffset, NULL),
RealDateOfExecution = convert(datetimeoffset, NULL), DocDescription = convert(varchar(max), NULL), [Description] = convert(varchar(max), NULL),
DateControl = convert(datetimeoffset, NULL), COrg,
DocumentDate = DateContract,
DocumentNumber = Number,
VirtualCUser = coalesce(VirtualCUser, CUser),
GlobalID = convert(uniqueidentifier, null),
DocumentSubtype = convert(bigint,null),
SourceDocumentCode = convert(bigint,null),
SourceDocumentType = convert(varchar(255),null)
from dbo.[AdditionalContract]
union all
select VCode, 'Test',null , [Text] = convert(varchar(max), NULL), DateOfExecution = convert(datetimeoffset, NULL),
RealDateOfExecution = convert(datetimeoffset, NULL), DocDescription = convert(varchar(max), NULL), [Description] = convert(varchar(max), NULL),
DateControl = convert(datetimeoffset, NULL), 1,
DocumentDate = null,
DocumentNumber = null,
VirtualCUser = null,
GlobalID = convert(uniqueidentifier, null),
DocumentSubtype = convert(bigint,null),
SourceDocumentCode = convert(bigint,null),
SourceDocumentType = convert(varchar(255),null)
from dbo.[Test]
union all
select VCode, TypeName, [Subject] = Text, [Text] = convert(varchar(max), Text), DateOfExecution = convert(datetimeoffset, NULL),
RealDateOfExecution = convert(datetimeoffset, NULL), DocDescription = convert(varchar(max), NULL), [Description] = convert(varchar(max), NULL),
DateControl = convert(datetimeoffset, NULL), COrg,
DocumentDate ,
DocumentNumber ,
VirtualCUser = coalesce(VirtualCUser, CUser),
GlobalID,
DocumentSubtype ,
SourceDocumentCode = convert(bigint,null),
SourceDocumentType = convert(varchar(255),null)
from dbo.[UniversalDocument]
union all
select VCode, TypeName, [Subject] = Subject, [Text] = convert(varchar(max), Text), DateOfExecution = convert(datetimeoffset, NULL),
RealDateOfExecution = convert(datetimeoffset, NULL), DocDescription = convert(varchar(max), NULL), [Description] = convert(varchar(max), NULL),
DateControl = convert(datetimeoffset, NULL), COrg,
DocumentDate = DocDate ,
DocumentNumber = null,
VirtualCUser = coalesce(VirtualCUser, CUser),
GlobalID ,
DocumentSubtype = convert(bigint,null),
SourceDocumentCode = convert(bigint,null),
SourceDocumentType = convert(varchar(255),null)
from dbo.[CancellationAct]
) as a
```
### Пример 2
``` sql
ALTER VIEW [dbo].[DocflowExists]
AS
-- Общее представление документов СЭД
SELECT a."VCode"
, a."TypeName"
, a."Subject"
, a."Text"
, a."DateOfExecution"
, a."RealDateOfExecution"
, a."DocDescription"
, a."Description"
, a."DateControl"
, a."COrg"
, a."DocumentDate"
, a."DocumentNumber"
, a."VirtualCUser"
, a."Projects"
, a."SourceDocumentCode"
, a."SourceDocumentType"
, a."GlobalId"
FROM(
-- Заявки LexDesk
SELECT t."VCode"
, t."TypeName"
, t."Name" AS "Subject"
, t."Description" AS "Text"
, CONVERT(datetimeoffset, t.Deadline) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, t."Name" AS "DocDescription"
, ('"' + t."Name" + '" ' + t."Description") AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."CDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, t.Project) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."Ticket" AS t
-- Карточки СЭД
UNION ALL
SELECT t."VCode"
, t."TypeName"
, t."Subject"
, t."Text"
, t."DateOfExecution"
, t."RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, t."PeriodDate" AS "DocumentDate"
, t."DocumentNumber"
, COALESCE(t."VirtualCUser", t."CUser") AS "VirtualCUser"
, t."Projects"
, t."SourceDocumentCode"
, t."SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."DocflowDocument" AS t
-- Договора
UNION ALL
SELECT t."VCode"
, t."TypeName"
, t."SubjectOfContract" AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, t."DateContract" AS "DocumentDate"
, t."VhodNumber" AS "DocumentNumber"
, COALESCE(t."VirtualCUser", t."CUser") AS "VirtualCUser"
, t."Projects"
, t."SourceDocumentCode"
, t."SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."Contract" AS t
-- Приложения к договорам
UNION ALL
SELECT t."VCode"
, t."TypeName"
, t.SubjectOfContract AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, t."DateContract" AS "DocumentDate"
, t."Number" AS "DocumentNumber"
, COALESCE(t."VirtualCUser", t."CUser") AS "VirtualCUser"
, t."Projects"
, t."SourceDocumentCode"
, t."SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."AdditionalContract" AS t
-- Контрагенты, интересы
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), NULL) AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."CDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."Contractor" AS t
UNION ALL
SELECT t."VCode"
, 'ProjectsMakeDetail' AS "TypeName"
, t."Comment" AS "Subject"
, t."Comment" AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), t."Comment") + ' (' + CONVERT(varchar(max), t."ContractorName") + ')' AS "DocDescription"
, CONVERT(varchar(max), t."Comment") + ' (' + CONVERT(varchar(max), t."ContractorName") + ') ' + COALESCE('Результат действия: ' + CONVERT(varchar(max), t."Result"), '') AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."CDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."V_crm_ProjectsMakeDetail" AS t
-- Проекты
UNION ALL
SELECT t."VCode"
, t."TypeName"
, t."Goal" AS "Subject"
, CONVERT(varchar(max), t."Goal") AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), t."Goal") AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."CDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, t."VCode" AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."Projects" AS t
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), NULL) AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."CDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."CommercialProposal" AS t
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), NULL) AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."CDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."WriteOffExpensesFP" AS t
UNION ALL
SELECT t."VCode"
, t."TypeName"
, t."AnalyticsName" AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."CDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."ExpensesFuture" AS t
UNION ALL
SELECT t."VCode"
, t."TypeName"
, t."AnalyticsName" AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."CDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."ReceiptOfBill" AS t
UNION ALL
SELECT t."VCode"
, t."TypeName"
, t."AnalyticsName" AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."CDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."ExpenseOfBill" AS t
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), t."TypeDocs") AS "Subject"
, CONVERT(varchar(max), t."Note") AS "Text"
, t."CDate" AS "DateOfExecution"
, t."WDate" AS "RealDateOfExecution"
, CONVERT(varchar(max), t."Note") AS "DocDescription"
, CONVERT(varchar(max), t."Note") AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."CDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."VOtherDocuments" AS t
-- Услуги
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), NULL) AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."AccountingDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."ServiceReceipts" AS t
-- Заявки на платеж
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), '') + CASE WHEN rc."VCode" IS NULL THEN '' ELSE 'Получатель: ' + rc."Name" END AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, t."PaymentDestination" AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, t."AccountingDate" AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, t."Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."RequestForPayment" AS t
LEFT JOIN dbo."UniAnalyt" AS rc ON rc."VCode" = t."Receiver"
-- Банковские документы
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), NULL) AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, t."AccountingDate") AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."FinanceMoving" AS t
-- TestECP
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), 'TestEcp') AS "Subject"
, CONVERT(varchar(max), 'TestEcp') AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, CONVERT(bigint, NULL) AS "COrg"
, CONVERT(date, NULL) AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,'EEDB3414-EFA5-4610-A7D5-2B3FD6FEA152') as "GlobalId"
FROM dbo."TestEcp" AS t
-- KarginTest
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), 'Документ') AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, CONVERT(date, NULL) AS "DocumentDate"
, CONVERT(varchar(255), NULL) AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."KarginTest" AS t
-- Универсальный документ
UNION ALL
SELECT t."VCode"
, t."TypeName"
, COALESCE(t."Name",'Документ') AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, t."DocumentDate"
, t."DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."UniversalDocument" AS t
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), NULL) AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, t."DateDoc" AS "DocumentDate"
, t."NumDoc" AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo."RP_DocAbsence" AS t
WHERE t."TypeName" = 'Base.RP_OrderVacation'
UNION ALL
SELECT t."VCode"
, t."TypeName"
, CONVERT(varchar(max), NULL) AS "Subject"
, CONVERT(varchar(max), NULL) AS "Text"
, CONVERT(datetimeoffset, NULL) AS "DateOfExecution"
, CONVERT(datetimeoffset, NULL) AS "RealDateOfExecution"
, CONVERT(varchar(max), NULL) AS "DocDescription"
, CONVERT(varchar(max), NULL) AS "Description"
, CONVERT(datetimeoffset, NULL) AS "DateControl"
, t."COrg"
, t."AccountingDate" AS "DocumentDate"
, t."DocumentNumber" AS "DocumentNumber"
, t."CUser" AS "VirtualCUser"
, CONVERT(bigint, NULL) AS "Projects"
, CONVERT(bigint, NULL) AS "SourceDocumentCode"
, CONVERT(varchar(255), NULL) AS "SourceDocumentType"
, CONVERT(uniqueidentifier,null) as "GlobalId"
FROM dbo.ActOfReconciliation AS t
WHERE t."TypeName" = 'Base.ActOfReconciliation'
) AS a
```

View File

@ -1,3 +0,0 @@
* [Docker образы]( ./prepare_serv_docker.md)
* [NPM пакеты]( ./prepare_serv_npm.md)
* [БД MSSQL]( ./prepare_mssql.md)

View File

@ -1,12 +0,0 @@
# Создание БД
1. Необходимо развернуть из резервной копии заранее подготовленные базы данных
* ptb
* ptb_history
2. Создать учетную запись для приложения. Выдать права администратора для созданной учетной записи на следующие базы :
* ptb
* ptb_history

View File

@ -1,20 +0,0 @@
# Использование ресурсов ООО "Лексема"
## Настройка доступа к приватному репозиторию
!!! note
На этапе внедрения используется репозиторий ООО "Лексема" http://dhub.lex.lan, доступ к нему организуется посредством VPN канала и настройки DNS-resolver.
При использовании приватных репозиториев заказчика настройки VPN и DNS-resolver делать не нужно, а в настройки Docker внести адрес репозитория заказчика.
Для этого необходимо выполнить следующие шаги :
* Установить на сервер пакет OpenVPN.
* для настройки VPN достаточно разместить полученый файл подключения в папку /etc/openvpn/ и запустить сервис
* внести в файл /etc/hosts запись "192.168.5.247 dhub.lex.lan"
* удостоверится в том что приватный репозиторий с образами доступен - командой ping .
* внести в файл /etc/docker/daemon.json строку с указанием приватного репозитория////
```
"insecure-registries":["dhub.lex.lan:5000"]
```

View File

@ -1,18 +0,0 @@
1. Установить сервер БД со следующими настройками
Настройка сервера СУБД (Microsoft SQL Server)
| № пп |Наименование параметра |Значение параметра|
| ----- |-----------------------|------------------|
|1 |Server Collation |SQL_Latin1_General_CP1251_CI_AS
|2 |Default Language |English
|3 |FileStream Access Level |Full access enabled
|4 |Server Authentication |SQL Server and Windows Authentication Mode
|5 |Broker Enabled (для БД Lexema_data) |True
|6 |CLR Enabled |True
|7 |TrustWorthy (Для БД Lexema_Data) |True
|8 |Профиль DBMail |Адрес электронной почты, выделенный для рассылки
|9 |Max degree of parallelism |2
|10 |Cost threshold for parallelism |20
1. На сервере создать SQL пользователя с ролью sysadmin

View File

@ -1,45 +0,0 @@
# Подготовка сервера приложения для развертывания Docker образов
Сервер приложений - это хост для выполнения Docker контейнеров приложения.
## 1. Установить на сервер следующие пакеты:
* docker <https://docs.docker.com/engine/install/ubuntu/>,
* docker-compose <https://docs.docker.com/compose/install/linux/>
## 2. Настройки Docker Network
Для межсервисного трафика при запуске приложения создается отдельная виртуальная сеть с именем проекта
Для взаимодействия с внешними сервисами необходимо создать виртуальную сеть с именем __proxy__.
Cоздание сети proxy следующей командой:
```bash
docker network create proxy
```
## 3. Разместить образы, предоставленные компанией ООО "Лексема" на сервере приложения
Создать временную папку для загрузки образов
```bash
mkdir /tmp/lexema && cd /tmp/lexema
```
Скопировать архивы образов в папку _/tmp/lexema_ на сервере.
Выполнить команду загрузки образов
```bash
docker load -i *.tar
```
Удалить образы
```bash
rm -f *.tar
```
## 4. Настроить сервер для доступа к сервису обновлений.
!!! note
На этапе внедрения сервис обновлений ООО "Лексема" не используется.
Для поставки пакетов с новым функционалом используется сетевой ресурс в сети заказчика. Обновления производятся заказчиком самостоятельно.

View File

@ -1,25 +0,0 @@
# Подготовка сервера приложения для развертывания NPM пакетов
Сервер приложений - это хост для запуска сервисов приложения распространяемых в виде пакетов NPM.
## 1. Установить на сервер следующие пакеты:
* nginx 1.23+ [link](https://community.chocolatey.org/packages/nginx)
* Redis 3.2.100 [link](https://github.com/MicrosoftArchive/redis/releases/tag/win-3.2.100)
* Erlang OTP 25.0.2 [link](https://www.erlang.org/downloads)
* RabbitMQ 3.10.6 [link](https://www.rabbitmq.com/install-windows.html)
* Nodejs 10.23 [link](https://nodejs.org/download/release/v10.23.0/)
* PM2 [link](https://pm2.keymetrics.io/docs/usage/quick-start/)
!!! warning
Учетная запись пользователя под которым производится установка должна иметь имя в английской раскладке
## 2. Настроить файрвол .
* Открыть порты 80, 443 для входящего трафика
## 3. Настроить сервер для доступа к сервису обновлений.
!!! note
На этапе внедрения сервис обновлений ООО "Лексема" не используется.
Для поставки пакетов с новым функционалом используется сетевой ресурс в сети заказчика. Обновления производятся заказчиком самостоятельно.

File diff suppressed because one or more lines are too long

View File

@ -1,163 +0,0 @@
# Настройка авторизации пользователей
## Общие сведения
Настройка авторизации пользователей производится с помощью конфигурационного файла *./config/local.js* в разделе **gate**. Следует отметить, что этот файл должен содержаться в списке исключений системы контроля версий (занесён в файл .gitignore). Также для этих целей можно использовать файл *./config/production.js*, однако следует учитывать, что настройки файла local.js более приоритетные, чем у production.js.
Использовать файл *./config/default.js* для настройки авторизации не рекомендуется по причине необходимости прописать в настройках конфиденциальные данные.
## Стандартная авторизация
Настройки веб-сервисов производятся в разделе **applications**, настройки авторизации пользователей - в подразделе **gate**. Более подробно про настройку раздела **gate** можно прочитать в [перечне настроек gate](./../../../../service/gate/configuration.md).
- **_sessionLifeTime_** - время жизни сессии в минутах (по умолчанию `10`).
- **_ldap_** - раздел, содержащий настройки доменной авторизации (с проверкой логина/пароля на контроллере домена)
* **_url_** - адрес контроллера домена. Пример: `ldap(s)://domain:port`.
* **_bindDN_** - логин администратора домена. В случае пустой строки будет произведена попытка анонимного подключения.
* **_bindCredentials_** - пароль администратора домена.
* **_searchBase_** - описание базового имени откуда начинается поиск пользователей. Пример: `ou=users,dc=example,dc=org`
* **_searchFilter_** - описание фильтра ldap для поиска пользователей.
* **_searchAttributes_** - список атрибутов, возвращаемых контроллером домена при удачном поиске.
- **_validation_** - настройки валидации пароля и логина пользователя.
* **_passwordRegularExpression_** - регулярное выражение для проверки пароля (по умолчанию `/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,}$/`).
Пример:
```js
applications: {
gate: {
sessionLifeTime: 1800,
ldap: {
url: 'ldap://domain.local:port',
bindDN: 'CN=User,CN=Users,DC=domain,DC=local',
bindCredentials: 'password',
searchBase: 'OU=Users,OU=Organization,DC=domain,DC=local',
searchFilter: '(&(objectclass=person)(sAMAccountName={{username}}))',
searchAttributes: ['displayName', 'sAMAccountName']
},
validation: {
passwordRegularExpression: /^[a-zA-Z0-9]{3,}$/
},
// ...
},
// ...
}
```
## Двухфакторная авторизация
- **_twoFactorProvider_** - провайдер двухфакторной аутентификации. Доступные значения: *none*, *email*, *phone* (по умолчанию `'none'`). В случае установки значения none считается выключенной.
- **_userTokenLifeTime_** - устанавливает время действия токена восстановления пароля или кода входа при двухфакторной аутентификации в часах (по умолчанию 1). Можно задавать дробные числа, чтобы указать минуты и/или секунды.
- **_attemptsLimitForConfirmCode_** - количество попыток ввода токена восстановления пароля или кода входа при двухфакторной аутентификации (по умолчанию 0). Если значение равно 0, то количество попыток не ограничено.
- **_timeLimitForResendingConfirmCode_** - лимит времени (в секундах) для возможности повторной отправки токена восстановления пароля или кода входа при двухфакторной аутентификации (по умолчанию 0 - без ограничений по времени). Настройка влияет на доступность кнопки отправки кода. На сервере проверка не осуществляется.
Чтобы отправка писем на почту работала, необходимо подключить почтовый ящик в разделе **applications.post.emails**. Чтобы работала отправка СМС, необходимо произвести настройки в разделе **applications.post.sms**.
Пример:
``` js
applications: {
gate: {
sessionLifeTime: 1800,
ldap: {
// ...
},
validation: {
// ...
},
twoFactorProvider: 'phone',
userTokenLifeTime: 0.1,
attemptsLimitForConfirmCode: 3,
timeLimitForResendingConfirmCode: 30
},
// ...
post: {
defaultEmailId: 'default',
emails: {
default: {
host: 'smtp.gmail.com',
port: 587,
secure: false,
user: 'lexemaecm@gmail.com',
pass: 'password',
userName: 'Lexema'
}
},
sms:{
provider: 'mts',
token: 'abc01234-012a-0abc-0895-abc012345678',
sender:'LEXEMAECM'
},
// ...
}
```
## Доменная авторизация
Обновление данных происходит после каждой авторизации пользователя в системе. для обновления необходимо настроить следующие разделы конфигурации:
- **_applications.gate.ldap.searchAttributes_** - параметр, отвечающий за возвращаемые наборы данных пользователей при авторизации.
- **_applications.gate.ldapSchemeDictionary_** - словарь сопоставления атрибутов пользователя системы и пользователя домена.
**_ldapSchemeDictionary_** - словарь сопоставления атрибутов, возвращаемых после поиска пользователя в контроллере домена, и полей, доступных для обновления в таблице пользователей. Ключ словаря - параметр пользователя системы, значение ключа - параметр пользователя домена. Значения должны быть описаны в параметре ldap.searchAttributes. Доступные значения для обновления в таблице: *firstName*, *lastName*, *middleName*, *email*, *phoneNumber*.
Пример:
```js
applications: {
gate: {
sessionLifeTime: 1800,
ldap: {
url: 'ldap://domain:port',
bindDN: 'CN=User,CN=Users,DC=domain',
bindCredentials: 'password',
searchBase: 'OU=Users,OU=Organization,DC=domain',
searchFilter: '(&(objectclass=person)(sAMAccountName={{username}}))',
searchAttributes: ['sn', 'givenName', 'mobile', 'middleName', 'mail', 'sAMAccountName']
},
ldapSchemeDictionary: {
firstName: 'givenName',
lastName: 'sn',
middleName: 'middleName',
email: 'mail',
phoneNumber: 'mobile'
}
},
// ...
}
```
## Смена пароля при первом входе в систему
- Чтобы новым пользователям в системе предлагалось сменить пароль при первом входе, необходимо включить настройку **_enableChangePasswordOnFirstLogin_**.
- **_userTokenProvider_** - имя провайдера восстановления пароля (по умолчанию 'Email'). Доступные значения: *Email*, *Phone*. От этой настройки зависит, придёт код для смены пароля на почту или в СМС.
Чтобы отправка писем на почту работала, необходимо подключить почтовый ящик в разделе **applications.post.emails**. Чтобы работала отправка СМС, необходимо произвести настройки в разделе **applications.post.sms**.
Пример:
```js
applications: {
gate: {
sessionLifeTime: 1800,
ldap: {
// ...
},
validation: {
// ...
},
enableChangePasswordOnFirstLogin : true,
userTokenProvider: 'Email'
},
// ...
}
```
## Ограничение срока действия паролей пользователей
- Настройка **_passwordExpiration_** задает срок действия пароля пользователя в днях, значение 0 отключает проверку (по умолчанию значение 0). По истечении срока действия пароля, при попытке входа в систему пользователю будем предложено сменить пароль. Письмо с одноразовым кодом для смены пароля придёт на почту пользователя.
- **_userTokenProvider_** - имя провайдера восстановления пароля (по умолчанию 'Email'). Доступные значения: *Email*, *Phone*. От этой настройки зависит, придёт код для смены пароля на почту или в СМС.
Чтобы отправка писем на почту работала, необходимо подключить почтовый ящик в разделе **applications.post.emails**. Чтобы работала отправка СМС, необходимо произвести настройки в разделе **applications.post.sms**.