klarna 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. data/.gitignore +9 -0
  2. data/.travis.yml +13 -0
  3. data/Gemfile +14 -0
  4. data/Guardfile +16 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.textile +139 -0
  7. data/Rakefile +22 -0
  8. data/TODO +30 -0
  9. data/examples/Gemfile +8 -0
  10. data/examples/config/initializer.rb +15 -0
  11. data/examples/console.rb +71 -0
  12. data/examples/public/images/klarna.png +0 -0
  13. data/examples/public/images/ruby.png +0 -0
  14. data/examples/views/_address.haml +22 -0
  15. data/examples/views/_articles.haml +21 -0
  16. data/examples/views/checkout_page_example.haml +2 -0
  17. data/examples/views/essential/add_transaction/_form.haml +32 -0
  18. data/examples/views/essential/add_transaction/result.haml +7 -0
  19. data/examples/views/essential/calculate_monthly_cost/_form.haml +16 -0
  20. data/examples/views/essential/calculate_monthly_cost/result.haml +7 -0
  21. data/examples/views/essential/get_addresses/_form.haml +9 -0
  22. data/examples/views/essential/get_addresses/result.haml +8 -0
  23. data/examples/views/index.haml +296 -0
  24. data/examples/views/layout.haml +48 -0
  25. data/examples/views/payment_terms_example.haml +102 -0
  26. data/examples/views/product_page_example.haml +2 -0
  27. data/examples/views/reservation/activate_reservation/_form.haml +54 -0
  28. data/examples/views/reservation/activate_reservation/result.haml +7 -0
  29. data/examples/views/reservation/cancel_reservation/_form.haml +8 -0
  30. data/examples/views/reservation/cancel_reservation/result.haml +7 -0
  31. data/examples/views/reservation/change_reservation/_form.haml +10 -0
  32. data/examples/views/reservation/change_reservation/result.haml +7 -0
  33. data/examples/views/reservation/reserve_amount/_form.haml +58 -0
  34. data/examples/views/reservation/reserve_amount/result.haml +7 -0
  35. data/examples/views/reservation/reserve_ocr_numbers/_form.haml +8 -0
  36. data/examples/views/reservation/reserve_ocr_numbers/result.haml +7 -0
  37. data/examples/views/reservation/split_reservation/_form.haml +14 -0
  38. data/examples/views/reservation/split_reservation/result.haml +7 -0
  39. data/examples/views/special/get_pclasses/_form.haml +8 -0
  40. data/examples/views/special/get_pclasses/result.haml +7 -0
  41. data/examples/views/special/invoice_address/_form.haml +8 -0
  42. data/examples/views/special/invoice_address/result.haml +7 -0
  43. data/examples/views/special/invoice_amount/_form.haml +8 -0
  44. data/examples/views/special/invoice_amount/result.haml +7 -0
  45. data/examples/views/special/is_invoice_paid/_form.haml +8 -0
  46. data/examples/views/special/is_invoice_paid/result.haml +7 -0
  47. data/examples/views/special/update_charge_amount/_form.haml +15 -0
  48. data/examples/views/special/update_charge_amount/result.haml +7 -0
  49. data/examples/views/special/update_goods_quantity/_form.haml +17 -0
  50. data/examples/views/special/update_goods_quantity/result.haml +7 -0
  51. data/examples/views/special/update_order_number/_form.haml +10 -0
  52. data/examples/views/special/update_order_number/result.haml +7 -0
  53. data/examples/views/useful/activate_invoice/_form.haml +9 -0
  54. data/examples/views/useful/activate_invoice/result.haml +7 -0
  55. data/examples/views/useful/credit_invoice/_form.haml +11 -0
  56. data/examples/views/useful/credit_invoice/result.haml +7 -0
  57. data/examples/views/useful/delete_invoice/_form.haml +9 -0
  58. data/examples/views/useful/delete_invoice/result.haml +7 -0
  59. data/examples/views/useful/email_invoice/_form.haml +9 -0
  60. data/examples/views/useful/email_invoice/result.haml +7 -0
  61. data/examples/views/useful/has_account/_form.haml +9 -0
  62. data/examples/views/useful/has_account/result.haml +7 -0
  63. data/examples/views/useful/return_amount/_form.haml +15 -0
  64. data/examples/views/useful/return_amount/result.haml +7 -0
  65. data/examples/views/useful/send_invoice/_form.haml +9 -0
  66. data/examples/views/useful/send_invoice/result.haml +7 -0
  67. data/examples/web.rb +349 -0
  68. data/klarna.gemspec +34 -0
  69. data/lib/klarna.rb +175 -0
  70. data/lib/klarna/api.rb +170 -0
  71. data/lib/klarna/api/client.rb +128 -0
  72. data/lib/klarna/api/constants.rb +638 -0
  73. data/lib/klarna/api/errors.rb +154 -0
  74. data/lib/klarna/api/methods.rb +16 -0
  75. data/lib/klarna/api/methods/cost_calculations.rb +134 -0
  76. data/lib/klarna/api/methods/invoicing.rb +304 -0
  77. data/lib/klarna/api/methods/reservation.rb +149 -0
  78. data/lib/klarna/api/methods/standard.rb +123 -0
  79. data/lib/klarna/version.rb +5 -0
  80. data/test/fixtures/api/companies.yml +97 -0
  81. data/test/fixtures/api/pclasses.yml +37 -0
  82. data/test/fixtures/api/persons.yml +144 -0
  83. data/test/fixtures/api/stores.yml +6 -0
  84. data/test/fixtures/klarna.yml +10 -0
  85. data/test/klarna/api/client_test.rb +272 -0
  86. data/test/klarna/api/errors_test.rb +46 -0
  87. data/test/klarna/api/methods/cost_calculations_test.rb +78 -0
  88. data/test/klarna/api/methods/invoicing_test.rb +409 -0
  89. data/test/klarna/api/methods/reservation_test.rb +66 -0
  90. data/test/klarna/api/methods/standard_test.rb +244 -0
  91. data/test/klarna/api_test.rb +137 -0
  92. data/test/klarna_test.rb +204 -0
  93. data/test/support/assertions_helper.rb +40 -0
  94. data/test/test_helper.rb +55 -0
  95. metadata +312 -0
@@ -0,0 +1,149 @@
1
+ # encoding: utf-8
2
+
3
+ module Klarna
4
+ module API
5
+ module Methods
6
+ module Reservation
7
+
8
+ # Reserve a purchase amount for a specific customer. The reservation is valid, by default, for 7 days.
9
+ # Pass cellphone no. instead of Pno for SMS payments.
10
+ #
11
+ def reserve_amount(pno_or_cellphone, amount, goods_list, reference, reference_code, order_id_1, order_id_2,
12
+ client_ip, shipping_address, invoicing_address, email, phone, cell_phone,
13
+ currency_code, country_code, language_code, pno_encoding, pclass, annual_salary = nil, flags = nil)
14
+ # params = [
15
+ # pno_or_cellphone,
16
+ # amount,
17
+ # reference,
18
+ # reference_code,
19
+ # order_id_1,
20
+ # order_id_2,
21
+ # shipping_address,
22
+ # invoicing_address,
23
+ # email,
24
+ # phone,
25
+ # cell_phone,
26
+ # client_ip,
27
+ # flags,
28
+ # currency_code,
29
+ # country_code,
30
+ # language_code,
31
+ # self.store_id,
32
+ # self.digest(pno_or_cellphone, amount),
33
+ # pno_encoding,
34
+ # (pclass || KRED_DEFAULT_PCLASS),
35
+ # (annual_salary || KRED_DEFAULT_YSALARY),
36
+ # goods_list
37
+ # ]
38
+ # self.call(:reserve_amount, *params)
39
+ raise NotImplementedError
40
+ end
41
+
42
+ # Activate purchases which have been previously reserved with the reserve_amount function.
43
+ #
44
+ def activate_reservation(reservation_id, pno, ocr, goods_list, reference, reference_code, order_id_1, order_id_2,
45
+ client_ip, shipping_address, invoicing_address, shipment_type, email, phone, cell_phone,
46
+ currency_code, country_code, language_code, pno_encoding, pclass, annual_salary = nil, flags = nil)
47
+ # params = [
48
+ # reservation_id,
49
+ # pno,
50
+ # (ocr || KRED_DEFAULT_OCR),
51
+ # goods_list,
52
+ # reference,
53
+ # reference_code,
54
+ # order_id_1,
55
+ # order_id_2,
56
+ # shipping_address,
57
+ # invoicing_address,
58
+ # shipment_type,
59
+ # email,
60
+ # phone,
61
+ # cell_phone,
62
+ # client_ip,
63
+ # flags,
64
+ # currency_code,
65
+ # country_code,
66
+ # language_code,
67
+ # self.store_id,
68
+ # self.digest(pno, goods_list),
69
+ # pno_encoding,
70
+ # (pclass || KRED_DEFAULT_PCLASS),
71
+ # (annual_salary || KRED_DEFAULT_YSALARY)
72
+ # ]
73
+ # self.call(:activate_reservation, *params)
74
+ raise NotImplementedError
75
+ end
76
+
77
+ # Cancel a reservation.
78
+ #
79
+ def cancel_reservation(reservation_id)
80
+ # params = [
81
+ # reservation_id,
82
+ # self.store_id,
83
+ # self.digest(reservation_id)
84
+ # ]
85
+ # self.call(:cancel_reservation, *params)
86
+ raise NotImplementedError
87
+ end
88
+
89
+ # Split a reservation due to for example outstanding articles.
90
+ #
91
+ def split_reservation(reservation_id, split_amount, order_id_1, order_id_2, flags = nil)
92
+ # params = [
93
+ # reservation_id,
94
+ # split_amount,
95
+ # order_id_1,
96
+ # order_id_2,
97
+ # flags.to_i,
98
+ # self.store_id,
99
+ # self.digest(reservation_id, split_amount)
100
+ # ]
101
+ # self.call(:split_reservation, *params)
102
+ raise NotImplementedError
103
+ end
104
+
105
+ # Change a reservation.
106
+ #
107
+ def change_reservation(reservation_id, new_amount)
108
+ # params = [
109
+ # reservation_id,
110
+ # new_amount,
111
+ # self.store_id,
112
+ # self.digest(reservation_id, new_amount)
113
+ # ]
114
+ # self.call(:change_reservation, *params)
115
+ raise NotImplementedError
116
+ end
117
+
118
+ # Reserves one or more OCR numbers for your store.
119
+ #
120
+ def reserve_ocr_numbers(number_of_ocrs)
121
+ # params = [
122
+ # number_of_ocrs,
123
+ # self.store_id,
124
+ # self.digest(number_of_ocrs)
125
+ # ]
126
+ # self.call(:reserve_ocr_nums, *params)
127
+ raise NotImplementedError
128
+ end
129
+
130
+ # Create addresses for arguments such as the +activate_reservation+ function.
131
+ #
132
+ def make_reservation_address(first_name, last_name, street_address, zip, city, country_code, house_number = nil)
133
+ # {
134
+ # :fname => first_name,
135
+ # :lname => last_name,
136
+ # :street => street_address,
137
+ # :zip => zip,
138
+ # :city => city,
139
+ # :country => ::Klarna::API.id_for(:country, country_code),
140
+ # :house_number => house_number
141
+ # }.with_indifferent_access
142
+ raise NotImplementedError
143
+ end
144
+ alias :mk_reservation_address :make_reservation_address
145
+
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,123 @@
1
+ # encoding: utf-8
2
+
3
+ module Klarna
4
+ module API
5
+ module Methods
6
+ module Standard
7
+
8
+ # Retrieve a customer’s address(es). Using this, the customer is not required to enter
9
+ # any information – only confirm the one presented to him/her.
10
+ # Can also be used for companies: If the customer enters a company number,
11
+ # it will return all the addresses where the company is registered at.
12
+ #
13
+ # == Note:
14
+ #
15
+ # ONLY allowed to be used for Swedish persons with the following conditions:
16
+ #
17
+ # * It can be only used if invoice or part payment is the default payment method
18
+ # * It has to disappear if the customer chooses another payment method
19
+ # * The button is not allowed to be called get address ("hämta adress"), but continue ("fortsätt")
20
+ # or it can be picked up automatically when all the numbers have been typed.
21
+ #
22
+ # In the other Nordic countries you will have to have input fields for name, last name, street name,
23
+ # zip code and city so that the customer can enter this information by himself.
24
+ #
25
+ def get_addresses(pno, pno_encoding, address_type = :GIVEN)
26
+ pno = pno.to_s.gsub(/[\W]/, '')
27
+ pno_encoding = ::Klarna::API.id_for(:pno_format, pno_encoding)
28
+ address_type = ::Klarna::API.id_for(:address_format, address_type)
29
+ params = [
30
+ pno,
31
+ self.store_id,
32
+ self.digest(pno),
33
+ pno_encoding,
34
+ address_type,
35
+ self.client_ip
36
+ ]
37
+ self.call(:get_addresses, *params).tap do |result|
38
+ result = result.first
39
+ result[5] = ::Klarna::API.id_for(:country, result[5]) # TODO: Return symbol from ID
40
+ end
41
+ end
42
+
43
+ # Same as +get_addresses+ but returns only first address.
44
+ #
45
+ def get_address(*args)
46
+ self.get_addresses(*args).first
47
+ end
48
+
49
+ # Create addresses (i.e. the +address+ argument to the +add_transaction+ method).
50
+ #
51
+ def make_address(co_address, street_address, zip, city, country, phone, cell_phone, email,
52
+ house_number = nil, house_extension = nil)
53
+ country = ::Klarna::API.id_for(:country, country)
54
+ phone = phone.to_s.gsub(/[\W\s\t]/, '')
55
+ cell_phone = cell_phone.to_s.gsub(/[\W\s\t]/, '')
56
+ {
57
+ :careof => co_address,
58
+ :street => street_address,
59
+ :postno => zip,
60
+ :city => city,
61
+ :country => country,
62
+ :telno => phone,
63
+ :cellno => cell_phone,
64
+ :email => email
65
+ }.with_indifferent_access
66
+ end
67
+ alias :mk_address :make_address
68
+
69
+ # Create an inventory (i.e. the +goods_list+ argument) to the +add_transaction+ function.
70
+ #
71
+ # == Flags:
72
+ #
73
+ # Argument +flags+ can be used to set the precision of the article, to indicate a shipment
74
+ # or a fee or sending the price with VAT.
75
+ #
76
+ # By using either +PRINT_1000+, +PRINT_100+, or +PRINT_10+, the +flags+
77
+ # function can be used to set article quantity (+quantity+). Unit is either +1/10+, +1/100+
78
+ # or +1/1000+. This is useful for goods measured in meters or kilograms, rather than number of items.
79
+ #
80
+ # By using the +IS_SHIPMENT+ or +IS_HANDLING+ flags a shipping or handling fee can
81
+ # be applied. The fees are sent excluding VAT with the arguments +shipping_fee+ or +handling_fee+.
82
+ #
83
+ # By using the +INC_VAT+ flag, you can send the price including VAT.
84
+ #
85
+ # == Note:
86
+ #
87
+ # If you are implementing sales with Euros, use the function mk_goods_flags instead
88
+ # since using this method can result in round off problems. With +mk_goods_flags+ you
89
+ # are able to send the price with VAT.
90
+ #
91
+ def make_goods(quantity, article_no, title, price, vat, discount = nil, flags = nil)
92
+ flags = ::Klarna::API.parse_flags(:GOODS, flags)
93
+ goods = {
94
+ :goods => {
95
+ :artno => article_no,
96
+ :title => title,
97
+ :price => price.to_i,
98
+ :vat => vat.to_f.round(2),
99
+ :discount => discount.to_f.round(2),
100
+ },
101
+ :qty => quantity.to_i
102
+ }
103
+ goods[:goods].merge!(:flags => flags.to_i) # if flags.present?
104
+ goods.with_indifferent_access
105
+ end
106
+ alias :mk_goods :make_goods
107
+ alias :mk_goods_flags :make_goods
108
+
109
+ # Check if a user has an account.
110
+ #
111
+ def has_account?(pno, pno_encoding)
112
+ params = [
113
+ self.store_id,
114
+ self.digest(pno),
115
+ pno_encoding
116
+ ]
117
+ self.call(:has_account, *params)
118
+ end
119
+
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+
3
+ module Klarna
4
+ VERSION = '0.1.3'
5
+ end
@@ -0,0 +1,97 @@
1
+ # Here are Klarnas test COMPANIES.
2
+ # All approved persons have unlimited credit and the system will never accept purchases from the not approved ones.
3
+ #
4
+ # Purchases done with the test persons will be displayed in Klarna Online as regular invoices, although they will
5
+ # unvisible unless you have "Yes" selected next to "Display test invoices" when searching for invoices.
6
+ #
7
+ # We will not pay for the invoices created with the test persons nor companies and we will not collect any fees as well.
8
+
9
+ companies:
10
+ se:
11
+ approved:
12
+ cno: "6020310139"
13
+ name: "Kalle Anka AB"
14
+ street_address: "Storgatan 1"
15
+ postal_code: "12345"
16
+ city: "Ankeborg"
17
+ street_address_2: "Lillgatan 99"
18
+ postal_code_2: "77777"
19
+ city_2: "Ankeborg"
20
+ country: "SE"
21
+ cell_phone: "076 526 00 00"
22
+ currency: "SEK"
23
+ language: "SV"
24
+ unapproved:
25
+ cno: "6720217931"
26
+ name: "Björnligan AB"
27
+ street_address: "Fulgatan 1"
28
+ postal_code: "12345"
29
+ city: "Ankeborg"
30
+ street_address_2: "Bakgatan 99"
31
+ postal_code_2: "77777"
32
+ city_2: "Ankeborg"
33
+ country: "SE"
34
+ cell_phone: "076 526 00 00"
35
+ currency: "SEK"
36
+ language: "SV"
37
+
38
+ no:
39
+ # N/A
40
+
41
+ dk:
42
+ approved:
43
+ pno: "27968880"
44
+ first_name: ""
45
+ last_name: "Onbase ApS"
46
+ street_address: "Centrumgaden 37"
47
+ postal_code: "2750"
48
+ city: "Ballerup"
49
+ country: "DK"
50
+ cell_phone: "20 123 456"
51
+ currency: "DKK"
52
+ language: "DA"
53
+ unapproved:
54
+ pno: "99999993"
55
+ first_name: ""
56
+ last_name: "Larsen & Olsen Contracters ApS"
57
+ street_address: "Glarmestervej 2"
58
+ postal_code: "8600"
59
+ city: "Silkeborg"
60
+ street_address: "Kristianiagade 9"
61
+ postal_code: "2100"
62
+ city: "København Ø"
63
+ country: "DK"
64
+ cell_phone: "20 123 456"
65
+ currency: "DKK"
66
+ language: "DA"
67
+
68
+ fi:
69
+ approved:
70
+ pno: "10891871"
71
+ first_name: ""
72
+ last_name: "Porin Mies-Laulu r.y."
73
+ street_address: "Vapaudenkatu 10"
74
+ postal_code: "28100"
75
+ city: "Pori"
76
+ country: "FI"
77
+ cell_phone: "040 123 45 67"
78
+ currency: "EUR"
79
+ language: "FI"
80
+
81
+ unapproved:
82
+ pno: "07527622"
83
+ first_name: ""
84
+ last_name: "Mankalan Perhekodit Oy"
85
+ street_address: "Porrassalmenkatu 19 B"
86
+ postal_code: "50100"
87
+ city: "Parikkala"
88
+ country: "FI"
89
+ cell_phone: "040 123 45 67"
90
+ currency: "EUR"
91
+ language: "FI"
92
+
93
+ de:
94
+ # N/A
95
+
96
+ nl:
97
+ # N/A
@@ -0,0 +1,37 @@
1
+ # Pclass id number, Description, Amount of months for part payment, Start fee, Invoice fee, Interest rate, Minimum purchase amount for pclass
2
+
3
+ pclasses:
4
+ sek:
5
+ 390:
6
+ pclass_id: 390
7
+ description: "Konto"
8
+ months: 24
9
+ start_fee: 0
10
+ invoice_fee: 2900
11
+ interest_rate: 1950
12
+ minimum_purchase_amount: 100
13
+ 121:
14
+ pclass_id: 121
15
+ description: "6 m\303\245n"
16
+ months: 6
17
+ start_fee: 19500
18
+ invoice_fee: 2900
19
+ interest_rate: 0
20
+ minimum_purchase_amount: 100000
21
+ 120:
22
+ pclass_id: 120
23
+ description: "3 m\303\245n"
24
+ months: 3
25
+ start_fee: 9500
26
+ invoice_fee: 2900
27
+ interest_rate: 0
28
+ minimum_purchase_amount: 100000
29
+
30
+ nok:
31
+ # Not available (for some reason)
32
+
33
+ dkk:
34
+ # Not available (for some reason)
35
+
36
+ eur:
37
+ # Not available (for some reason)
@@ -0,0 +1,144 @@
1
+ # Here are Klarnas test PERSONS.
2
+ # All approved persons have unlimited credit and the system will never accept purchases from the not approved ones.
3
+ #
4
+ # Purchases done with the test persons will be displayed in Klarna Online as regular invoices, although they will
5
+ # unvisible unless you have "Yes" selected next to "Display test invoices" when searching for invoices.
6
+ #
7
+ # We will not pay for the invoices created with the test persons nor companies and we will not collect any fees as well.
8
+
9
+ persons:
10
+ se:
11
+ approved:
12
+ pno: "4304158399"
13
+ first_name: "Karl"
14
+ last_name: "Lidin"
15
+ street_address: "Junibackg. 42"
16
+ postal_code: "23634"
17
+ city: "Hollviken"
18
+ country: "SE"
19
+ cell_phone: "076 526 00 00"
20
+ currency: "SEK"
21
+ language: "SV"
22
+ unapproved:
23
+ pno: "5311096845"
24
+ first_name: "Maud"
25
+ last_name: "Johansson"
26
+ street_address: "Köpmansgatan 7"
27
+ postal_code: "12149"
28
+ city: "Johanneshov"
29
+ country: "SE"
30
+ cell_phone: "076 526 00 00"
31
+ currency: "SEK"
32
+ language: "SV"
33
+
34
+ no:
35
+ approved:
36
+ pno: "18106500157"
37
+ first_name: "Petter"
38
+ last_name: "Testmann"
39
+ street_address: "Hundremeterskogen 100"
40
+ postal_code: "0563"
41
+ city: "Oslo"
42
+ country: "NO"
43
+ cell_phone: "40 123 456"
44
+ currency: "NOK"
45
+ language: "NO"
46
+ unapproved:
47
+ pno: "18106500076"
48
+ first_name: "Petra"
49
+ last_name: "Testdame"
50
+ street_address: "Sofienberggate 56"
51
+ postal_code: "0563"
52
+ city: "Oslo"
53
+ country: "NO"
54
+ cell_phone: "40 123 456"
55
+ currency: "NOK"
56
+ language: "NO"
57
+
58
+ dk:
59
+ approved:
60
+ pno: "0505610059"
61
+ first_name: "Rasmus Jens-Peter"
62
+ last_name: "Lybert"
63
+ street_address: "Godthåbvej 8,-2"
64
+ postal_code: "3900"
65
+ city: "Godthåb"
66
+ country: "DK"
67
+ cell_phone: "20 123 456"
68
+ currency: "DKK"
69
+ language: "DA"
70
+ unapproved:
71
+ # N/A
72
+
73
+ # fi:
74
+ # approved:
75
+ # pno: "230246-8989"
76
+ # first_name: "Suvi"
77
+ # last_name: "Aurinkoinen"
78
+ # street_address: "Planeettatie 2"
79
+ # postal_code: "01450"
80
+ # city: "Vantaa"
81
+ # country: "FI"
82
+ # cell_phone: "0401234567
83
+ # currency: "EUR"
84
+ # language: "FI"
85
+ # unapproved:
86
+ # pno: "010130-887T"
87
+ # first_name: "Mikael"
88
+ # last_name: "Miehinen"
89
+ # street_address: "Tikkuritie 11"
90
+ # postal_code: "01370"
91
+ # city: "Vantaa"
92
+ # country: "FI"
93
+ # cell_phone: "0401234567"
94
+ # currency: "EUR"
95
+ # language: "FI"
96
+ #
97
+ de:
98
+ approved:
99
+ pno: "070719601"
100
+ first_name: "Uno"
101
+ last_name: "Eins"
102
+ street_address: "Hellersbergstrasse 14"
103
+ postal_code: "41460"
104
+ city: "Neuss"
105
+ country: "DE"
106
+ cell_phone: "015 2211 3356"
107
+ currency: "EUR"
108
+ language: "DE"
109
+ unapproved:
110
+ pno: "07071950"
111
+ first_name: "Uno"
112
+ last_name: "Vier"
113
+ street_address: "Hellersbergstrasse 14"
114
+ postal_code: "41460"
115
+ city: "Neuss"
116
+ cell_phone: "015 2211 3356"
117
+ country: "DE"
118
+ currency: "EUR"
119
+ language: "DE"
120
+
121
+ nl:
122
+ approved:
123
+ pno:
124
+ first_name: "Test"
125
+ last_name: "Persoon"
126
+ street_address: "Neherkade 1"
127
+ postal_code: "2521VA"
128
+ city: "Gravenhage"
129
+ country: "NL"
130
+ cell_phone: "0612345678"
131
+ currency: "EUR"
132
+ language: "NL"
133
+ unapproved:
134
+ # Only a few details available.
135
+ pno:
136
+ first_name:
137
+ last_name:
138
+ street_address:
139
+ postal_code:
140
+ city:
141
+ country: "NL"
142
+ cell_phone: "0612345678"
143
+ currency: "EUR"
144
+ language: "NL"