module Billing module Stripe module PlanChangeMessages module_function def flash_notice(result, current_plan: nil) plan = Plan[result.plan_slug] interval_label = PriceCatalog.label(plan_slug: result.plan_slug, interval: result.interval) if result.upgrade? amount = format_amount(result.amount_cents, result.currency) if amount.present? "Upgrade a #{plan.name} (#{interval_label}) completato. Addebito immediato: #{amount}." else "Upgrade a #{plan.name} (#{interval_label}) completato. L'addebito della differenza è in elaborazione sulla carta salvata." end else when_label = result.effective_at.present? ? I18n.l(result.effective_at, format: :long) : "il prossimo rinnovo" current_name = current_plan&.name || "il piano attuale" "Passaggio a #{plan.name} (#{interval_label}) programmato: resti su #{current_name} fino al #{when_label}. " \ "Nessun addebito aggiuntivo ora; dal prossimo ciclo pagherai il nuovo prezzo." end end def button_label(plan:, interval:, kind:) price = PriceCatalog.label(plan_slug: plan.slug, interval: interval) if kind == :checkout "Attiva #{plan.name} — #{price}" else "Passa a #{plan.name} — #{price}" end end def billing_info_lines(subscription: nil) lines = [ "Upgrade (piano superiore o passaggio alla fatturazione annuale): la differenza viene addebitata subito sulla carta salvata in Stripe.", "Downgrade tra piani a pagamento (es. Full → Light): il nuovo piano è attivo dal prossimo rinnovo; fino ad allora restano le funzioni del piano attuale, senza addebito aggiuntivo ora." ] if subscription&.plan_change_pending? && subscription.pending_plan.present? when_at = subscription.current_period_end when_label = when_at.present? ? I18n.l(when_at, format: :long) : "il prossimo rinnovo" lines.unshift( "Hai già richiesto #{subscription.pending_plan.name} dal #{when_label}: fino ad allora resta attivo #{subscription.plan.name}." ) end lines end def format_amount(cents, currency) return nil if cents.blank? || cents.to_i <= 0 unit = currency.to_s.upcase.presence || "EUR" amount = cents.to_i / 100.0 format("%.2f %s", amount, unit == "EUR" ? "€" : unit) end end end end