Приоритет курсов конвертации

Когда inCash приводит сумму операции к базовой валюте — он выбирает курс из трёх источников по строгой иерархии.

Три источника курса

| Приоритет | Источник | Где задаётся | |---|---|---| | 1 (высший) | Курс операции | В модалке создания операции, поле «Курс» | | 2 | Фиксированный курс компании | Настройки → Компания → Фиксированные курсы | | 3 (fallback) | Рыночный курс | Автоматически через open.er-api.com, кеш 1 час |

inCash идёт по списку сверху вниз: если курс операции задан — используется он; если нет — берётся фиксированный; если нет и его — рыночный; если и его нет (например, для USDT) — операция сохранится без конверсии и не попадёт корректно в отчёты.

Почему такой порядок

  • Курс операции — самый точный. Это реальный курс, по которому прошла транзакция (например, конкретный курс банка в момент покупки). Никто кроме вас точнее не знает.
  • Фиксированный курс компании — для стабильности учёта. Если компания договорилась всегда учитывать по 1 USD = 12 800 UZS — этот курс не зависит от ежедневного дрейфа рынка, и P&L получается «гладким». Часто требование бухучёта.
  • Рыночный курс — fallback. Удобен для прикидки, но в реальности не равен тому курсу, по которому прошла транзакция.

Семантика курса

Курс хранится в формате: 1 единица базовой валюты = N единиц валюты операции.

Пример: если базовая валюта компании — USD, операция в UZS, и курс в банке был 12 800 UZS за доллар, то exchangeRate = 12800.

Сумма в базовой валюте: amountInCompanyCurrency = amount / exchangeRate.

  • 12 800 UZS / 12 800 = 1 USD.
  • 6 400 000 UZS / 12 800 = 500 USD.

Что делать с USDT/USDC

Стейблкоины не отдаются open.er-api.com. Варианты:

  1. Ввести курс вручную в операции (предпочтительно, если курс реально менялся).
  2. Задать фиксированный курс 1.0 в Настройках → Компания, если вы учитываете USDT как эквивалент USD.

Без одного из двух операции в стейблкоинах пойдут в отчёты с курсом null — это видно в P&L как нулевые суммы.

Кеширование

Рыночные курсы кешируются на 1 час в памяти сервера. Это нужно чтобы при загрузке страницы с десятком отчётов не делать десять обращений к FX API.