feat(lava): автопродление Lava на странице подписки

Парная фронтовая часть к эндпоинтам /cabinet/subscription/lava-recurrent
(бот: 0dea2182). Блок — сиблинг Platega-блока с той же семантикой состояний
(off/pending/active/past_due), поллинг раз в 8с пока привязка PENDING.

Отличие от Platega в подписи: у Lava период задан продуктом в кабинете
провайдера и приезжает числом дней, поэтому канонические значения (30/90/365
и т.д.) показываются словами, а произвольные — как «раз в N дн.».

utils/lavaRecurring.ts: строгое распознавание 403 'Lava recurrent disabled'
(другие 403-guard'ы прятать нельзя), деградация неизвестного статуса в off.
Локали ru/en/zh/fa (+25 строк каждая, плейсхолдеры сверены). 7 тестов утилиты.
This commit is contained in:
Fringg
2026-07-29 16:34:43 +03:00
parent 62aaa5d7c9
commit 2dce539da2
9 changed files with 474 additions and 0 deletions

View File

@@ -701,6 +701,31 @@
"purchaseButton": "⚡ Subscribe with SBP auto-payment",
"purchaseHint": "First charge confirms the binding in your bank app; renewals are charged automatically per the tariff cadence."
},
"lavaRecurring": {
"title": "Lava auto-renewal",
"connect": "Connect",
"payFirst": "Pay the first invoice",
"cancel": "Disable",
"confirmCancel": "Disable Lava auto-renewal? The subscription will no longer renew automatically.",
"cancelled": "Lava auto-renewal disabled",
"enableError": "Could not enable Lava auto-renewal",
"cancelError": "Could not disable Lava auto-renewal",
"statusPending": "Waiting for the first invoice to be paid",
"statusActive": "Active",
"statusPastDue": "Payment failed — please try again",
"nextCharge": "next charge on {{date}}",
"amountPerPeriod": "{{amount}} ₽ {{period}}",
"amountPerDays": "{{amount}} ₽ every {{days}} days",
"period": {
"day": "daily",
"week": "weekly",
"month": "monthly",
"quarter": "quarterly",
"halfYear": "every six months",
"year": "yearly"
},
"autopayHint": "The subscription will renew automatically via Lava"
},
"backToList": "Back to subscriptions",
"confirmDelete": "Delete subscription?",
"dailyAutoCharge": "Daily auto-charge",

View File

@@ -600,6 +600,31 @@
"purchaseButton": "⚡ اشتراک با پرداخت خودکار SBP",
"purchaseHint": "اولین برداشت، اتصال را در اپ بانک تأیید می‌کند؛ تمدیدها به‌صورت خودکار برداشت می‌شوند."
},
"lavaRecurring": {
"title": "تمدید خودکار Lava",
"connect": "اتصال",
"payFirst": "پرداخت صورتحساب اول",
"cancel": "غیرفعال‌سازی",
"confirmCancel": "تمدید خودکار Lava غیرفعال شود؟ اشتراک دیگر به‌طور خودکار تمدید نمی‌شود.",
"cancelled": "تمدید خودکار Lava غیرفعال شد",
"enableError": "فعال‌سازی تمدید خودکار Lava ناموفق بود",
"cancelError": "غیرفعال‌سازی تمدید خودکار Lava ناموفق بود",
"statusPending": "در انتظار پرداخت صورتحساب اول",
"statusActive": "فعال",
"statusPastDue": "پرداخت ناموفق بود — دوباره تلاش کنید",
"nextCharge": "برداشت بعدی {{date}}",
"amountPerPeriod": "{{amount}} ₽ {{period}}",
"amountPerDays": "هر {{days}} روز {{amount}} ₽",
"period": {
"day": "روزانه",
"week": "هفتگی",
"month": "ماهانه",
"quarter": "هر سه ماه",
"halfYear": "هر شش ماه",
"year": "سالانه"
},
"autopayHint": "اشتراک به‌طور خودکار از طریق Lava تمدید می‌شود"
},
"backToList": "بازگشت به فهرست اشتراک‌ها",
"confirmDelete": "اشتراک حذف شود؟",
"cta": {

View File

@@ -720,6 +720,31 @@
"purchaseButton": "⚡ Оформить с автооплатой СБП",
"purchaseHint": "Первое списание подтверждает привязку в банке; продления списываются автоматически по каденсу тарифа."
},
"lavaRecurring": {
"title": "Автопродление Lava",
"connect": "Подключить",
"payFirst": "Оплатить первый счёт",
"cancel": "Отключить",
"confirmCancel": "Отключить автопродление Lava? Подписка больше не будет продлеваться автоматически.",
"cancelled": "Автопродление Lava отключено",
"enableError": "Не удалось подключить автопродление Lava",
"cancelError": "Не удалось отменить автопродление Lava",
"statusPending": "Ожидает оплаты первого счёта",
"statusActive": "Активно",
"statusPastDue": "Платёж не прошёл — попробуйте снова",
"nextCharge": "следующее списание {{date}}",
"amountPerPeriod": "{{amount}} ₽ {{period}}",
"amountPerDays": "{{amount}} ₽ раз в {{days}} дн.",
"period": {
"day": "ежедневно",
"week": "еженедельно",
"month": "ежемесячно",
"quarter": "раз в квартал",
"halfYear": "раз в полгода",
"year": "ежегодно"
},
"autopayHint": "Подписка будет автоматически продлеваться через Lava"
},
"backToList": "К списку подписок",
"confirmDelete": "Удалить подписку?",
"dailyAutoCharge": "Ежедневное списание",

View File

@@ -600,6 +600,31 @@
"purchaseButton": "⚡ 通过SBP自动扣款订阅",
"purchaseHint": "首次扣款即在银行应用中确认绑定;续费将按资费周期自动扣款。"
},
"lavaRecurring": {
"title": "Lava 自动续订",
"connect": "连接",
"payFirst": "支付首期账单",
"cancel": "关闭",
"confirmCancel": "要关闭 Lava 自动续订吗?订阅将不再自动续订。",
"cancelled": "已关闭 Lava 自动续订",
"enableError": "无法开启 Lava 自动续订",
"cancelError": "无法关闭 Lava 自动续订",
"statusPending": "等待支付首期账单",
"statusActive": "已启用",
"statusPastDue": "扣款失败 — 请重试",
"nextCharge": "下次扣款 {{date}}",
"amountPerPeriod": "{{amount}} ₽ {{period}}",
"amountPerDays": "每 {{days}} 天 {{amount}} ₽",
"period": {
"day": "每天",
"week": "每周",
"month": "每月",
"quarter": "每季度",
"halfYear": "每半年",
"year": "每年"
},
"autopayHint": "订阅将通过 Lava 自动续订"
},
"backToList": "返回订阅列表",
"confirmDelete": "删除订阅?",
"cta": {