/
helper.rb
91 lines (74 loc) · 3.12 KB
/
helper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
module ActiveMerchant #:nodoc:
module Billing #:nodoc:
module Integrations #:nodoc:
module Klarna
class Helper < ActiveMerchant::Billing::Integrations::Helper
mapping :currency, 'purchase_currency'
mapping :return_url, 'merchant_confirmation_uri'
mapping :notify_url, 'merchant_push_uri'
mapping :cancel_return_url, ['merchant_terms_uri', 'merchant_checkout_uri', 'merchant_base_uri']
mapping :account, 'merchant_id'
mapping :customer, email: 'shipping_address_email'
def initialize(order, account, options = {})
super
@shared_secret = options[:credential2]
add_field('platform_type', application_id)
add_field('test_mode', test?)
end
def line_item(item)
@line_items ||= []
@line_items << item
i = @line_items.size - 1
add_field("cart_item-#{i}_type", item.fetch(:type, ''))
add_field("cart_item-#{i}_reference", item.fetch(:reference, ''))
add_field("cart_item-#{i}_name", item.fetch(:name, ''))
add_field("cart_item-#{i}_quantity", item.fetch(:quantity, ''))
add_field("cart_item-#{i}_unit_price", item.fetch(:unit_price, ''))
add_field("cart_item-#{i}_discount_rate", item.fetch(:discount_rate, ''))
add_field("cart_item-#{i}_tax_rate", item.fetch(:tax_rate, ''))
@fields
end
def billing_address(billing_fields)
country = billing_fields[:country]
add_field('purchase_country', country)
add_field('locale', guess_locale_based_on_country(country))
end
def shipping_address(shipping_fields)
add_field('shipping_address_given_name', shipping_fields[:first_name])
add_field('shipping_address_family_name', shipping_fields[:last_name])
street_address = [shipping_fields[:address1], shipping_fields[:address2]].join(', ')
add_field('shipping_address_street_address', street_address)
add_field('shipping_address_postal_code', shipping_fields[:zip])
add_field('shipping_address_city', shipping_fields[:city])
add_field('shipping_address_country', shipping_fields[:country])
add_field('shipping_address_phone', shipping_fields[:phone])
end
def form_fields
sign_fields
super
end
def sign_fields
merchant_digest = Klarna.sign(@fields, @line_items, @shared_secret)
add_field('merchant_digest', merchant_digest)
end
private
def street_address
[address1, address2].compact.join(', ')
end
def guess_locale_based_on_country(country_code)
case country_code
when /no/i
"nb-no"
when /fi/i
"fi-fi"
when /se/i
"sv-se"
else
raise StandardError, "Unable to guess locale based on country #{country_code}"
end
end
end
end
end
end
end