arm-ka-docs/source/tz/АРМ КА.Техническое задание - 07_8. Формирование отчетов - 01__Шахматка_.md

234 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
code: DOC-221277
title: "\"Шахматка\""
---
# "Шахматка"
Шахматка - визуальный инструмент выявления расхождений во взаимных расчетах между компаниями периметра по данным ОСВ. Работает только с оборотно-сальдовыми ведомостями (ОСВ). Сама шахматка ничего не исключает и не меняет данные; правки и исключение выполняются дальше - в таблице корректировок.
Пример шахматки:
| ДБ / КТ | Русский Бисквит | Пекарня | Организация 3 | Организация 4 | Организация N | Итого |
| --- | --- | --- | --- | --- | --- | --- |
| Русский Бисквит | | 5000,00 6000,00 (1000) | | | | |
| Пекарня | | | | | | |
| Организация 3 | | | | | | |
| Организация 4 | | | 20000 21000 (1000) | | | |
| Организация N | | | | | | |
| Итого | | | | | | |
Оси матрицы:
* Строка - компания A, **osv\_entry.legal\_entity\_id**.
* Столбец - компания B, встречный контрагент **osv\_entry.counterparty\_id**.
* Строки и столбцы формируются из одного набора **consolidation\_member** выбранной **consolidation\_version**.
* Комбинации, где **company\_a\_id** = **company\_b\_id**, в расчет не включаются и отображаются пустыми.
* Для стороны A используется **sum(osv\_entry.closing\_debit)** по выбранным дебетовым счетам.
* Для стороны B используется **sum(osv\_entry.closing\_credit)** по выбранным кредитовым счетам.
Настройки шахматки по-умолчанию:
* Расчет выполняется для выбранного **consolidation\_version\_id**.
* В матрицу включаются только компании из **consolidation\_member** выбранной версии.
* В расчет включаются только строки, где **osv\_entry.counterparty\_id** заполнен и контрагент входит в тот же периметр ГСК.
* Используются только строки актуального распознавания файла ОСВ.
* Используются файлы ОСВ за год и квартал выбранной консолидации.
* Пользователь может выбрать один или несколько дебетовых счетов и один или несколько кредитовых счетов из **chart\_of\_account**.
* В расчет шахматки включаются только расчетные строки ОСВ, относящиеся к контрагентам. Итоговые строки счетов, подразделений, договоров и других уровней детализации ОСВ в расчет не включаются.
Чтение шахматки:
* **amount\_a = sum(closing\_debit)** компании A по выбранным дебетовым счетам, где **counterparty\_id = company\_b\***.
* **amount\_b = sum(closing\_credit)** компании B по выбранным кредитовым счетам, где **counterparty\_id = company\_a\***.
* **variance\_amount** - разница между дебетовыми счетами компании А и кредитовыми счетами компании Б.
* **variance\_percent** - процентное соотношение разницы между счетами компании А и компании Б.
* Ячейки с **variance\_percent > 5** визуально выделяются.
Источник данных:
| **Таблица** | **Поле таблицы** | **Описание поля** | **SQL-запрос** |
| --- | --- | --- | --- |
| consolidation | year | Отчетный год | SELECT c.year, c.quarter FROM consolidation\_version cv JOIN consolidation c ON c.id = cv.consolidation\_id WHERE cv.id = consolidation\_version\_id\*; |
| consolidation | quarter | Отчетный квартал |
| consolidation\_member | legal\_entity\_id | Организация, включенная в периметр выбранной версии консолидации | SELECT cm.legal\_entity\_id, le.name, FROM consolidation\_member cm JOIN legal\_entity le ON le.id = cm.legal\_entity\_id WHERE cm.consolidation\_version\_id = consolidation\_version\_id\*; |
| legal\_entity | name | Наименование организации |
| stored\_file | id | Идентификатор файла ОСВ | SELECT id, legal\_entity\_id, period\_year, period\_quarter FROM stored\_file WHERE legal\_entity\_id = legal\_entity\_id\* AND document\_type = 'ОСВ' AND period\_year = period\_year\* AND period\_quarter = period\_quarter\*; |
| stored\_file | legal\_entity\_id | Организация, которой принадлежит загруженный файл ОСВ |
| stored\_file | period\_year | Год, за который загружена ОСВ |
| stored\_file | period\_quarter | Квартал, за который загружена ОСВ |
| osv\_entry | id | Идентификатор строки ОСВ | SELECT id, stored\_file\_id, recognition\_job\_id, legal\_entity\_id, counterparty\_id, group\_schema\_id, account\_id, account\_code, data\_type, closing\_debit, closing\_credit FROM osv\_entry WHERE legal\_entity\_id = legal\_entity\_id\* AND counterparty\_id = legal\_entity\_id\*; |
| osv\_entry | stored\_file\_id | Идентификатор исходного файла ОСВ, из которого получена строка |
| osv\_entry | recognition\_job\_id | Идентификатор распознавания, в рамках которого сформирована строка ОСВ |
| osv\_entry | legal\_entity\_id | Организация-владелец ОСВ. Определяет компанию, данные которой используются при расчете |
| osv\_entry | counterparty\_id | Сопоставленный контрагент строки ОСВ. Учитываются только контрагенты, входящие в текущий периметр консолидации |
| osv\_entry | group\_schema\_id | Тип строки ОСВ. Для расчета шахматки используются только строки **COUNTERPARTY** |
| osv\_entry | account\_id | Идентификатор счета строки ОСВ |
| osv\_entry | account\_code | Код счета в исходной строке ОСВ |
| osv\_entry | data\_type | Тип данных строки ОСВ. Для шахматки используются BU и SUM. CURRENCY и QUANTITY в денежный расчет не включаются. |
| osv\_entry | closing\_debit | Конечное дебетовое сальдо строки ОСВ. Используется для дебетовой стороны шахматки |
| osv\_entry | closing\_credit | Конечное кредитовое сальдо строки ОСВ |
| chart\_of\_account | id | Идентификатор счета плана счетов | SELECT id, code, name, kind FROM chart\_of\_account WHERE id = account\_id\* AND row\_type IN ('row', 'subaccount'); |
| chart\_of\_account | code | Нормализованный код счета или субсчета. Используется для определения счетов, участвующих в расчете шахматки и результирующей таблицы |
| chart\_of\_account | name | Наименование счета или субсчета |
| chart\_of\_account | kind | Тип счета. A и AP используются для дебетовой стороны, P и AP для кредитовой стороны |
Алгоритм расчета:
1. Выбор счетов для формирования
Для построения матрицы используется заданный набор дебетовых и кредитовых счетов из **chart\_of\_account**. В расчетный запрос передаются идентификаторы счетов двумя параметрами: **chart\_of\_account.kind in (A, AP)** для расчета **closing\_debit** стороны А и **chart\_of\_account.kind in (P, AP)** для расчета **closing\_credit** стороны Б.
```
SELECT
id,
code
FROM chart_of_account
WHERE kind in (A, AP) or kind in (P, AP) -- зависит от выбранной стороны, дебетовой и кредитовой ;
```
2. Версия и периметр
Расчет шахматки выполняется для выбранной **consolidation\_version**. Из **consolidation\_member** выбираются все юридические лица, входящие в данную версию консолидации. Полученный список используется одновременно для формирования строк и столбцов матрицы. Для расчета создаются все возможные пары компаний внутри периметра, кроме пар, где компания совпадает сама с собой.
3. Отбор строк ОСВ
1. Для расчета шахматки необходимо сформировать набор строк ОСВ для организаций, входящих в выбранную версию консолидации.
2. По **consolidation\_version\_id** определяется связанная запись **consolidation** и отчетный период **year** и **quarter**.
3. Из **stored\_file** выбираются файлы с **document\_type = 'ОСВ'**, у которых **period\_year** и **period\_quarter** соответствуют периоду текущей консолидации.
4. Для каждого выбранного файла используются только строки **osv\_entry**, относящиеся к актуальному прогону распознавания. Актуальным считается прогон, идентификатор которого указан в **stored\_file.current\_recognition\_job\_id**. Строки предыдущих прогонов распознавания в расчет не включаются.
5. Компания, которой принадлежит строка ОСВ, определяется по **osv\_entry.legal\_entity\_id**. В расчет включаются только строки компаний, присутствующих в **consolidation\_member** выбранной **consolidation\_version**.
6. Контрагент строки определяется по **osv\_entry.counterparty\_id**. Строка участвует в шахматке только если **counterparty\_id** заполнен и организация также входит в **consolidation\_member** текущей версии консолидации.
7. Строки, в которых **legal\_entity\_id = counterparty\_id**, исключаются из расчета, поскольку взаимные расчеты компании с самой собой в шахматке не отображаются.
8. Для каждой строки должен быть определен **osv\_entry.account\_id**. По нему выполняется соединение с **chart\_of\_account**. Строки без определенного **account\_id** в расчет шахматки не включаются.
9. Для каждой строки по **osv\_entry.group\_schema\_id** определяется связанная запись **osv\_group\_schema**. В расчет шахматки включаются только строки, для которых **osv\_group\_schema.group\_type = 'COUNTERPARTY'**.
10. Для денежных расчетов учитывается тип данных строки **osv\_entry.data\_type**. В расчет включаются строки со значениями **BU** и **SUM.**
4. Расчет стороны А
Сторона А показывает, какую сумму компания А отражает по выбранным дебетовым счетам в отношении компании Б. Если по одной и той же паре компаний и одному счету в ОСВ присутствует несколько строк, их значения необходимо сложить. Если подходящих строк нет, значение стороны А принимается равным 0.
* Для каждой пары компаний система берет строки **osv\_entry**, где **legal\_entity\_id** соответствует компании А, а **counterparty\_id** соответствует компании Б.
* Из отобранных строк учитываются только счета, входящие в выбранный набор дебетовых счетов (A, AP) для текущего представления шахматки.
* По всем подходящим строкам суммируется значение **closing\_debit**.
```
SELECT
SUM(oe.closing_debit)
FROM osv_entry oe
JOIN chart_of_account coa
ON coa.id = oe.account_id
JOIN osv_group_schema ogs
ON ogs.id = oe.group_schema_id
WHERE oe.legal_entity_id = company_a*
AND oe.counterparty_id = company_b*
AND coa.kind in ('A', 'AP')
AND ogs.group_type = 'COUNTERPARTY'
AND oe.data_type IN ('BU', 'SUM');
```
5. Расчет стороны Б
Сторона Б показывает, какую сумму компания Б отражает по выбранным кредитовым счетам в отношении компании А. Если по одной и той же паре компаний и одному счету в ОСВ присутствует несколько строк, их значения необходимо сложить. Если подходящих строк нет, значение стороны Б принимается равным 0.
+ Для каждой пары компаний система берет строки **osv\_entry**, где **legal\_entity\_id** соответствует компании Б, а **counterparty\_id** соответствует компании А.
+ Из отобранных строк учитываются только счета, входящие в выбранный набор кредитовых счетов (P, AP) для текущего представления шахматки.
+ По всем подходящим строкам суммируется значение **closing\_credit**.
```
SELECT
SUM(oe.closing_credit)
FROM osv_entry oe
JOIN chart_of_account coa
ON coa.id = oe.account_id
JOIN osv_grouping_schema ogs
ON ogs.id = oe.grouping_schema_id
WHERE oe.legal_entity_id = company_b*
AND oe.counterparty_id = company_a*
AND coa.kind in ('P', 'AP')
AND ogs.group_type = 'COUNTERPARTY'
AND oe.data_type IN ('BU', 'SUM');
```
6. Расчет расхождений
После того как для каждой пары компаний рассчитаны значения стороны А и стороны Б, система сравнивает эти суммы между собой. Рассчитывается абсолютное расхождение между двумя суммами. Для этого из суммы стороны А вычитается сумма стороны Б, после чего берется абсолютное значение результата. Таким образом, расхождение всегда отображается положительным числом независимо от того, у какой компании сумма больше. Процент определяется по меньшей из двух сравниваемых сумм. Для расчета абсолютное расхождение делится на меньшее из значений **amount\_a** и **amount\_b**, после чего результат умножается на 100.
```
amount_a = 5000
amount_b = 6000
variance_amount = 1000
variance_percent = variance_amount / min(amount_a, amount_b) * 100
```
# Результирующая таблица
Результирующая таблица - сводка внутригрупповых оборотов (ВГО) по группе, разложенная на балансовые статьи. Показывает, сколько каждая компания периметра держит в ВГО по каждой статье и сколько это суммарно по группе. В отличие от шахматки , результирующая таблица показывает компанию против группы - суммарную позицию компании по всем внутригрупповым контрагентам.
Пример:
| Статья | Русский Бисквит | Пекарня | Организация 3 | Организация 4 | Итого по группе |
| --- | --- | --- | --- | --- | --- |
| Дебиторская задолженность | 695 980 | 101 043 | 15 822 | 38 365 | 851 210 |
| Кредиторская задолженность | 35 066 | 239 861 | 19 231 | 207 040 | 501 198 |
| Фин вложения | - | - | 226 218 | 9 000 | 235 218 |
| Долгосрочные кредиты и займы | | | | | - |
| Краткосрочные кредиты и займы | - | 125 739 | 159 018 | 97 403 | 382 160 |
Оси результирующей таблицы:
* Строка - статья ВГО (дебиторская задолженность, кредиторская задолженность, финансовые вложения, долгосрочные кредиты и займы, краткосрочные кредиты и займы);
* Столбец - компания периметра;
* Ячейка - сумма ВГО у компании по счетам статьи в разрезе всех остальных компаний периметра.
Счета компании:
| Статья | Сторона | Расчетное поле | Счета компании |
| --- | --- | --- | --- |
| Дебиторская задолженность | A, AP | closing\_debit | Д60.02, 60.22, 60.32, 62.01, 62.03, 62.21, 62.31, 76 (кроме 76.7.5, 76.7.9), Д76 |
| Кредиторская задолженность | P, AP | closing\_credit | К60.01, 60.03, 60.21, 60.31, 62.02, 62.22, 62.32, 76 (кроме 76.7.1) |
| Фин вложения | A, AP | closing\_debit | Д58.01, Д58.03 |
| Долгосрочные кредиты и займы | P, AP | closing\_credit | К67, К67.03 |
| Краткосрочные кредиты и займы | P, AP | closing\_credit | К66, К66.03, К66.04 |
Алгоритм расчета:
1. Отбор строк компании за квартал
Для каждой компании, входящей в **consolidation\_member** выбранной **consolidation\_version**, отбираются строки **osv\_entry**, в которых учитываются следующие правила:
* **osv\_entry.legal\_entity\_id** соответствует рассчитываемой компании;
* **osv\_entry.counterparty\_id** заполнен;
* **osv\_entry.counterparty\_id** входит в **consolidation\_member** той же версии консолидации;
* **osv\_entry.legal\_entity\_id** != **osv\_entry.counterparty\_id**;
* **osv\_entry.account\_id** заполнен.
* **osv\_entry.group\_schema\_id** должен ссылаться на **osv\_group\_schema** с **group\_type = 'COUNTERPARTY'.**
* **osv\_entry.data\_type** IN ('BU', 'SUM').
2. Присоединение плана счетов
Для каждой отобранной строки по **osv\_entry.account\_id** определяется соответствующая запись **chart\_of\_account**. Из **chart\_of\_account** используется **code** (для определения счета или субсчета).
3. Выборка стороны и суммирование
Для каждой статьи заранее определяется сторона расчета. Для статей со стороной A, AP используется **osv\_entry.closing\_debit**. Для статей со стороной P, AP используется **osv\_entry.closing\_credit**. После определения статьи и стороны все подходящие строки одной компании суммируются. В результате для каждой компании и каждой статьи должно быть получено одно итоговое значение.
```
SELECT
SUM(
CASE
WHEN coa.kind IN ('A', 'AP')
THEN oe.closing_debit
WHEN coa.kind IN ('P', 'AP')
THEN oe.closing_credit
END)
FROM osv_entry oe
JOIN chart_of_account coa
ON coa.id = oe.account_id
```
4. Расчет итога по группе
Для каждой статьи дополнительно может рассчитываться колонка "Итого по группе". Значение определяется как: **SUM(article\_amount)** по всем компаниям, входящим в текущий **consolidation\_member**.