# frozen_string_literal: true # A payment schedule applied to plan in the shopping cart class CartItem::PaymentSchedule attr_reader :requested, :errors def initialize(plan, coupon, requested, customer, start_at = nil) raise TypeError unless coupon.is_a? CartItem::Coupon @plan = plan @coupon = coupon @requested = requested @customer = customer @start_at = start_at @errors = {} end def schedule(total, total_without_coupon) schedule = if @requested && @plan&.monthly_payment PaymentScheduleService.new.compute(@plan, total_without_coupon, @customer, coupon: @coupon.coupon, start_at: @start_at) else nil end total_amount = if schedule schedule[:items][0].amount else total end { schedule: schedule, total: total_amount } end def type 'subscription' end def valid?(_all_items) return true unless @requested && @plan&.monthly_payment if @plan&.disabled @errors[:item] = 'plan is disabled' return false end true end end