fix(currency): глобальная конвертация и effectiveVpsTariffCurrency для BM

- baseCurrency хостера не подставлять при пустой валюте VPS, если есть API (дефолт RUB)
- Подстановка валюты хостера только для провайдеров без API
- RUR → RUB для курсов ЦБ; проверка курсов через Number.isFinite

Made-with: Cursor
This commit is contained in:
Denozordec
2026-03-23 21:17:19 +07:00
parent f4517f03fc
commit a4752d4379
+13 -8
View File
@@ -167,13 +167,16 @@ function toIsoCurrency(currency) {
if (!currency || typeof currency !== 'string') return 'USD' if (!currency || typeof currency !== 'string') return 'USD'
const trimmed = currency.trim() const trimmed = currency.trim()
if (CURRENCY_SYMBOL_MAP[trimmed]) return CURRENCY_SYMBOL_MAP[trimmed] if (CURRENCY_SYMBOL_MAP[trimmed]) return CURRENCY_SYMBOL_MAP[trimmed]
if (trimmed.length === 3 && /^[A-Z]{3}$/i.test(trimmed)) return trimmed.toUpperCase() const upper = trimmed.toUpperCase()
if (upper === 'RUR') return 'RUB'
if (trimmed.length === 3 && /^[A-Z]{3}$/i.test(trimmed)) return upper
return 'USD' return 'USD'
} }
/** /**
* Валюта суммы тарифа VPS: поле vps.currency, иначе валюта приёма платежей хостера (справочник). * Валюта суммы тарифа VPS: поле vps.currency, иначе (только у хостеров без API) — валюта приёма из справочника.
* Для хостеров без API «USD» в записи VPS часто остаётся дефолтом формы — тогда берём валюту хостера. * Для BILLmanager нельзя подставлять baseCurrency хостера при пустом поле: тариф в валюте из API (часто RUB).
* У ручных хостеров «USD» в VPS часто дефолт формы — тогда берём валюту хостера.
*/ */
export function effectiveVpsTariffCurrency(vps, provider) { export function effectiveVpsTariffCurrency(vps, provider) {
const ownRaw = (vps?.currency || '').trim() const ownRaw = (vps?.currency || '').trim()
@@ -185,8 +188,8 @@ export function effectiveVpsTariffCurrency(vps, provider) {
return provIso return provIso
} }
if (ownIso) return ownIso if (ownIso) return ownIso
if (provIso) return provIso if (provIso && noApi) return provIso
return 'USD' return noApi ? 'USD' : 'RUB'
} }
/** /**
@@ -229,12 +232,14 @@ export function convertCurrency(amount, fromCurrency, toCurrency, ratesData) {
const apiBase = ratesData.base.toUpperCase() const apiBase = ratesData.base.toUpperCase()
const rates = { ...ratesData.rates, [apiBase]: 1 } const rates = { ...ratesData.rates, [apiBase]: 1 }
if (!rates[from] || !rates[to]) { const rateFrom = rates[from]
const rateTo = rates[to]
if (!Number.isFinite(rateFrom) || rateFrom <= 0 || !Number.isFinite(rateTo) || rateTo <= 0) {
return safeAmount return safeAmount
} }
const amountInApiBase = safeAmount / rates[from] const amountInApiBase = safeAmount / rateFrom
return amountInApiBase * rates[to] return amountInApiBase * rateTo
} }
/** /**