Модель финансовой истины

Единый источник истины о том, что означает каждый финансовый показатель в TSync Intelligence. Каждая метрика, которую слой Intelligence предоставляет через tsync_finance(), имеет здесь ровно одно определение, чтобы все продвинутые модули (Динамическая оценка, Валютная экспозиция, KPI) считали на одной основе, а результаты были воспроизводимы и проверяемы.

Область. Этот документ определяет методологию. Фаза 1 поставляет базовые определения ниже (реализованы в Tsync_finance_service). Пункты с пометкой [Фаза 2] формально определены здесь, но их полный расчёт отложен.


0. Соглашения

  • Базовая валютаtsync_fx()->base() (учётная база, напр. RON), из опции tsync_acc_base_currency. Все агрегаты выражаются в базе.
  • Учётный курсtsync_fx()->rate(CUR, date): курс CUR→база на дату, из Tsync_currency. Правило даты курса: Румыния использует курс BNR за предыдущий рабочий день; Молдова — курс того же дня. Базовая валюта по определению имеет курс 1.0.
  • Пересчёт — всегда через базу: convert(amount, from, to) = amount × rate(from) ÷ rate(to).
  • Округление — денежные агрегаты округляются до 2 знаков; удельные затраты и значения позиций в снимках хранят внутри 4 знака.
  • Версионирование — каждая строка метрики несёт calc_version + calculated_at (увеличиваются при каждом пересчёте), так что устаревшее значение можно обнаружить. Изменение определения здесь — это рост версии методологии (см. §8).

1. Оценка запасов

$$\text{InventoryValue} = \sum_{\text{stock rows}} (,qty \times avg_cost,)$$

  • Источник: tsync_stock — каноническая колонка остатка qty (никогда не qty_on_hand), удельная себестоимость avg_cost.
  • Метод себестоимости: AVCO (скользящее средневзвешенное) — avg_cost поддерживается путём складских проводок при каждом приёме.
  • tsync_finance()->getInventoryValue(). Уже в базе (запасы оцениваются в базе).

2. Дебиторская задолженность

$$\text{Receivables} = \sum_{\text{open customer invoices}} (,total - \text{payments},)$$

  • Открытые = статус счёта ∈ { unpaid (1), partially_paid (3), overdue (4) }. Оплаченные (2) и отменённые (5) исключаются.
  • total — брутто-сумма счёта; payments — сумма зафиксированных по нему оплат.
  • tsync_finance()->getReceivables(). Счета не в базе: см. §6.

3. Кредиторская задолженность

$$\text{Payables} = \sum_{\text{open supplier invoices}} (,total - \text{payments},)$$

  • Открытые = статус счёта поставщика не из { оплачен, отменён }.
  • tsync_finance()->getPayables().

4. Денежный остаток (прокси операционных денег)

$$\text{Cash} = \sum \text{customer payments} - \sum \text{supplier payments} - \sum \text{expenses}$$

  • Прокси на основе движений, а не сверенный банковский остаток. Настоящая банковская сверка / закрытие периода — [Фаза 2].
  • tsync_finance()->getCashBalance().

5. Валютная экспозиция

$$\text{Exposure} = \sum_{\substack{\text{open receivables}\ \text{cur} \neq \text{base}}} \text{baseValue(open amount)}$$

  • Значение в базовой валюте открытой дебиторки не в базовой валюте — сумма под риском валютных колебаний. tsync_finance()->getCurrencyExposure().
  • Базовый показатель: измеряет экспозицию, а не реализованную/нереализованную прибыль/убыток.

6. Методология валютной прибыли / убытка [расчёт Фазы 2]

Формально: для позиции в иностранной валюте, учтённой по курсу $r_0$ на дату $d_0$ и оценённой/расчётной по курсу $r_1$ на дату $d_1$,

$$\text{FX gain/loss} = \text{amount}_{\text{cur}} \times (r_1 - r_0)$$

  • Нереализованная (открытые позиции): $r_1$ = курс на отчётную дату.
  • Реализованная (при расчёте): $r_1$ = курс на дату расчёта.
  • Правило: доходы/расходы и активы/обязательства учитываются по историческому курсу ($r_0$) при признании; переоценка использует текущий курс ($r_1$); разница — это валютная прибыль/убыток. Фаза 1 фиксирует экспозицию (§5) и курсы (§0); проведённая строка прибыли/убытка — это Фаза 2.

7. Операционная прибыль

База Фазы 1tsync_finance()->getOperationalProfit($days):

$$\text{OpProfit}{\text{baseline}} = \text{revenue}{\text{window}} - \text{expenses}_{\text{window}}$$

[Фаза 2] истинная операционная прибыль — формально:

$$\text{OpProfit} = \text{revenue} - \text{COGS} - \text{operating expenses} \pm \text{FX gain/loss} - \text{accruals/deferrals}$$

где COGS берётся из AVCO в момент продажи (не себестоимость на конец периода), валютная прибыль/убыток по §6, начисления/отложения по дате признания. Операционные затраты = COGS + операционные расходы (без финансирования и налогов). База намеренно опускает COGS, валютную прибыль/убыток и начисления — не считайте её аудированной прибылью.

8. Версионирование методологии и воспроизводимость

  • Каждая метрика хранит calc_version (счётчик пересчётов данных) и создаётся под версией методологии (версией этого документа). Изменение любой формулы здесь увеличивает версию методологии; снимки фиксируют действующую методологию, чтобы историческое значение всегда можно было воспроизвести из тех же входных данных.
  • Контракт воспроизводимости: один и тот же набор данных + та же версия методологии должны давать одни и те же числа (основа режима аудита/исследования).

9. Дорожная карта Фазы 2 (пока не обязательна)

Операционная прибыль на основе COGS, проведённая валютная прибыль/убыток, банковская сверка / закрытие периода, начисления/отложения, консолидация по нескольким компаниям и сценарии переоценки по историческому курсу против текущего.


Реализовано в application/libraries/Tsync_finance_service.php (база) и Tsync_fx_service.php (курсы). Проверяется tests/sim/intelligence_finance_snapshot_sim.php и tests/fx_service_test.php.