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

22 KiB
Raw Blame History

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 для кредитовой стороны

Алгоритм расчета:

  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) -- зависит от выбранной стороны, дебетовой и кредитовой ;
  1. Версия и периметр

Расчет шахматки выполняется для выбранной consolidation_version. Из consolidation_member выбираются все юридические лица, входящие в данную версию консолидации. Полученный список используется одновременно для формирования строк и столбцов матрицы. Для расчета создаются все возможные пары компаний внутри периметра, кроме пар, где компания совпадает сама с собой.

  1. Отбор строк ОСВ

  2. Для расчета шахматки необходимо сформировать набор строк ОСВ для организаций, входящих в выбранную версию консолидации.

  3. По consolidation_version_id определяется связанная запись consolidation и отчетный период year и quarter.

  4. Из stored_file выбираются файлы с document_type = 'ОСВ', у которых period_year и period_quarter соответствуют периоду текущей консолидации.

  5. Для каждого выбранного файла используются только строки osv_entry, относящиеся к актуальному прогону распознавания. Актуальным считается прогон, идентификатор которого указан в stored_file.current_recognition_job_id. Строки предыдущих прогонов распознавания в расчет не включаются.

  6. Компания, которой принадлежит строка ОСВ, определяется по osv_entry.legal_entity_id. В расчет включаются только строки компаний, присутствующих в consolidation_member выбранной consolidation_version.

  7. Контрагент строки определяется по osv_entry.counterparty_id. Строка участвует в шахматке только если counterparty_id заполнен и организация также входит в consolidation_member текущей версии консолидации.

  8. Строки, в которых legal_entity_id = counterparty_id, исключаются из расчета, поскольку взаимные расчеты компании с самой собой в шахматке не отображаются.

  9. Для каждой строки должен быть определен osv_entry.account_id. По нему выполняется соединение с chart_of_account. Строки без определенного account_id в расчет шахматки не включаются.

  10. Для каждой строки по osv_entry.group_schema_id определяется связанная запись osv_group_schema. В расчет шахматки включаются только строки, для которых osv_group_schema.group_type = 'COUNTERPARTY'.

  11. Для денежных расчетов учитывается тип данных строки osv_entry.data_type. В расчет включаются строки со значениями BU и SUM.

  12. Расчет стороны А

Сторона А показывает, какую сумму компания А отражает по выбранным дебетовым счетам в отношении компании Б. Если по одной и той же паре компаний и одному счету в ОСВ присутствует несколько строк, их значения необходимо сложить. Если подходящих строк нет, значение стороны А принимается равным 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');
  1. Расчет стороны Б

Сторона Б показывает, какую сумму компания Б отражает по выбранным кредитовым счетам в отношении компании А. Если по одной и той же паре компаний и одному счету в ОСВ присутствует несколько строк, их значения необходимо сложить. Если подходящих строк нет, значение стороны Б принимается равным 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');
  1. Расчет расхождений

После того как для каждой пары компаний рассчитаны значения стороны А и стороны Б, система сравнивает эти суммы между собой. Рассчитывается абсолютное расхождение между двумя суммами. Для этого из суммы стороны А вычитается сумма стороны Б, после чего берется абсолютное значение результата. Таким образом, расхождение всегда отображается положительным числом независимо от того, у какой компании сумма больше. Процент определяется по меньшей из двух сравниваемых сумм. Для расчета абсолютное расхождение делится на меньшее из значений 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').
  1. Присоединение плана счетов

Для каждой отобранной строки по osv_entry.account_id определяется соответствующая запись chart_of_account. Из chart_of_account используется code (для определения счета или субсчета).

  1. Выборка стороны и суммирование

Для каждой статьи заранее определяется сторона расчета. Для статей со стороной 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
  1. Расчет итога по группе

Для каждой статьи дополнительно может рассчитываться колонка "Итого по группе". Значение определяется как: SUM(article_amount) по всем компаниям, входящим в текущий consolidation_member.