fix(subscription): корректная цена за месяц при выборе периода

Для периодов короче месяца в карточке периода под ценой выводилась
та же сумма с подписью «/мес»: цена за 7 дней показывалась как цена
за месяц. Причина — деление на max(1, days / 30), которое для коротких
периодов даёт делитель 1.

Расчёт вынесен в getMonthlyPriceKopeks: месячная ставка считается
пропорцией (price * 30 / days) и не показывается для периодов в месяц
и короче, где она либо дублирует цену, либо вводит в заблуждение.
Тот же хелпер применён на экране продления, где месячная цена для
периодов вроде 45 дней считалась делением на округлённое число
месяцев.
This commit is contained in:
kewldan
2026-07-28 21:23:08 +03:00
parent 51d0f0431a
commit 888a02f397
4 changed files with 51 additions and 10 deletions

15
src/utils/pricing.ts Normal file
View File

@@ -0,0 +1,15 @@
/** Длина «месяца» в днях — тот же множитель, что использует бэкенд при расчёте цены за месяц. */
const DAYS_IN_MONTH = 30;
/**
* Цена за месяц (в копейках) для периода длиной `days` дней.
*
* Возвращает `null`, когда месячная ставка не имеет смысла: для периода
* в месяц и короче она либо повторяет цену периода (30 дней), либо
* выдаёт цену периода за месячную (7 дней → цена семи дней «за месяц»).
*/
export function getMonthlyPriceKopeks(priceKopeks: number, days: number): number | null {
if (!Number.isFinite(priceKopeks) || !Number.isFinite(days)) return null;
if (days <= DAYS_IN_MONTH) return null;
return Math.round((priceKopeks * DAYS_IN_MONTH) / days);
}