fortnox-api 0.6.2 → 0.8.0
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.
- checksums.yaml +5 -5
- data/.rubocop.yml +5 -1
- data/.travis.yml +20 -22
- data/CHANGELOG.md +48 -0
- data/README.md +14 -19
- data/Rakefile +5 -0
- data/fortnox-api.gemspec +10 -10
- data/lib/fortnox/api/mappers.rb +5 -38
- data/lib/fortnox/api/mappers/base.rb +2 -24
- data/lib/fortnox/api/mappers/base/canonical_name_sym.rb +21 -0
- data/lib/fortnox/api/mappers/base/from_json.rb +6 -1
- data/lib/fortnox/api/mappers/value/array.rb +18 -0
- data/lib/fortnox/api/mappers/value/country_string.rb +24 -0
- data/lib/fortnox/api/mappers/value/date.rb +11 -0
- data/lib/fortnox/api/mappers/value/hash.rb +16 -0
- data/lib/fortnox/api/mappers/value/identity.rb +18 -0
- data/lib/fortnox/api/models/document.rb +6 -3
- data/lib/fortnox/api/models/invoice.rb +1 -1
- data/lib/fortnox/api/models/order.rb +1 -1
- data/lib/fortnox/api/repositories/base.rb +9 -11
- data/lib/fortnox/api/request_handling.rb +0 -1
- data/lib/fortnox/api/types.rb +40 -3
- data/lib/fortnox/api/types/enums.rb +36 -31
- data/lib/fortnox/api/types/shim/country_string.rb +10 -0
- data/lib/fortnox/api/version.rb +1 -1
- data/spec/fortnox/api/circular_queue_spec.rb +52 -0
- data/spec/fortnox/api/mappers/base/canonical_name_sym_spec.rb +34 -0
- data/spec/fortnox/api/mappers/base_spec.rb +33 -43
- data/spec/fortnox/api/mappers/contexts/json_conversion.rb +1 -1
- data/spec/fortnox/api/repositories/article_spec.rb +4 -2
- data/spec/fortnox/api/repositories/base_spec.rb +28 -8
- data/spec/fortnox/api/repositories/customer_spec.rb +29 -1
- data/spec/fortnox/api/repositories/invoice_spec.rb +147 -3
- data/spec/fortnox/api/repositories/order_spec.rb +2 -2
- data/spec/fortnox/api/repositories/project_spec.rb +1 -1
- data/spec/fortnox/api/repositories/terms_of_payment_spec.rb +4 -2
- data/spec/fortnox/api/repositories/unit_spec.rb +6 -3
- data/spec/fortnox/api/types/account_number_spec.rb +19 -15
- data/spec/fortnox/api/types/country_code_spec.rb +42 -0
- data/spec/fortnox/api/types/country_spec.rb +67 -0
- data/spec/fortnox/api/types/email_spec.rb +8 -7
- data/spec/fortnox/api/types/enums_spec.rb +1 -1
- data/spec/fortnox/api/types/examples/document_row.rb +1 -1
- data/spec/fortnox/api/types/housework_types_spec.rb +151 -34
- data/spec/fortnox/api_spec.rb +3 -1
- data/spec/vcr_cassettes/articles/all.yml +40 -10
- data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +21 -8
- data/spec/vcr_cassettes/articles/find_failure.yml +21 -8
- data/spec/vcr_cassettes/articles/find_id_1.yml +22 -9
- data/spec/vcr_cassettes/articles/find_new.yml +24 -11
- data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +21 -8
- data/spec/vcr_cassettes/articles/save_new.yml +22 -8
- data/spec/vcr_cassettes/articles/save_old.yml +24 -11
- data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +22 -8
- data/spec/vcr_cassettes/articles/search_by_name.yml +21 -8
- data/spec/vcr_cassettes/articles/search_miss.yml +21 -8
- data/spec/vcr_cassettes/articles/search_with_special_char.yml +21 -8
- data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +33 -10
- data/spec/vcr_cassettes/customers/all.yml +26 -13
- data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +21 -8
- data/spec/vcr_cassettes/customers/find_failure.yml +21 -8
- data/spec/vcr_cassettes/customers/find_id_1.yml +22 -9
- data/spec/vcr_cassettes/customers/find_new.yml +24 -11
- data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +21 -8
- data/spec/vcr_cassettes/customers/save_new.yml +21 -7
- data/spec/vcr_cassettes/customers/save_new_with_country_code_SE.yml +60 -0
- data/spec/vcr_cassettes/customers/save_old.yml +23 -10
- data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +21 -7
- data/spec/vcr_cassettes/customers/search_by_name.yml +32 -10
- data/spec/vcr_cassettes/customers/search_miss.yml +21 -8
- data/spec/vcr_cassettes/customers/search_with_special_char.yml +21 -8
- data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +22 -9
- data/spec/vcr_cassettes/invoices/all.yml +118 -67
- data/spec/vcr_cassettes/invoices/filter_hit.yml +26 -10
- data/spec/vcr_cassettes/invoices/filter_invalid.yml +20 -6
- data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +21 -8
- data/spec/vcr_cassettes/invoices/find_failure.yml +21 -8
- data/spec/vcr_cassettes/invoices/find_id_1.yml +23 -10
- data/spec/vcr_cassettes/invoices/find_new.yml +26 -14
- data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +23 -10
- data/spec/vcr_cassettes/invoices/save_new.yml +23 -10
- data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_KR.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_old.yml +25 -13
- data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +61 -0
- data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +60 -0
- data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +23 -10
- data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +23 -10
- data/spec/vcr_cassettes/invoices/search_by_name.yml +28 -11
- data/spec/vcr_cassettes/invoices/search_miss.yml +21 -8
- data/spec/vcr_cassettes/invoices/search_with_special_char.yml +21 -8
- data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +24 -11
- data/spec/vcr_cassettes/orders/all.yml +120 -107
- data/spec/vcr_cassettes/orders/filter_hit.yml +28 -12
- data/spec/vcr_cassettes/orders/filter_invalid.yml +20 -6
- data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +21 -8
- data/spec/vcr_cassettes/orders/find_failure.yml +21 -8
- data/spec/vcr_cassettes/orders/find_id_1.yml +23 -10
- data/spec/vcr_cassettes/orders/find_new.yml +26 -14
- data/spec/vcr_cassettes/orders/housework_invalid_tax_reduction_type.yml +57 -0
- data/spec/vcr_cassettes/orders/housework_othercoses_invalid.yml +57 -0
- data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_construction.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_cooking.yml +21 -7
- data/spec/vcr_cassettes/orders/housework_type_electricity.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_gardening.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_hvac.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_itservices.yml +60 -0
- data/spec/vcr_cassettes/orders/housework_type_majorappliancerepair.yml +60 -0
- data/spec/vcr_cassettes/orders/housework_type_masonry.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_movingservices.yml +60 -0
- data/spec/vcr_cassettes/orders/housework_type_othercare.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +24 -10
- data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +21 -7
- data/spec/vcr_cassettes/orders/housework_without_tax_reduction_type.yml +57 -0
- data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +22 -9
- data/spec/vcr_cassettes/orders/save_new.yml +23 -10
- data/spec/vcr_cassettes/orders/save_old.yml +25 -13
- data/spec/vcr_cassettes/orders/save_with_nested_model.yml +23 -10
- data/spec/vcr_cassettes/orders/search_by_name.yml +25 -11
- data/spec/vcr_cassettes/orders/search_miss.yml +21 -8
- data/spec/vcr_cassettes/orders/search_with_special_char.yml +21 -8
- data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +23 -10
- data/spec/vcr_cassettes/projects/all.yml +41 -16
- data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +21 -8
- data/spec/vcr_cassettes/projects/find_failure.yml +21 -8
- data/spec/vcr_cassettes/projects/find_id_1.yml +21 -8
- data/spec/vcr_cassettes/projects/find_new.yml +24 -11
- data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +23 -10
- data/spec/vcr_cassettes/projects/save_new.yml +22 -8
- data/spec/vcr_cassettes/projects/save_old.yml +24 -11
- data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +22 -9
- data/spec/vcr_cassettes/termsofpayments/all.yml +31 -14
- data/spec/vcr_cassettes/termsofpayments/find_failure.yml +21 -8
- data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +22 -9
- data/spec/vcr_cassettes/termsofpayments/find_new.yml +23 -10
- data/spec/vcr_cassettes/termsofpayments/save_new.yml +22 -8
- data/spec/vcr_cassettes/termsofpayments/save_old.yml +23 -10
- data/spec/vcr_cassettes/units/all.yml +31 -12
- data/spec/vcr_cassettes/units/find_failure.yml +21 -8
- data/spec/vcr_cassettes/units/find_id_1.yml +21 -8
- data/spec/vcr_cassettes/units/find_new.yml +23 -12
- data/spec/vcr_cassettes/units/save_new.yml +22 -10
- data/spec/vcr_cassettes/units/save_old.yml +23 -12
- data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +22 -10
- data/temp.txt +1 -0
- metadata +99 -21
- data/spec/support/matchers/type/have_country_code_matcher.rb +0 -15
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fortnox
|
4
|
+
module API
|
5
|
+
module Mapper
|
6
|
+
Identity = ->(value) { value }
|
7
|
+
|
8
|
+
Registry.register(:integer, Fortnox::API::Mapper::Identity)
|
9
|
+
Registry.register(:int, Fortnox::API::Mapper::Identity)
|
10
|
+
Registry.register(:float, Fortnox::API::Mapper::Identity)
|
11
|
+
Registry.register(:string, Fortnox::API::Mapper::Identity)
|
12
|
+
Registry.register(:boolean, Fortnox::API::Mapper::Identity)
|
13
|
+
Registry.register(:falseclass, Fortnox::API::Mapper::Identity)
|
14
|
+
Registry.register(:trueclass, Fortnox::API::Mapper::Identity)
|
15
|
+
Registry.register(:nilclass, Fortnox::API::Mapper::Identity)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -44,7 +44,7 @@ module Fortnox
|
|
44
44
|
attribute :contribution_value, Types::Nullable::Float.is(:read_only)
|
45
45
|
|
46
46
|
# Country Country for the document address.
|
47
|
-
attribute :country, Types::
|
47
|
+
attribute :country, Types::Country
|
48
48
|
|
49
49
|
# CostCenter Code of the cost center.
|
50
50
|
attribute :cost_center, Types::Nullable::String
|
@@ -74,7 +74,7 @@ module Fortnox
|
|
74
74
|
attribute :delivery_city, Types::Sized::String[1024]
|
75
75
|
|
76
76
|
# DeliveryCountry Country for the document delivery address.
|
77
|
-
attribute :delivery_country, Types::
|
77
|
+
attribute :delivery_country, Types::Country
|
78
78
|
|
79
79
|
# DeliveryDate Date of delivery.
|
80
80
|
attribute :delivery_date, Types::Nullable::Date
|
@@ -109,7 +109,7 @@ module Fortnox
|
|
109
109
|
# HouseWork If there is any row of the document marked "housework".
|
110
110
|
attribute :housework, Types::Nullable::Boolean.is(:read_only)
|
111
111
|
|
112
|
-
attribute :labels, Types::Strict::Array.
|
112
|
+
attribute :labels, Types::Strict::Array.of(Label)
|
113
113
|
|
114
114
|
# Net Net amount
|
115
115
|
attribute :net, Types::Nullable::Float.is(:read_only)
|
@@ -154,6 +154,9 @@ module Fortnox
|
|
154
154
|
# TaxReduction The amount of tax reduction.
|
155
155
|
attribute :tax_reduction, Types::Nullable::Integer.is(:read_only)
|
156
156
|
|
157
|
+
# TaxReductionType Tax Reduction Type
|
158
|
+
attribute :tax_reduction_type, Types::TaxReductionType
|
159
|
+
|
157
160
|
# TermsOfDelivery Code of the terms of delivery.
|
158
161
|
attribute :terms_of_delivery, Types::Nullable::String
|
159
162
|
|
@@ -50,7 +50,7 @@ module Fortnox
|
|
50
50
|
attribute :invoice_period_end, Types::Nullable::Date.is(:read_only)
|
51
51
|
|
52
52
|
# InvoiceRows Separate object
|
53
|
-
attribute :invoice_rows, Types::Strict::Array.
|
53
|
+
attribute :invoice_rows, Types::Strict::Array.of(Types::InvoiceRow)
|
54
54
|
|
55
55
|
# InvoiceType The type of invoice.
|
56
56
|
attribute :invoice_type, Types::Nullable::String
|
@@ -16,10 +16,10 @@ module Fortnox
|
|
16
16
|
|
17
17
|
HTTParty::Parser::SupportedFormats['text/html'] = :json
|
18
18
|
|
19
|
-
|
19
|
+
headers(
|
20
20
|
'Content-Type' => 'application/json',
|
21
21
|
'Accept' => 'application/json'
|
22
|
-
|
22
|
+
)
|
23
23
|
|
24
24
|
HTTP_METHODS = %i[get put post delete].freeze
|
25
25
|
|
@@ -31,21 +31,19 @@ module Fortnox
|
|
31
31
|
end
|
32
32
|
|
33
33
|
HTTP_METHODS.each do |method|
|
34
|
-
define_method method do
|
35
|
-
headers
|
34
|
+
define_method method do |path, options = {}, &block|
|
35
|
+
provided_headers = options[:headers] || {}
|
36
|
+
provided_headers['Client-Secret'] = client_secret
|
37
|
+
provided_headers['Access-Token'] = next_access_token
|
38
|
+
options[:headers] = provided_headers
|
39
|
+
options[:base_uri] ||= base_url
|
36
40
|
execute do |remote|
|
37
|
-
remote.send(method,
|
41
|
+
remote.send(method, path, options, &block)
|
38
42
|
end
|
39
43
|
end
|
40
44
|
end
|
41
45
|
|
42
46
|
def initialize(keys_filtered_on_save: [:url], token_store: :default)
|
43
|
-
self.class.base_uri(base_url)
|
44
|
-
|
45
|
-
self.headers = DEFAULT_HEADERS.merge(
|
46
|
-
'Client-Secret' => client_secret
|
47
|
-
)
|
48
|
-
|
49
47
|
@keys_filtered_on_save = keys_filtered_on_save
|
50
48
|
@token_store = token_store
|
51
49
|
@mapper = Registry[Mapper::Base.canonical_name_sym(self.class::MODEL)].new
|
data/lib/fortnox/api/types.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'dry-struct'
|
4
4
|
require 'dry-types'
|
5
|
+
require 'countries'
|
6
|
+
require 'fortnox/api/types/shim/country_string'
|
5
7
|
|
6
8
|
module Dry
|
7
9
|
module Types
|
@@ -24,6 +26,7 @@ module Fortnox
|
|
24
26
|
module API
|
25
27
|
module Types
|
26
28
|
include Dry::Types.module
|
29
|
+
ISO3166.configure { |config| config.locales = %i[en sv] }
|
27
30
|
|
28
31
|
THE_TRUTH = { true => true, 'true' => true, false => false, 'false' => false }.freeze
|
29
32
|
|
@@ -38,16 +41,45 @@ module Fortnox
|
|
38
41
|
AccountNumber = Strict::Int
|
39
42
|
.constrained(gteq: 0, lteq: 9999)
|
40
43
|
.optional
|
44
|
+
.constructor do |value|
|
45
|
+
next nil if value.nil? || value == ''
|
46
|
+
value
|
47
|
+
end
|
41
48
|
|
42
49
|
ArticleType = Strict::String
|
43
50
|
.constrained(included_in: ArticleTypes.values)
|
44
51
|
.optional
|
45
52
|
.constructor(EnumConstructors.default)
|
46
53
|
|
54
|
+
Country = Strict::String
|
55
|
+
.optional
|
56
|
+
.constructor do |value|
|
57
|
+
next value if value.nil? || value == ''
|
58
|
+
|
59
|
+
# Fortnox only supports Swedish translation of Sweden
|
60
|
+
next CountryString.new('SE') if value.match?(/^s(e$|we|ve)/i)
|
61
|
+
|
62
|
+
country = ::ISO3166::Country[value] ||
|
63
|
+
::ISO3166::Country.find_country_by_name(value) ||
|
64
|
+
::ISO3166::Country.find_country_by_translated_names(value)
|
65
|
+
|
66
|
+
raise Dry::Types::ConstraintError.new('value violates constraints', value) if country.nil?
|
67
|
+
|
68
|
+
CountryString.new(country.alpha2)
|
69
|
+
end
|
70
|
+
|
47
71
|
CountryCode = Strict::String
|
48
|
-
.constrained(included_in: CountryCodes.values)
|
49
72
|
.optional
|
50
|
-
.constructor
|
73
|
+
.constructor do |value|
|
74
|
+
next value if value.nil? || value == ''
|
75
|
+
|
76
|
+
country = ::ISO3166::Country[value]
|
77
|
+
|
78
|
+
raise Dry::Types::ConstraintError.new('value violates constraints', value) if country.nil?
|
79
|
+
|
80
|
+
country.alpha2
|
81
|
+
end
|
82
|
+
|
51
83
|
Currency = Strict::String
|
52
84
|
.constrained(included_in: Currencies.values)
|
53
85
|
.optional
|
@@ -63,7 +95,7 @@ module Fortnox
|
|
63
95
|
.constructor(EnumConstructors.default)
|
64
96
|
|
65
97
|
Email = Strict::String
|
66
|
-
.constrained(max_size: 1024, format: /^$|\A[
|
98
|
+
.constrained(max_size: 1024, format: /^$|\A[[[:alnum:]]+-_.]+@[\w+-_.]+\.[a-z]+\z/i)
|
67
99
|
.optional
|
68
100
|
.constructor { |v| v.to_s.downcase unless v.nil? }
|
69
101
|
|
@@ -87,6 +119,11 @@ module Fortnox
|
|
87
119
|
.optional
|
88
120
|
.constructor(EnumConstructors.default)
|
89
121
|
|
122
|
+
TaxReductionType = Strict::String
|
123
|
+
.constrained(included_in: TaxReductionTypes.values)
|
124
|
+
.optional
|
125
|
+
.constructor(EnumConstructors.lower_case)
|
126
|
+
|
90
127
|
require 'fortnox/api/types/model'
|
91
128
|
require 'fortnox/api/types/default_delivery_types'
|
92
129
|
require 'fortnox/api/types/default_templates'
|
@@ -17,6 +17,13 @@ module Fortnox
|
|
17
17
|
value.to_s.upcase unless value.nil?
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
21
|
+
def self.lower_case
|
22
|
+
lambda do |value|
|
23
|
+
return nil if value == ''
|
24
|
+
value.to_s.downcase unless value.nil?
|
25
|
+
end
|
26
|
+
end
|
20
27
|
end
|
21
28
|
|
22
29
|
ArticleTypes = Types::Strict::String.enum(
|
@@ -25,38 +32,31 @@ module Fortnox
|
|
25
32
|
DiscountTypes = Types::Strict::String.enum(
|
26
33
|
'AMOUNT', 'PERCENT'
|
27
34
|
)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
+
HOUSEWORK_TYPES = {
|
36
|
+
rot: %w[
|
37
|
+
CONSTRUCTION ELECTRICITY GLASSMETALWORK GROUNDDRAINAGEWORK
|
38
|
+
MASONRY PAINTINGWALLPAPERING HVAC OTHERCOSTS
|
39
|
+
],
|
40
|
+
rut: %w[
|
41
|
+
MAJORAPPLIANCEREPAIR MOVINGSERVICES ITSERVICES CLEANING
|
42
|
+
TEXTILECLOTHING SNOWPLOWING GARDENING BABYSITTING OTHERCARE
|
43
|
+
OTHERCOSTS
|
44
|
+
],
|
45
|
+
legacy_rut: %w[COOKING TUTORING]
|
46
|
+
}.freeze
|
47
|
+
|
48
|
+
# TODO: RUT to be added:
|
49
|
+
# HOMEMAINTENANCE FURNISHING TRANSPORTATIONSERVICES
|
50
|
+
# WASHINGANDCAREOFCLOTHING
|
51
|
+
#
|
52
|
+
# TODO: GREEN to be added:
|
53
|
+
# SOLARCELLS STORAGESELFPRODUCEDELECTRICTY
|
54
|
+
# CHARGINGSTATIONELECTRICVEHICLE OTHERCOSTS
|
55
|
+
|
35
56
|
HouseworkTypes = Types::Strict::String.enum(
|
36
|
-
*(
|
37
|
-
|
38
|
-
|
39
|
-
'AF', 'AX', 'AL', 'DZ', 'AS', 'AD', 'AO', 'AI', 'AQ', 'AG', 'AR', 'AM',
|
40
|
-
'AW', 'AU', 'AT', 'AZ', 'BS', 'BH', 'BD', 'BB', 'BY', 'BE', 'BZ', 'BJ',
|
41
|
-
'BM', 'BT', 'BO', 'BQ', 'BA', 'BW', 'BV', 'BR', 'IO', 'BN', 'BG', 'BF',
|
42
|
-
'BI', 'CV', 'KH', 'CM', 'CA', 'KY', 'CF', 'TD', 'CL', 'CN', 'CX', 'CC',
|
43
|
-
'CO', 'KM', 'CG', 'CD', 'CK', 'CR', 'CI', 'HR', 'CU', 'CW', 'CY', 'CZ',
|
44
|
-
'DK', 'DJ', 'DM', 'DO', 'EC', 'EG', 'SV', 'GQ', 'ER', 'EE', 'ET', 'FK',
|
45
|
-
'FO', 'FJ', 'FI', 'FR', 'GF', 'PF', 'TF', 'GA', 'GM', 'GE', 'DE', 'GH',
|
46
|
-
'GI', 'GR', 'GL', 'GD', 'GP', 'GU', 'GT', 'GG', 'GN', 'GW', 'GY', 'HT',
|
47
|
-
'HM', 'VA', 'HN', 'HK', 'HU', 'IS', 'IN', 'ID', 'IR', 'IQ', 'IE', 'IM',
|
48
|
-
'IL', 'IT', 'JM', 'JP', 'JE', 'JO', 'KZ', 'KE', 'KI', 'KP', 'KR', 'KW',
|
49
|
-
'KG', 'LA', 'LV', 'LB', 'LS', 'LR', 'LY', 'LI', 'LT', 'LU', 'MO', 'MK',
|
50
|
-
'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MH', 'MQ', 'MR', 'MU', 'YT', 'MX',
|
51
|
-
'FM', 'MD', 'MC', 'MN', 'ME', 'MS', 'MA', 'MZ', 'MM', 'NA', 'NR', 'NP',
|
52
|
-
'NL', 'NC', 'NZ', 'NI', 'NE', 'NG', 'NU', 'NF', 'MP', 'NO', 'OM', 'PK',
|
53
|
-
'PW', 'PS', 'PA', 'PG', 'PY', 'PE', 'PH', 'PN', 'PL', 'PT', 'PR', 'QA',
|
54
|
-
'RE', 'RO', 'RU', 'RW', 'BL', 'SH', 'KN', 'LC', 'MF', 'PM', 'VC', 'WS',
|
55
|
-
'SM', 'ST', 'SA', 'SN', 'RS', 'SC', 'SL', 'SG', 'SX', 'SK', 'SI', 'SB',
|
56
|
-
'SO', 'ZA', 'GS', 'SS', 'ES', 'LK', 'SD', 'SR', 'SJ', 'SZ', 'SE', 'CH',
|
57
|
-
'SY', 'TW', 'TJ', 'TZ', 'TH', 'TL', 'TG', 'TK', 'TO', 'TT', 'TN', 'TR',
|
58
|
-
'TM', 'TC', 'TV', 'UG', 'UA', 'AE', 'GB', 'US', 'UM', 'UY', 'UZ', 'VU',
|
59
|
-
'VE', 'VN', 'VG', 'VI', 'WF', 'EH', 'YE', 'ZM', 'ZW'
|
57
|
+
*(HOUSEWORK_TYPES[:rot] +
|
58
|
+
HOUSEWORK_TYPES[:rut] +
|
59
|
+
HOUSEWORK_TYPES[:legacy_rut]).uniq
|
60
60
|
)
|
61
61
|
Currencies = Types::Strict::String.enum(
|
62
62
|
'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN',
|
@@ -90,6 +90,11 @@ module Fortnox
|
|
90
90
|
ProjectStatusTypes = Types::Strict::String.enum(
|
91
91
|
'NOTSTARTED', 'ONGOING', 'COMPLETED'
|
92
92
|
)
|
93
|
+
# NOTE: Yes, these needs to be in lower case...
|
94
|
+
# I know, this is stupid... Fortnox: why?!
|
95
|
+
TaxReductionTypes = Types::Strict::String.enum(
|
96
|
+
'rot', 'rut', 'green', 'none'
|
97
|
+
)
|
93
98
|
end
|
94
99
|
end
|
95
100
|
end
|
data/lib/fortnox/api/version.rb
CHANGED
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'fortnox/api/circular_queue'
|
5
|
+
|
6
|
+
describe Fortnox::API::CircularQueue do
|
7
|
+
describe 'start index' do
|
8
|
+
context 'when running several times' do
|
9
|
+
subject { Set.new(samples).size }
|
10
|
+
|
11
|
+
let(:test_array) { (0..99).to_a }
|
12
|
+
let(:samples) { Array.new(100) { described_class.new(*test_array).next } }
|
13
|
+
|
14
|
+
# NOTE: This test is not perfect. We are testing that a random generator
|
15
|
+
# with 100 items to choose from does not choose the same item 100 times in a row.
|
16
|
+
# Yes, the possibility is low, but I thought I should just mention it :)
|
17
|
+
it 'does not start with the same item each time' do
|
18
|
+
is_expected.to be > 1
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#next' do
|
24
|
+
context 'when several items in queue' do
|
25
|
+
let(:queue) { described_class.new(1, 2, 3) }
|
26
|
+
let(:first_round) { Array.new(3) { queue.next } }
|
27
|
+
let(:second_round) { Array.new(3) { queue.next } }
|
28
|
+
|
29
|
+
it 'circulates the items' do
|
30
|
+
first_round
|
31
|
+
expect(first_round[0]).to eq(queue.next)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'circulates the items in the same order each time' do
|
35
|
+
expect(first_round).to eq(second_round)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'circulates through given input' do
|
39
|
+
expect(first_round.sort).to eq([1, 2, 3])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when only one item in queue' do
|
44
|
+
let(:queue) { described_class.new(1) }
|
45
|
+
|
46
|
+
it 'circulates the item' do
|
47
|
+
first_item = queue.next
|
48
|
+
expect(first_item).to eq(queue.next)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'fortnox/api/mappers/base/canonical_name_sym'
|
5
|
+
|
6
|
+
describe Fortnox::API::Mapper::CanonicalNameSym do
|
7
|
+
describe '.canonical_name_sym' do
|
8
|
+
context 'with simple class' do
|
9
|
+
using_test_class do
|
10
|
+
class TestClass
|
11
|
+
extend Fortnox::API::Mapper::CanonicalNameSym
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
subject { TestClass.canonical_name_sym }
|
16
|
+
|
17
|
+
it { is_expected.to eq(:testclass) }
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when class included in module' do
|
21
|
+
using_test_class do
|
22
|
+
module Something
|
23
|
+
class Test
|
24
|
+
extend Fortnox::API::Mapper::CanonicalNameSym
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
subject { Something::Test.canonical_name_sym }
|
30
|
+
|
31
|
+
it { is_expected.to eq(:test) }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -35,6 +35,12 @@ describe Fortnox::API::Mapper::Base do
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
describe 'integer' do
|
39
|
+
include_examples 'identity mapper', :integer do
|
40
|
+
let(:value) { Fortnox::API::Types::Nullable::Integer[1337] }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
38
44
|
describe 'float' do
|
39
45
|
include_examples 'identity mapper', :float do
|
40
46
|
let(:value) { Fortnox::API::Types::Nullable::Float[13.37] }
|
@@ -111,57 +117,41 @@ describe Fortnox::API::Mapper::Base do
|
|
111
117
|
end
|
112
118
|
end
|
113
119
|
|
114
|
-
describe '
|
115
|
-
|
116
|
-
let(:value) { Fortnox::API::Types::AccountNumber[1234] }
|
117
|
-
end
|
118
|
-
end
|
120
|
+
describe 'Country' do
|
121
|
+
subject { mapper.call('GB') }
|
119
122
|
|
120
|
-
|
121
|
-
include_examples 'identity mapper', :country_code do
|
122
|
-
let(:value) { Fortnox::API::Types::CountryCode['SE'] }
|
123
|
-
end
|
124
|
-
end
|
123
|
+
let(:mapper) { Fortnox::API::Registry[:countrystring] }
|
125
124
|
|
126
|
-
|
127
|
-
include_examples 'identity mapper', :currency do
|
128
|
-
let(:value) { Fortnox::API::Types::Currency['SEK'] }
|
129
|
-
end
|
130
|
-
end
|
125
|
+
it { is_expected.to eq('United Kingdom') }
|
131
126
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
end
|
136
|
-
end
|
127
|
+
describe 'special cases' do
|
128
|
+
context 'with SE' do
|
129
|
+
subject { mapper.call('SE') }
|
137
130
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
end
|
131
|
+
it 'translates code to country name in Swedish' do
|
132
|
+
is_expected.to eq('Sverige')
|
133
|
+
end
|
134
|
+
end
|
143
135
|
|
144
|
-
|
145
|
-
|
146
|
-
let(:value) { Fortnox::API::Types::Email['email@example.com'] }
|
147
|
-
end
|
148
|
-
end
|
136
|
+
context 'with nil value' do
|
137
|
+
subject { mapper.call(nil) }
|
149
138
|
|
150
|
-
|
151
|
-
|
152
|
-
let(:value) { Fortnox::API::Types::HouseworkType['CONSTRUCTION'] }
|
153
|
-
end
|
154
|
-
end
|
139
|
+
it { is_expected.to eq(nil) }
|
140
|
+
end
|
155
141
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
142
|
+
context 'with empty string' do
|
143
|
+
subject { mapper.call('') }
|
144
|
+
|
145
|
+
it { is_expected.to eq('') }
|
146
|
+
end
|
161
147
|
|
162
|
-
|
163
|
-
|
148
|
+
context 'with nonsense' do
|
149
|
+
subject { -> { mapper.call('nonsense') } }
|
164
150
|
|
165
|
-
|
151
|
+
it 'is not supported (since input is sanitised) and therefore blows up' do
|
152
|
+
raise_error(NoMethodError)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
166
156
|
end
|
167
157
|
end
|