payment_methods.rb

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