перенос инструкций

This commit is contained in:
mirzakaev_tf 2023-04-06 14:26:20 +05:00
commit 43b88a9771
2429 changed files with 19872 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/env
/site
/venv

15
.readthedocs.yaml Normal file
View File

@ -0,0 +1,15 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
mkdocs:
configuration: mkdocs.yml
# Optionally set the version of Python and requirements required to build your docs
python:
version: "3.8"
install:
- requirements: mkdocs/requirements.txt

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"cSpell.language": "en, ru"
}

79
admin-manuals.yml Normal file
View File

@ -0,0 +1,79 @@
site_name: Руководство администратора приложения Lexema
repo_url: http://gogs.lexema.ru/zpavel/sample-docs
edit_uri: _edit/master/docs/
nav:
markdown_extensions:
- toc:
separator: "_"
permalink: "#"
slugify: !!python/name:pymdownx.slugs.uslugify
- attr_list
- admonition
- sane_lists
- pymdownx.highlight
- pymdownx.superfences
- def_list
extra_css:
- css/extra.css
extra_javascript:
- javascripts/extra.js
plugins:
- search:
lang: ['ru', 'en']
- section-index
- include-markdown
- literate-nav:
nav_file: SUMMARY.md
# Для пдфки видимо свой файл оглавления сделать не получится
- with-pdf:
author: Ксения Шабанова, Павел Зюзин, Ксения Имамутдинова, Альбина Янгирова, Тимур Мирзакаев, Марина Халиуллина, Регина Лапина
copyright: ООО "Лексема"
#
#cover: false
#back_cover: true
#cover_title: TITLE TEXT
cover_subtitle: Версия 20221018-15
#custom_template_path: TEMPLATES PATH
#
toc_title: Оглавление
#heading_shift: false
# toc_level: 3
#ordered_chapter_level: 2
#excludes_children:
# - 'release-notes/:upgrading'
# - 'release-notes/:changelog'
#
#exclude_pages:
# - 'bugs/'
# - 'appendix/contribute/'
#convert_iframe:
# - src: IFRAME SRC
# img: POSTER IMAGE URL
# text: ALTERNATE TEXT
# - src: ...
#two_columns_level: 3
#
#render_js: true
#headless_chrome_path: headless-chromium
#
output_path: pdf/admin-manual.pdf
#enabled_if_env: ENABLE_PDF_EXPORT
#
#debug_html: true
#show_anchors: true
#verbose: true
theme:
name: material
features:
- navigation.instant
language: ru
palette:
primary: white
docs_dir: docs
site_dir: site

11
custom_theme/404.html Normal file
View File

@ -0,0 +1,11 @@
{% extends "base.html" %}
{% block content %}
<div class="row-fluid">
<div id="main-content" class="span12">
<h1 id="404-page-not-found" style="text-align: center">404 - Страница не найдена</h1>
</div>
</div>
{% endblock %}

49
dev.yml Normal file
View File

@ -0,0 +1,49 @@
site_name: Lexema-ECM
#repo_url: http://gogs.lex.lan/yangirova_as/Dokumentooborot
nav:
markdown_extensions:
- toc:
separator: "_"
permalink: "#"
slugify: !!python/name:pymdownx.slugs.uslugify
- attr_list
- admonition
- sane_lists
- pymdownx.highlight
- pymdownx.superfences
- def_list
- pymdownx.details
- pymdownx.tasklist:
custom_checkbox: true
extra_css:
- css/extra.css
extra_javascript:
- javascripts/extra.js
plugins:
- search:
lang: ['ru', 'en']
- section-index
- include-markdown
- mkdocs-video
- literate-nav:
nav_file: SUMMARY.md
theme:
name: material
features:
- navigation.instant
- navigation.top
- navigation.tracking
- toc.follow
- toc.integrate
language: ru
palette:
primary: green
docs_dir: docs
site_dir: site

View File

@ -0,0 +1,7 @@
## Клиент
| Уровень | Требование |
| ------- | ---------- |
|Среда исполнения |браузер Chrome |
|Платформа | - |
|Инфраструктура | - |

View File

@ -0,0 +1,20 @@
# Сервер приложений для Docker
| Уровень | Требование |
| ------- | ---------- |
|Среда исполнения |Docker
||Docker-compose |
|Платформа | Linux (Ubuntu 2004) |
|Инфраструктура | CPU: Архитектура x64, не менее 10 ядер, частота процессора не ниже 2,6 ГГц
|| RAM: Не менее 16 Гб
|| HDD: Не менее 100 Гб
|| Net: Не менее 1 Гбит
# Список необходимых лицензий
| Продукт | Прмечание |
| ------- | ---------- |
| Lexema 8 | лицензия на сервер |

View File

@ -0,0 +1,19 @@
# Сервер MS SQL
| Уровень | Требование |
| ------- | ---------- |
|Среда исполнения |MS SQL 2014
|Платформа | Windows Server |
|Инфраструктура | CPU: Архитектура x64, не менее 16 ядер, частота процессора не ниже 2,6 ГГц
|| RAM: Не менее 32 Гб
|| HDD: Не менее 1024 Гб
|| Net: Не менее 1 Гбит
# Список необходимых лицензий
| Продукт | Прмечание |
| ------- | ---------- |
| MSSQL 2014 | лицензия на сервер + клиентские или |
| | лицензия на ядра сервера |

View File

@ -0,0 +1,20 @@
# Сервер приложений для NPM
| Уровень | Требование |
| ------- | ---------- |
|Среда исполнения | NodeJS 10+ |
|| Nginx 1.19+ |
|| Redis 3.2.100 |
|| Erlang OTP 23.3 |
|| Rabbitmq 3.8.9 |
|Платформа | Windows Server (2012 R2) |
|Инфраструктура | CPU: Архитектура x64, не менее 16 ядер, частота процессора не ниже 2,6 ГГц
|| RAM: Не менее 32 Гб
|| HDD: Не менее 200 Гб
|| Net: Не менее 1 Гбит
# Список необходимых лицензий
| Продукт | Прмечание |
| ------- | ---------- |
| Lexema 8 | лицензия на сервер |

View File

@ -0,0 +1,10 @@
# Сервер PostgreSQl
| Уровень | Требование |
| ------- | ---------- |
|Среда исполнения | PostgreSQl 13
|Платформа | Linux (Ubuntu 2004)|
|Инфраструктура | CPU: Архитектура x64, не менее 16 ядер, частота процессора не ниже 2,6 ГГц
|| RAM: Не менее 32 Гб
|| HDD: Не менее 500 Гб
|| Net: Не менее 1 Гбит

View File

@ -0,0 +1,5 @@
* [Клиент](./Requirements_client.md)
* [Docker образы](./Requirements_docker.md)
* [NPM пакеты](./Requirements_npm.md)
* [БД MSSQL](./Requirements_mssql.md)
* [БД Postgree](./Requirements_postgre.md)

View File

@ -0,0 +1,20 @@
{%
include-markdown "Requirements_client.md"
heading-offset=1
%}
{%
include-markdown "./Requirements_docker.md"
heading-offset=1
%}
{%
include-markdown "./Requirements_npm.md"
heading-offset=1
%}
{%
include-markdown "./Requirements_mssql.md"
heading-offset=1
%}
{%
include-markdown "./Requirements_postgre.md"
heading-offset=1
%}

View File

@ -0,0 +1,4 @@
* [Общее описание](./arch.md)
* [Варианты поставки](./deploy_variant.md)
* [Используемые сервисы](../service/)
* [Требования к системе](./Requirements/index.md)

View File

@ -0,0 +1,43 @@
# Описание общей архитектуры приложения
Приложение построено по 3х звенной модели
**Клиент - Сервер приложений - Сервер БД**
Взаимодействие клиентской и серверной части приложения осуществляется на основе веб-протоколов (http(s), webSocket и др.). Каждый веб-сервис определяет свой набор публичных программных интерфейсов (API) в виде путей относительно адреса приложения, по которым клиент может обращаться к нему. Например, _/api/v1.0/service/_ - путь для обращения к веб-сервису service. Обращение к веб-сервисам чаще всего происходит с помощью http-запросов.
## Клиент
Клиентская часть представляет собой браузерное html5-приложение на основе различных библиотек и пакетов, написанное на языке javascript.
## Сервер приложений.
Сервер приложений имеет микросервисную архитектуру и может быть адаптирован для запуска в облаке
![Серверная архитектура](./img/Server_arch.png)
На подробной схеме представлены веб-сервисы приложения **Lexema**. Веб-сервисы представляют собой самостоятельные приложения на базе экосистемы _Node.js_ и фреймворка [**Koa**](https://koajs.com/). Каждый веб-сервис реализует строго определённый функционал и не зависит от реализации других веб-сервисов. Исходя из выполняемой ими функции, веб-сервисы могут обращаться к другим веб-сервисам приложения **Lexema** и к различным используемым технологиям. Например, к хранилищу _Redis_ или к хранилищу данных.
В блоке каждого сервиса перечислены их API в виде типа запроса и адреса, по которому этот запрос прослушивается сервисом. Большими стрелками указано взаимодействие между сервисами с помощью сервисной шины.
__Обязательные веб-сервисы :__
* entrypoint - Точка входа для клиентов
* config - Сервис конфигурации
* logic - Сервис логики
* gate - Сервис входа (аутентификации)
* radio - Сервис взаимодействия реального времени
* lock - Сервис пессимистического блокировщика
* data - Сервис доступа к данным и процедурам хранимым в БД
* RabbitMQ - Сервер RabbitMQ служит шиной обмена данными между веб-сервисами. Сервисы используют его механизмы (сообщения и очереди сообщений) для оповещения друг друга.
* Redis -Для хранения различной системной информации используется высокоскоростное хранилище данных Redis
__Опциональные веб-сервисы :__
* post - Сервис электронной почты и смс сообщений
* jsreport - Сервис jsreport предназначен для работы с отчетами jsreport.
* preview - Сервис превью предназначен для конвертации файлов в файлы в формате pdf, которые можно просматривать в контроле FilePreview.
* lexema-dss - Сервис для работы с ОЭП выпускаемыми клиентом
## Сервер БД
В качестве сервера баз данных используется MS SQL или PostgreSQL

View File

@ -0,0 +1,30 @@
Данное приложение может поставлятся on-premise в 2х вариантах:
- облачное решение, поставляется в виде подготовленных Docker-образов
- пакетное решение, поставляется в виде npm-пакетов
Для администрирования каждого решения необходимы следующие компетенции
| Компетенция | Поставка Docker | Поставка npm-пакетами |
| ----------- | ---------- | ---------- |
| Network | + | + |
| Database | + | + |
| Docker | + | |
| Nginx | + | + |
| NPM | | + |
| PM2 | | + |
| Redis | | + |
| RabbitMQ | | + |
!!! note
Команды docker для сборки, выгрузки и загрузки можно посмотреть по ссылке https://docs.docker.com/engine/reference/commandline/cli/.
Команды для запуска и управления сервисами через docker-compose можно посмотреть по ссылке https://docs.docker.com/compose/reference/overview/
Команды для запуска и управления сервисами через NPM https://docs.npmjs.com/ , https://pm2.io/docs/plus/overview/

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View File

@ -0,0 +1,168 @@
# FAQ Lexema-ECM
## Настройки сервера и ПО
!!! question
Как изменить часовой пояс в системе (Postgre SQL)?
Необходимо выполнение следующих команд в PgAdmin
```sql
select localtimestamp; /*возвращает текущую дату и время в часовом поясе из сеанса sql*/
select current_timestamp; /*возвращает текущие дату и время из сеанса пользователя*/
SELECT NOW(); --посмотреть серверное время
SELECT * FROM pg_timezone_names; -- посмотреть типы часовых поясов
ALTER SYSTEM SET timezone TO 'Europe/Moscow'; -- изменение часового пояса
```
Подробно о часовых поясах в Postge SQL можно узнать [здесь](https://it-blackcat.blogspot.com/2019/10/postgresql-and-timezone.html)
## Электронные подписи
!!! question
Почему при выпуске УНЭП не появляются ссылки для скачивания заявки на выпуск ЭП и расписки в получении ЭП?
Для выпуска сертификата УНЭП пользователь системы должен быть привязан к конкретному физическому лицу.
Для этого нужно
1) пройти в раздел Меню - группа "Администрирование" - группа "Управление пользователями" - пункт "Управление пользователями".
2) в загрузившемся списке найти нужный логин и выделить галочкой
3) нажать "Данные пользователя" - выбрать физическое лицо в выпадающем списке - и нажать "Сохранить"
!!! question
Как подписать документ квалифицированной подписью?
Прежде чем использовать КЭП, необходимо настроить рабочее место пользователя соответствующим образом. Для настройки - см. статью [Как настроить работу с КЭП на токенах](../ЭП/Настройка для токенов КЭП/Настройка для токенов КЭП.md)
!!! question
Возможно ли подтверждать операции подписания по SMS?
Да, возможно. Для этого необходимо пройти Меню - группа "Администрирование" - группа "Система" - пункт "Глобальные настройки".
Нажать кнопку "Настройка" и выключить флаг "Отключить подтверждение ЭЦП по СМС (новые сертификаты)"
![Подтверждение через смс](./media/apprbysms.png)
## Работа с документами и маршрутами
!!! question
Как создать новый вид заявления?
см. статью [Конструктор документов](../СЭД/Конструктор документов/Конструктор документов.md)
!!! question
Как создать новый маршрут к заявлению?
см. статью [ Шаблоны маршрутов](../СЭД/Настройка шаблонов маршрутов/Настройка шаблонов маршрутов.md)
!!! question
Почему я не могу создать ЛНД?
Создание ЛНД доступно только ответственным сотрудникам организации, поэтому этим пользователям необходимо дать в системе дополнительные права. Для этого нужно пройти в справочник "Подтипы документа" и указать в таблице "Пользователи с правом создания" этих пользователей. Подробнее см. статью [Подтипы документов](../СЭД/Справочники/Документооборот/Подтипы документов/Подтипы документов.md)
!!! question
Почему я не вижу документ в реестре?
По умолчанию во всех реестрах системы Lexema-ECM пользователь видит документы, если
а) он сам является автором этих документов
б) он участвовал в маршруте этих документов, даже если сам не является автором
в) он получил документ посредством списка рассылки
При необходимости можно дать так называемые горизонтальные права -то есть возможность видеть документы других подразделений при том, что в вышеописанные условия не попадает (кас. предоставления горизонтальных прав - см. статью [Настройка пользователей](../framework/User managment/Настройка пользователей/Настройка пользователей.md).
Если пользователь не видит документ - вероятнее всего он не подходит ни под одно из вышеописанных условий.
## Пользователи
!!! question
Как создать нового пользователя?
см. статью [Управление пользователями](http://127.0.0.1:8000/Admin%20manuals/framework/User%20managment/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8/#%D1%81%D1%85%D0%B5%D0%BC%D0%B0_1_%D1%84%D0%B8%D0%B7_%D0%BB%D0%B8%D1%86%D0%BE__%D0%BB%D0%BE%D0%B3%D0%B8%D0%BD__%D1%81%D0%BE%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%B8%D0%BA)
## Настройка интеграции с Active Directory
Если возникает ошибка при обращении к домену, например по кнопке Импорт из AD
![Импорт из AD](./media/Импорт из AD.png){: .zoom}
![Ошибка интеграции с доменом](./media/ошибка интеграции с доменом.png)
Необходимо проверить заполнение файла http://gogs.lex.lan/deploy/НАЗВАНИЕ САЙТА/src/master/config/production.js, где указан полный путь до юнита с пользователями ldap: { ..bindDN:
Например правильное заполнение будет иметь вид:
'CN=service ldap lexema,OU=Technical Accounts,OU=ЦифроваяПомощь,OU=RU,DC=medholding,DC=corp',
Параметры полного пути до юнита с пользователями необходимо запрашивать у системных администраторов
посмотреть параметры можно в cmd командой whoami /fqdn
CN=service ldap lexema,OU=Technical Accounts,OU=ЦифроваяПомощь,OU=RU,DC=medholding,DC=corp
подробнее о настройке см. статью [Настройки сервиса входа](../../Admin manuals/service/gate/configuration.md).
## Управленческая структура и руководители
Для загрузки данных управленческой структуры необходимо настроить "Произвольные выборки"
подробнее о настройке см. статью [Произвольные выборки](../../Admin manuals/СЭД/Настройка для интеграции с 1С/Настройка интеграции справочников и документов/Вкладка Произвольные выборки.md).
## Версии библиотек, установленные на проекте
!!! question
Как посмотреть версии библиотек, установленные на проекте?
В служебном меню, открывающемся при нажатии на имя пользователя в правом верхнем углу страницы приложения нажмите кнопку "О системе"
![О системе](media/menuUser.png)
![Библиотеки](media/library.png)
## Список сертификатов КЭП пустой
!!! question
Что делать если по кнопке Добавить сертификат - список сертификатов пустой?
см. статью [Привязка КЭП к пользователю Lexema-ECM](../../Admin manuals/ЭП/Настройка для токенов КЭП/Настройка для токенов КЭП.md#Шаг_3._Привязка_КЭП_к пользователю_Lexema-ECM).
Как добавить в личное хранилище импортированные сертификаты? </br>
![csp1](media/csp1.PNG){: .zoom}</br>
![csp2](media/csp2.PNG){: .zoom}</br>
![csp3](media/csp3.PNG){: .zoom}</br>
![csp4](media/csp4.PNG){: .zoom}</br>
![csp5](media/csp5.PNG){: .zoom}</br>
![сертификаты-личное](media/сертификаты-личное.PNG){: .zoom}</br>
## Использование Crontab для сервиса sheduler
!!! question
Как правильно использовать Cron при создании расписания сервиса **sheduler**?
Чтобы правильно настроить расписание в данном формате, перейдите [по ссылке](https://crontab-generator.com/ru). Сервис использует серверное время, где развернут сервис.
Примеры использования crontab:
Описание | Вычисление
---------|-----------
каждые 30 минут каждый день | 30 &lowast; &lowast; &lowast; &lowast; |
каждые 60 минут каждый день | 0 &lowast; &lowast; &lowast; &lowast; |
каждый час с 9 до 18 по рабочим дням | 0 9-18 * * 1-5 |
каждые два часа с 9 до 18 по рабочим дням | 0 */2 * * 1-5 |
в 6:00 по рабочим дням | 0 6 * * 1-5 |
в 12:00 в субботу | 0 12 * * 6 |
## Добавление этапа в полностью завершенный маршрут
В случае если в полностью завершенный маршрут необходимо добавить новый этап, то укажите:
```
update r
set routestatus = 2
from route r where doccode = вкодедокумента
select VCode /*вкод маршрута нужен будет в шаге 3*/ from route r where doccode = вкодедокумента
declare @rs bigint, si bigint
exec @rs = l8_sp_gencode 'RouteStage'
exec @rs = l8_sp_gencode 'StageItem'
insert RouteStage(VCode, PCode, StageNumber, Status)
select @rs, вкод_из_шага_2, 4, 2
insert StageItem(VCode, PCode, StageItemStatus, Stageuser, DaysForAction, DocumentAction,BeginDate)
select @si, @rs, 2, логин_Шагизиганова, 2, 1, getdate()
```
## Как проверить формат файла pdf/a-1
Удостовериться, что формат созданного файла действительно pdf/a-1 можно с помощью [онлайн сервиса](https://avepdf.com/ru/pdfa-validation)
## "Как мне или администратору отредактировать маршрут согласования?"
С помощью [формы корректировка маршрутов согласования](../СЭД/Форма корректировки маршрутов согласования/Форма корректировки маршрутов согласования.md)

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View File

@ -0,0 +1,2 @@
- [Архитектура приложения](./Arch/)
- [Lexema Framework](./framework/)

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,141 @@
# Интеграция с почтовым клиентом
## Общая информация
Для подключения почтового клиента к 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

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

View File

@ -0,0 +1,26 @@
# Сборка 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

@ -0,0 +1,27 @@
# Конфигурирование экземпляра приложения
Конфигурация приложения разделена на несколько файлов
основой служит сервис конфигурации который считывает файл и отдает его содержимое по апи
!!! 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

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

@ -0,0 +1,75 @@
# Настройка обозревателя аналитик
## Общее описание назначения документа
Настройка обозревателя аналитик (ОА) служит для выделения уникальных узлов в справочнике, открывающемся по кнопке <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.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

View File

@ -0,0 +1,159 @@
# Настройка архива вложенных документов
## Общее описание
Настройка архива вложенных документов необходима для работы аналитической формы [Архив вложенных документов](./../../../../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

@ -0,0 +1,21 @@
# Самостоятельное развертывание системы
* [Описание]( ./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](../../service/sheduler/index.md)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,26 @@
# 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

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

View File

@ -0,0 +1,99 @@
# Система логирования приложения
## Общее описание
Предназначено для просмотра сообщений (событий) (как правило, об ошибках) в системе. Просмотреть лог можно в формах "Логи приложения", "Управление пользователями", "Просмотр событий". Для работы с данными формами пользователь должен обладать правами Администратора.
## Форма "Логи приложения"
С помощью данной формы можно посмотреть историю событий приложения. Чтобы открыть форму "Логи приложения", необходимо в меню в папке "Администрирование", подпапке "Система" выбрать пункт "Логи приложения". Форма доступна пользователю с ролью **ECM_usersmanagement** либо **ECM_InformationSecurity**.
![Меню](./media/menu.png)
Откроется форма с пустой таблицей:
![Форма до загрузки строк в таблицу](./media/init.png){: .zoom}
Для того, чтобы заполнить таблицу, необходимо ввести в поле "TOP N" количество последних возникших в системе событий для отображения (количество строк в таблице), а затем нажать на кнопку "Загрузить". Записи будут загружены в порядке убывания по времени возникновения.
![Форма после загрузки строк в таблицу](./media/filled.png){: .zoom}
В столбце "Уровень" приводится тип сообщения о событии.
- error сообщение об ошибке;
- debug отладочное сообщение;
- info информационное техническое сообщение;
- MailInfo информационное сообщение от компоненты БД DBMail;
- MailError сообщение об ошибке от компоненты БД DBMail.
В столбце "Дата" указываются дата и время возникновения сообщения.
В столбце "Пользователи" указывается пользователь, спровоцировавший возникновение события. В некоторых случаях пользователь не указывается, например если событие произошло в результате технического вмешательства.
В столбце "Сообщение" приводится краткая информация о событии. Если нажать на ссылку-текст сообщения, то откроется окно для более удобного просмотра длинного текста. То же происходит и при нажатии на ссылки в других столбцах.
![Пример сообщения](./media/viewFullField.png){: .zoom}
В столбце "Сообщение пользователю" содержится сообщение, возникшее в момент события на экране вызвавшего его пользователя под кнопкой "Инфо".
В столбце "Детально" приводится детальная информация о событии, содержит дополнительные технические данные об ошибке.
В столбце "Запрос" указывается запрос к базе данных, при выполнении которого возникло событие.
В столбце "Сервис" указывается один из веб-сервисов, при выполнении которых возникло событие:
* entrypoint точка входа для клиентов;
* config сервис конфигурации;
* logic сервис логики;
* gate сервис входа (авторизации);
* radio сервис взаимодействия реального времени;
* lock сервис пессимистического блокировщика;
* data сервис доступа к данным и процедурам, хранимым в БД;
* RabbitMQ сервер RabbitMQ служит шиной обмена данными между веб-сервисами. Сервисы используют его механизмы (сообщения и очереди сообщений) для оповещения друг друга;
* Redis используется для хранения различной системной информации;
* post сервис электронной почты и смс-сообщений;
* jsreport предназначен для работы с отчетами jsreport;
* lexema-dss для работы с ОЭП выпускаемыми клиентом;
* preview предназначен для конвертации файлов в файлы в формате pdf, которые можно просматривать в элементе управления ```FilePreview```.
## Форма "Управление пользователями"
**Описание**
С помощью данной формы можно посмотреть журнал действий конкретного пользователя. Для этого нужно перейти в документ "Управление пользователями" в подраздел ["Журнал действий пользователей"](../../User managment/Управление пользователями/Управление пользователями.md#журнал_действий_пользователей). Выберите необходимого пользователя и нажмите кнопку **"Журнал действий пользователя"**
![Журнал действия](media/SelectJornal.png)
## Форма "Просмотр событий"
**Описание**
Для перехода в форму "Просмотр событий" в меню Пользователя выберите "Просмотр событий". Пользователь должен обладать правами Администратора.
![Просмотр событий](media/eventViewer.png)
![Реестр](media/reestr.png){: .zoom}
- Сессия идентификатор сессии;
- Пользователь - логин пользователя;
- Событие тип события;
- Объект идентификатор модели или запроса, к которому шло обращение;
- Параметры параметры, с которыми загружаются или изменяются данные;
- Ключ маршрута маршрут вкладки приложения, в которой была инициирована работа с данными;
- Идентификатор формы параметр-идентификатор в маршруте, по которому была открыта вкладка, например, идентификатор документа;
- Класс формы класс формы, которая открывается в данной вкладке;
- Браузер информация о браузере (название и версия), в которыом работал пользователь;
- Запрос идентификатор запросов на загрузку или изменение данных для отслеживания цепочки клиент-сервер;
- Дата время вызова события;
- Идентификатор организации идентификатор организации, в которой находился пользователь при вызове события.
Можно настроить загрузку данных, например по Пользователю, сессии, событию и т.д.
Для этого в панели инструментов нажмите кнопку "Загрузка данных".
![Загрузка](media/load.png)
В открывшемся окне выберите условия по которым необходимо отфильтровать реестре. Например укажем, что столбец "Пользователь" должен содержать значение "Director". После этого нажмите "Загрузить данные". После загрузки в реестре будут отображены лог действий пользователя "Director"
![Загрузка данных](media/loadData.png)
![Отфильтрованные сессии](media/session.png){: .zoom}

View File

@ -0,0 +1,571 @@
# Сборка документов, участвующих в документообороте, в БД
## Общее описание
Для участия документов определенного типа и успешного запуска этих документов по маршруту необходимо:
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

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

View File

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

View File

@ -0,0 +1,20 @@
# Использование ресурсов ООО "Лексема"
## Настройка доступа к приватному репозиторию
!!! 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

@ -0,0 +1,18 @@
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

@ -0,0 +1,45 @@
# Подготовка сервера приложения для развертывания 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

@ -0,0 +1,25 @@
# Подготовка сервера приложения для развертывания 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

@ -0,0 +1,5 @@
- [Описание](Config/Развертывание системы.md)
- [Подготовка серверов](./Prepare/)
- [Настройка](./Config/)
- [Развертывание](./Deploy/)
- [Обслуживание](./Maintenance/)

View File

@ -0,0 +1,4 @@
* [Управление пользователями через единый интерфейс](./Управление пользователями/Управление пользователями.md)
* [Создание пользователя](Управление пользователями/Управление пользователями/#создание_пользователя)
* [Назначение прав](Настройка пользователей/Настройка пользователей/#документооборот)
* [Заявки в техническую поддержку](Заявка в техническую поддержку/Заявки в техподдержку.md)

Some files were not shown because too many files have changed in this diff Show More