fix(currency): глобальная конвертация и effectiveVpsTariffCurrency для BM
- baseCurrency хостера не подставлять при пустой валюте VPS, если есть API (дефолт RUB) - Подстановка валюты хостера только для провайдеров без API - RUR → RUB для курсов ЦБ; проверка курсов через Number.isFinite Made-with: Cursor
This commit is contained in:
+13
-8
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user