# Документация # Проектная документация # Виденье проекта [https://docs.google.com/document/d/1MiBwh1aJ6nsGZyaqJgGu5FnaC\_Xvub0CWArW\_Endo8w/edit?usp=sharing](https://docs.google.com/document/d/1MiBwh1aJ6nsGZyaqJgGu5FnaC_Xvub0CWArW_Endo8w/edit?usp=sharing) # Функциональные требования [https://docs.google.com/document/d/1XaGeG-V8wc3K0vuZUWEoluA0S7fye5aCzVjIofLX6Fs/edit?usp=sharing](https://docs.google.com/document/d/1XaGeG-V8wc3K0vuZUWEoluA0S7fye5aCzVjIofLX6Fs/edit?usp=sharing) # Архитектура [https://gitlab.rarus.ru/dr-1C-retail/index-spp-doc](https://gitlab.rarus.ru/dr-1C-retail/index-spp-doc)# Принцип расчета индекса **1. Индекс** - отношение число посетителей к коммерческой площади объектов за N-периодичность, где N может принимать значения: день, неделя, месяц, квартал и год. Индекс всегда разбивается на N-периодичность. Правила выбора периода каждой N-периодичности: - день - календарный день - неделя - календарная неделя (с понедельника по воскресенье) - месяц - календарный месяц (с первого дня месяца по последний день месяца) - квартал - календарный квартал (с первого дня квартала по последний день квартала) - год - календарный год (с первого дня года по последний день года) **Общая формула расчета индекса:** [![image-1695146709412.png](https://rzn-wb-02.1c-hosting.com/uploads/images/gallery/2023-09/scaled-1680-/image-1695146709412.png) ](https://rzn-wb-02.1c-hosting.com/uploads/images/gallery/2023-09/image-1695146709412.png), где [![image-1695146736914.png](https://rzn-wb-02.1c-hosting.com/uploads/images/gallery/2023-09/scaled-1680-/image-1695146736914.png) -](https://rzn-wb-02.1c-hosting.com/uploads/images/gallery/2023-09/image-1695146736914.png) посещаемость объекта за m-день по счету периодичности, N - количество календарных дней в периодичности, S - площадь объекта. Например: **Объект:** ТЦ "Солнышко" **Площадь:** 136000 м^2. **Посещаемость**:
ДеньПосещаемость
04.09.2023460 792
05.09.2023349 621
06.09.2023347 337
07.09.2023339 815
08.09.2023340 794
09.09.2023341 773
10.09.2023350 024
11.09.2023395 949
12.09.2023354 614
13.09.2023404 033
14.09.2023363 209
15.09.2023369 375
16.09.2023351 758
17.09.2023365 543
Период построения: 04.09.2023 - 17.09.2023 Периодичность: Неделя **Индекс за 04.09-10.09**: (460792+349621+347337+339815+340794+341773+350024)/136000 = **18,60** **Индекс за 11.09-17.09**: (395949+354614+404033+363209+369375+351758+365543)/136000 = **19,15** **2. Шаблоны** - сохраненные фильтры по атрибутам объекта для формирования индекса. У шаблона может быть указан период фиксации в виде даты начала и даты окончания (либо должна быть функция фиксации индекса за период по шаблону). Пример шаблона: ```JSON { "template": { "address": [ { "fias_ids": [ "123123", "123123", "123213" ], "representation": "Россия; Рязань; Глазань" } ], "area": [ { "value": 45000, "operator": "gte" }, { "value": 90000, "operator": "lte" } ], "is_mall": true, "props": [ { "id": "uid", "prop_name": "1706532045", "values": [{ "id": 2, "value": "Одежда" }], "operator": "eq", "group": false }, { "id": "uid2", "operator": "or", "group": true, "children": [ { "id": "uid3", "prop_name": "1706532045", "values": [{ "id": 4, "value": "Женская одежда" }], "operator": "neq", "group": false }, { "id": "uid4", "prop_name": "1706105749", "values": [ { "id": 42, "value": 1 }, { "id": 45, "value": 3 } ], "operator": "in", "group": false }, ] } ] } } ``` eq — равно neq — не равно lt — меньше lte — меньше или равно gt — больше gte — больше или равно in - находит объекты со свойством, значение которого равно одному из значений из списка nin - находит объекты со свойством, значение которого не равно ни одному из значений из списка is\_mall принимает значения - true, false, none. none отменяет применение фильтра **3. Фиксация индекса** По существующим шаблонам должен быть предусмотрен механизм фиксации индекса работающий следующим образом: строится индекс по указанным фильтрам шаблона и сохраняется за указанный период фиксации шаблона. Фиксировать значение индекса рекомендуется в разрезе дня. Значения индекса для фиксации строятся на основе данных посещаемости по объектам с учетом основных принципов расчета и формулы расчета индекса. В случае если за определенный период нет данных для расчета индекса, то такой индекс заполняется в разрезе дня со значением равным 0 (нулю). **4. Расчет индекса** Пример запроса индекса доступен [по ссылке](https://rzn-wb-02.1c-hosting.com/books/razrabotka-3ug/page/primer-zaprosa-polucheniya-indeksa). **Основные принципы расчета индекса:** - Данные по объектам берутся только за период работы с объектом (атрибуты объекта: дата начала работы, дата окончания работы с объектом). - Данные по объекту не берутся в случае если по объекту отсутствуют данные за полную N-периодичность, в ином случае данные по объекту участвуют в расчете индекса. - В случае построение индекса по шаблону (запрос по "template" из примера запроса): - Период построение отчета попадает в период фиксации по шаблону: - Данные по индексу строятся из фиксированного индекса по шаблону - Период отчета не попадает в период фиксации по шаблону: - Данные по индексу строятся на основании данных посещаемости объектов - Период отчета по индексу частично попадает в период фиксации по шаблону: - За период который попадает в период фиксации данные строятся из фиксированного индекса по шаблону - За период который не попадает в период фиксации данные на основании данных посещаемости объектов - В случае построение индекса по объектом (запрос по "objects" из примера запроса): - Данные строятся на основании посещаемости объектов [Пример расчета индекса в google-таблице](https://docs.google.com/spreadsheets/d/1pDqcJS5Mw-tQOWBjtIUdc1aqNQFJ78xf7tTrG8o480k/edit?usp=sharing)# Дизайн-макет [https://drive.google.com/file/d/1bhgVd5DeUeBM8EOZE8Clovrc1kcXMtPH/view?usp=sharing](https://drive.google.com/file/d/1bhgVd5DeUeBM8EOZE8Clovrc1kcXMtPH/view?usp=sharing)# Документация API # Документация сервиса https://indshop-pg-02.corp.rarus-cloud.ru/swagger/index.html#/ # Документация бека https://indshop-pg-03.corp.rarus-cloud.ru/docs# # Описание ролевого доступа 1. Ролевая система должна обеспечивать уровень доступа на уровне сущности. С правами "Видимость", "Редактор" 1. Например. недоступна видимость и редактирование шаблонов. Доступно редактирование объектов. Доступно видимость клиентов, не доступно редактирование. 2. ### Предложение по ролевой системе на бекенде TODO... Ролевая система на бекенде реализуется на базе JWT токена ```JSON { ... "user_id": USER_ID, "organization_id": ORGANIZATION_ID, "roles": LIST_OF_ROLES, "type": TOKEN_TYPE, "rights": RIGHTS_MAP, ... } ``` - USER\_ID - id пользователя на бекенте (у суперпользователя равен 0) - ORGANIZATION\_ID - id клиента(организации) (у суперпользователя отсутствует или равен None) - LIST\_OF\_ROLES - список (со строками) ролей назначенных пользователю на беке - TOKEN\_TYPE - тип токена (access или refresh) - RIGHTS\_MAP - агрегированный словарь с правами и их значениями ##### Варианты ролевого доступа (возможно комбинирование) - доступ к роуту по значения права из RIGHTS\_MAP - на роут устанавливается связка **right\_name**: **minimum\_value** - right\_name - названия права доступа - minimum\_value - минимальное значение права для доступа - view - 1 - edit - 2 - admin - 3 - при запросе на роут сверяются значение RIGHTS\_MAP - наличие установленного на роут **right\_name** в токене - значение **minimum\_value** в токене - доступ по значению ORGANIZATION\_ID. внутри роута производится проверка соответсвия принадлежности сущности и пользователя к одной организации (для суперпользователя не производится) - доступ по TOKEN\_TYPE - только для **POST: /auth/refresh** - производится проверка значения TOKEN\_TYPE из токена
**Кейс (URL)****Право****Минимальное значение права****Сверка ORGANIZATION\_ID**
Запрос данных из dadata. **POST: /dadata/suggest/address** dadataview
Запрос данных пресета запроса индекса (для отрисовки отчета беком). **GET: /index/query/preset/{preset\_id}** index\_query\_preset view
Запрос индекса в json **POST: /index/query** index\_queryview
Экспорт индекса в файл **POST: /index/query/{format}** index\_queryview
Запрос списка шаблонов запроса индекса **GET: /reports** reportview
Запрос информации по конкретному шаблону запроса индекса **GET: /reports/{report\_id}** reportview
Создание нового шаблона запроса индекса **POST: /reports** reportedit
Изменение конкретного шаблона запроса индекса **PATCH: /reports/{report\_id}** reportedit
Удаление конкретного шаблона запроса индекса **DELETE: /reports/{report\_id}** reportedit
Запрос списка шаблонов рассылок **GET: /campaigns** campaign (report?) view
Запрос информации по конкретному шаблону рассылки **GET: /campaigns/{campaign\_id}** campaign (report?) view
Создание нового шаблона рассылки **POST: /campaigns** campaign (report?) edit
Изменение конкретного шаблона рассылки **PATCH: /campaigns/{campaign\_id}** campaign (report?) edit
Удаление конкретного шаблона рассылки **DELETE: /campaigns/{campaign\_id}** campaign (report?) edit
Запрос списка ролей **GET: /roles** roleview
Запрос списка прав **GET: /roles/rights** roleview
Создание новой роли **POST: /roles** roleedit
Изменение конкретной роли **PATCH: /roles/{role\_id}** roleedit
Удаление конкретной роли **DELETE: /roles/{role\_id}** roleedit
Запрос списка пользователей **GET: /users** userview
Запрос информации по конкретному пользователю **GET: /users/{user\_id}** userview
Создание нового пользователя **POST: /users** useredit
Изменение конкретного пользователя **PATCH: /users/{user\_id}** useredit
Изменение пароля конкретного пользователя **PATCH: /users/{user\_id}/password** \* при изменении собственного пароля - без проверки ролей. user, None\*edit | None\*
Удаление конкретного пользователя **DELETE: /users/{user\_id}** useredit