22 KiB
code, title
| code | title |
|---|---|
| DOC-221277 | "Шахматка" |
"Шахматка"
Шахматка - визуальный инструмент выявления расхождений во взаимных расчетах между компаниями периметра по данным ОСВ. Работает только с оборотно-сальдовыми ведомостями (ОСВ). Сама шахматка ничего не исключает и не меняет данные; правки и исключение выполняются дальше - в таблице корректировок.
Пример шахматки:
| ДБ / КТ | Русский Бисквит | Пекарня | Организация 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 для кредитовой стороны |
Алгоритм расчета:
- Выбор счетов для формирования
Для построения матрицы используется заданный набор дебетовых и кредитовых счетов из 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) -- зависит от выбранной стороны, дебетовой и кредитовой ;
- Версия и периметр
Расчет шахматки выполняется для выбранной consolidation_version. Из consolidation_member выбираются все юридические лица, входящие в данную версию консолидации. Полученный список используется одновременно для формирования строк и столбцов матрицы. Для расчета создаются все возможные пары компаний внутри периметра, кроме пар, где компания совпадает сама с собой.
-
Отбор строк ОСВ
-
Для расчета шахматки необходимо сформировать набор строк ОСВ для организаций, входящих в выбранную версию консолидации.
-
По consolidation_version_id определяется связанная запись consolidation и отчетный период year и quarter.
-
Из stored_file выбираются файлы с document_type = 'ОСВ', у которых period_year и period_quarter соответствуют периоду текущей консолидации.
-
Для каждого выбранного файла используются только строки osv_entry, относящиеся к актуальному прогону распознавания. Актуальным считается прогон, идентификатор которого указан в stored_file.current_recognition_job_id. Строки предыдущих прогонов распознавания в расчет не включаются.
-
Компания, которой принадлежит строка ОСВ, определяется по osv_entry.legal_entity_id. В расчет включаются только строки компаний, присутствующих в consolidation_member выбранной consolidation_version.
-
Контрагент строки определяется по osv_entry.counterparty_id. Строка участвует в шахматке только если counterparty_id заполнен и организация также входит в consolidation_member текущей версии консолидации.
-
Строки, в которых legal_entity_id = counterparty_id, исключаются из расчета, поскольку взаимные расчеты компании с самой собой в шахматке не отображаются.
-
Для каждой строки должен быть определен osv_entry.account_id. По нему выполняется соединение с chart_of_account. Строки без определенного account_id в расчет шахматки не включаются.
-
Для каждой строки по osv_entry.group_schema_id определяется связанная запись osv_group_schema. В расчет шахматки включаются только строки, для которых osv_group_schema.group_type = 'COUNTERPARTY'.
-
Для денежных расчетов учитывается тип данных строки osv_entry.data_type. В расчет включаются строки со значениями BU и SUM.
-
Расчет стороны А
Сторона А показывает, какую сумму компания А отражает по выбранным дебетовым счетам в отношении компании Б. Если по одной и той же паре компаний и одному счету в ОСВ присутствует несколько строк, их значения необходимо сложить. Если подходящих строк нет, значение стороны А принимается равным 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');
- Расчет стороны Б
Сторона Б показывает, какую сумму компания Б отражает по выбранным кредитовым счетам в отношении компании А. Если по одной и той же паре компаний и одному счету в ОСВ присутствует несколько строк, их значения необходимо сложить. Если подходящих строк нет, значение стороны Б принимается равным 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');
- Расчет расхождений
После того как для каждой пары компаний рассчитаны значения стороны А и стороны Б, система сравнивает эти суммы между собой. Рассчитывается абсолютное расхождение между двумя суммами. Для этого из суммы стороны А вычитается сумма стороны Б, после чего берется абсолютное значение результата. Таким образом, расхождение всегда отображается положительным числом независимо от того, у какой компании сумма больше. Процент определяется по меньшей из двух сравниваемых сумм. Для расчета абсолютное расхождение делится на меньшее из значений 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 |
Алгоритм расчета:
- Отбор строк компании за квартал
Для каждой компании, входящей в 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').
- Присоединение плана счетов
Для каждой отобранной строки по osv_entry.account_id определяется соответствующая запись chart_of_account. Из chart_of_account используется code (для определения счета или субсчета).
- Выборка стороны и суммирование
Для каждой статьи заранее определяется сторона расчета. Для статей со стороной 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
- Расчет итога по группе
Для каждой статьи дополнительно может рассчитываться колонка "Итого по группе". Значение определяется как: SUM(article_amount) по всем компаниям, входящим в текущий consolidation_member.