payment_methods.rb

 1# frozen_string_literal: true
 2
 3require_relative "payment_method"
 4
 5class PaymentMethods
 6	def self.for(braintree_customer, badcards, three_d_secure)
 7		methods = braintree_customer.payment_methods.reject { |m|
 8			badcards.include?(m.unique_number_identifier)
 9		}
10		if methods.empty?
11			Empty.new
12		else
13			new(methods.map { |m| PaymentMethod.for(m, three_d_secure) })
14		end
15	end
16
17	def initialize(methods)
18		@methods = methods
19	end
20
21	def fetch(idx)
22		@methods.fetch(idx)
23	end
24
25	def default_payment_method
26		@methods.find(&:default?)
27	end
28
29	def default_payment_method_index
30		@methods.index(&:default?)&.to_s
31	end
32
33	def to_options
34		@methods.map.with_index do |method, idx|
35			{
36				value: idx.to_s,
37				label: "#{method.card_type} #{method.last_4}"
38			}
39		end
40	end
41
42	def to_list_single(**kwargs)
43		{
44			var: "payment_method",
45			type: "list-single",
46			label: "Credit card to pay with",
47			required: true,
48			value: default_payment_method_index,
49			options: to_options
50		}.merge(kwargs)
51	end
52
53	def empty?
54		false
55	end
56
57	def to_a
58		@methods
59	end
60
61	class Empty < PaymentMethods
62		def initialize; end
63
64		def default_payment_method; end
65
66		def to_list_single(*)
67			raise "No payment methods available"
68		end
69
70		def empty?
71			true
72		end
73
74		def to_a
75			[]
76		end
77	end
78end