234 lines
22 KiB
Markdown
234 lines
22 KiB
Markdown
---
|
||
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**.
|