fortnox-api 0.5.2 → 0.6.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.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +9 -1104
  4. data/.travis.yml +22 -2
  5. data/Gemfile +3 -1
  6. data/Guardfile +4 -2
  7. data/README.md +2 -2
  8. data/Rakefile +3 -1
  9. data/bin/console +17 -3
  10. data/fortnox-api.gemspec +32 -27
  11. data/lib/fortnox/api.rb +17 -16
  12. data/lib/fortnox/api/circular_queue.rb +13 -7
  13. data/lib/fortnox/api/mappers.rb +29 -25
  14. data/lib/fortnox/api/mappers/article.rb +7 -6
  15. data/lib/fortnox/api/mappers/base.rb +18 -16
  16. data/lib/fortnox/api/mappers/base/from_json.rb +37 -30
  17. data/lib/fortnox/api/mappers/base/to_json.rb +39 -37
  18. data/lib/fortnox/api/mappers/customer.rb +7 -7
  19. data/lib/fortnox/api/mappers/default_delivery_types.rb +4 -2
  20. data/lib/fortnox/api/mappers/default_templates.rb +5 -4
  21. data/lib/fortnox/api/mappers/edi_information.rb +5 -4
  22. data/lib/fortnox/api/mappers/email_information.rb +5 -4
  23. data/lib/fortnox/api/mappers/invoice.rb +10 -8
  24. data/lib/fortnox/api/mappers/invoice_row.rb +12 -7
  25. data/lib/fortnox/api/mappers/order.rb +10 -7
  26. data/lib/fortnox/api/mappers/order_row.rb +13 -6
  27. data/lib/fortnox/api/mappers/project.rb +6 -4
  28. data/lib/fortnox/api/mappers/terms_of_payments.rb +17 -0
  29. data/lib/fortnox/api/mappers/unit.rb +17 -0
  30. data/lib/fortnox/api/models.rb +9 -5
  31. data/lib/fortnox/api/models/article.rb +68 -67
  32. data/lib/fortnox/api/models/base.rb +52 -36
  33. data/lib/fortnox/api/models/customer.rb +95 -94
  34. data/lib/fortnox/api/models/document.rb +186 -0
  35. data/lib/fortnox/api/models/invoice.rb +44 -44
  36. data/lib/fortnox/api/models/label.rb +5 -3
  37. data/lib/fortnox/api/models/order.rb +8 -8
  38. data/lib/fortnox/api/models/project.rb +10 -8
  39. data/lib/fortnox/api/models/terms_of_payments.rb +28 -0
  40. data/lib/fortnox/api/models/unit.rb +24 -0
  41. data/lib/fortnox/api/repositories.rb +9 -5
  42. data/lib/fortnox/api/repositories/article.rb +6 -4
  43. data/lib/fortnox/api/repositories/base.rb +49 -46
  44. data/lib/fortnox/api/repositories/base/loaders.rb +32 -36
  45. data/lib/fortnox/api/repositories/base/savers.rb +23 -21
  46. data/lib/fortnox/api/repositories/customer.rb +6 -4
  47. data/lib/fortnox/api/repositories/invoice.rb +6 -4
  48. data/lib/fortnox/api/repositories/order.rb +6 -4
  49. data/lib/fortnox/api/repositories/project.rb +6 -4
  50. data/lib/fortnox/api/repositories/terms_of_payments.rb +17 -0
  51. data/lib/fortnox/api/repositories/unit.rb +17 -0
  52. data/lib/fortnox/api/request_handling.rb +12 -12
  53. data/lib/fortnox/api/types.rb +62 -11
  54. data/lib/fortnox/api/types/default_delivery_types.rb +5 -3
  55. data/lib/fortnox/api/types/default_templates.rb +3 -1
  56. data/lib/fortnox/api/types/defaulted.rb +2 -2
  57. data/lib/fortnox/api/types/document_row.rb +41 -42
  58. data/lib/fortnox/api/types/edi_information.rb +10 -8
  59. data/lib/fortnox/api/types/email_information.rb +10 -8
  60. data/lib/fortnox/api/types/enums.rb +60 -47
  61. data/lib/fortnox/api/types/invoice_row.rb +8 -8
  62. data/lib/fortnox/api/types/model.rb +14 -10
  63. data/lib/fortnox/api/types/nullable.rb +7 -7
  64. data/lib/fortnox/api/types/order_row.rb +5 -5
  65. data/lib/fortnox/api/types/required.rb +5 -5
  66. data/lib/fortnox/api/types/sized.rb +14 -6
  67. data/lib/fortnox/api/version.rb +3 -1
  68. data/spec/fortnox/api/mappers/article_spec.rb +3 -1
  69. data/spec/fortnox/api/mappers/base/from_json_spec.rb +15 -13
  70. data/spec/fortnox/api/mappers/base/to_json_spec.rb +4 -3
  71. data/spec/fortnox/api/mappers/base_spec.rb +40 -35
  72. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +12 -11
  73. data/spec/fortnox/api/mappers/customer_spec.rb +3 -1
  74. data/spec/fortnox/api/mappers/default_delivery_types_spec.rb +3 -1
  75. data/spec/fortnox/api/mappers/edi_information_spec.rb +4 -2
  76. data/spec/fortnox/api/mappers/email_information_spec.rb +4 -2
  77. data/spec/fortnox/api/mappers/examples/mapper.rb +17 -9
  78. data/spec/fortnox/api/mappers/invoice_row_spec.rb +8 -3
  79. data/spec/fortnox/api/mappers/invoice_spec.rb +4 -1
  80. data/spec/fortnox/api/mappers/order_row_spec.rb +9 -2
  81. data/spec/fortnox/api/mappers/order_spec.rb +4 -1
  82. data/spec/fortnox/api/mappers/project_spec.rb +3 -1
  83. data/spec/fortnox/api/mappers/terms_of_payments_spec.rb +16 -0
  84. data/spec/fortnox/api/mappers/unit_spec.rb +57 -0
  85. data/spec/fortnox/api/models/article_spec.rb +2 -0
  86. data/spec/fortnox/api/models/base_spec.rb +46 -38
  87. data/spec/fortnox/api/models/customer_spec.rb +2 -0
  88. data/spec/fortnox/api/models/examples/document_base.rb +5 -3
  89. data/spec/fortnox/api/models/examples/model.rb +12 -9
  90. data/spec/fortnox/api/models/invoice_spec.rb +2 -0
  91. data/spec/fortnox/api/models/order_spec.rb +2 -0
  92. data/spec/fortnox/api/models/project_spec.rb +2 -0
  93. data/spec/fortnox/api/models/terms_of_payments_spec.rb +9 -0
  94. data/spec/fortnox/api/models/unit_spec.rb +31 -0
  95. data/spec/fortnox/api/repositories/article_spec.rb +7 -5
  96. data/spec/fortnox/api/repositories/base_spec.rb +121 -100
  97. data/spec/fortnox/api/repositories/customer_spec.rb +7 -5
  98. data/spec/fortnox/api/repositories/examples/all.rb +5 -4
  99. data/spec/fortnox/api/repositories/examples/find.rb +50 -41
  100. data/spec/fortnox/api/repositories/examples/only.rb +14 -13
  101. data/spec/fortnox/api/repositories/examples/save.rb +23 -29
  102. data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +11 -11
  103. data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +11 -10
  104. data/spec/fortnox/api/repositories/examples/search.rb +15 -15
  105. data/spec/fortnox/api/repositories/invoice_spec.rb +8 -6
  106. data/spec/fortnox/api/repositories/order_spec.rb +8 -6
  107. data/spec/fortnox/api/repositories/project_spec.rb +7 -5
  108. data/spec/fortnox/api/repositories/terms_of_payments_spec.rb +30 -0
  109. data/spec/fortnox/api/repositories/unit_spec.rb +34 -0
  110. data/spec/fortnox/api/types/account_number_spec.rb +12 -9
  111. data/spec/fortnox/api/types/default_delivery_types_spec.rb +6 -4
  112. data/spec/fortnox/api/types/edi_information_spec.rb +9 -7
  113. data/spec/fortnox/api/types/email_information_spec.rb +8 -6
  114. data/spec/fortnox/api/types/email_spec.rb +27 -14
  115. data/spec/fortnox/api/types/enums_spec.rb +3 -1
  116. data/spec/fortnox/api/types/examples/document_row.rb +10 -8
  117. data/spec/fortnox/api/types/examples/enum.rb +29 -22
  118. data/spec/fortnox/api/types/examples/types.rb +8 -4
  119. data/spec/fortnox/api/types/housework_types_spec.rb +68 -0
  120. data/spec/fortnox/api/types/invoice_row_spec.rb +3 -1
  121. data/spec/fortnox/api/types/model_spec.rb +12 -9
  122. data/spec/fortnox/api/types/nullable_spec.rb +8 -6
  123. data/spec/fortnox/api/types/order_row_spec.rb +4 -2
  124. data/spec/fortnox/api/types/required_spec.rb +4 -2
  125. data/spec/fortnox/api/types/sized_spec.rb +18 -16
  126. data/spec/fortnox/api_spec.rb +45 -43
  127. data/spec/spec_helper.rb +9 -6
  128. data/spec/support/helpers.rb +3 -1
  129. data/spec/support/helpers/configuration_helper.rb +2 -0
  130. data/spec/support/helpers/dummy_class_helper.rb +7 -8
  131. data/spec/support/helpers/repository_helper.rb +2 -0
  132. data/spec/support/helpers/when_performing_helper.rb +3 -1
  133. data/spec/support/matchers.rb +2 -0
  134. data/spec/support/matchers/type.rb +3 -1
  135. data/spec/support/matchers/type/attribute_matcher.rb +15 -14
  136. data/spec/support/matchers/type/enum_matcher.rb +9 -7
  137. data/spec/support/matchers/type/have_account_number_matcher.rb +11 -9
  138. data/spec/support/matchers/type/have_country_code_matcher.rb +6 -4
  139. data/spec/support/matchers/type/have_currency_matcher.rb +4 -2
  140. data/spec/support/matchers/type/have_customer_type_matcher.rb +6 -4
  141. data/spec/support/matchers/type/have_default_delivery_type_matcher.rb +4 -2
  142. data/spec/support/matchers/type/have_discount_type_matcher.rb +4 -2
  143. data/spec/support/matchers/type/have_email_matcher.rb +11 -9
  144. data/spec/support/matchers/type/have_housework_type_matcher.rb +9 -0
  145. data/spec/support/matchers/type/have_nullable_date_matcher.rb +29 -29
  146. data/spec/support/matchers/type/have_nullable_matcher.rb +23 -21
  147. data/spec/support/matchers/type/have_nullable_string_matcher.rb +30 -32
  148. data/spec/support/matchers/type/have_sized_float_matcher.rb +4 -2
  149. data/spec/support/matchers/type/have_sized_integer_matcher.rb +4 -2
  150. data/spec/support/matchers/type/have_sized_string_matcher.rb +16 -15
  151. data/spec/support/matchers/type/have_vat_type_matcher.rb +4 -2
  152. data/spec/support/matchers/type/numeric_matcher.rb +25 -23
  153. data/spec/support/matchers/type/require_attribute_matcher.rb +36 -37
  154. data/spec/support/matchers/type/type_matcher.rb +18 -16
  155. data/spec/support/vcr_setup.rb +2 -0
  156. data/spec/vcr_cassettes/orders/{house_work_type_babysitting.yml → housework_type_babysitting.yml} +9 -10
  157. data/spec/vcr_cassettes/orders/{house_work_type_cleaning.yml → housework_type_cleaning.yml} +9 -10
  158. data/spec/vcr_cassettes/orders/{house_work_type_construction.yml → housework_type_construction.yml} +9 -10
  159. data/spec/vcr_cassettes/orders/{house_work_type_cooking.yml → housework_type_cooking.yml} +7 -7
  160. data/spec/vcr_cassettes/orders/{house_work_type_electricity.yml → housework_type_electricity.yml} +9 -10
  161. data/spec/vcr_cassettes/orders/{house_work_type_gardening.yml → housework_type_gardening.yml} +9 -10
  162. data/spec/vcr_cassettes/orders/{house_work_type_glassmetalwork.yml → housework_type_glassmetalwork.yml} +9 -10
  163. data/spec/vcr_cassettes/orders/{house_work_type_grounddrainagework.yml → housework_type_grounddrainagework.yml} +9 -10
  164. data/spec/vcr_cassettes/orders/{house_work_type_hvac.yml → housework_type_hvac.yml} +9 -10
  165. data/spec/vcr_cassettes/orders/{house_work_type_masonry.yml → housework_type_masonry.yml} +9 -10
  166. data/spec/vcr_cassettes/orders/{house_work_type_othercare.yml → housework_type_othercare.yml} +9 -10
  167. data/spec/vcr_cassettes/orders/{house_work_type_othercosts.yml → housework_type_othercosts.yml} +9 -10
  168. data/spec/vcr_cassettes/orders/{house_work_type_paintingwallpapering.yml → housework_type_paintingwallpapering.yml} +9 -10
  169. data/spec/vcr_cassettes/orders/{house_work_type_snowplowing.yml → housework_type_snowplowing.yml} +9 -10
  170. data/spec/vcr_cassettes/orders/{house_work_type_textileclothing.yml → housework_type_textileclothing.yml} +9 -10
  171. data/spec/vcr_cassettes/orders/{house_work_type_tutoring.yml → housework_type_tutoring.yml} +7 -7
  172. data/spec/vcr_cassettes/termsofpayments/all.yml +51 -0
  173. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +45 -0
  174. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +46 -0
  175. data/spec/vcr_cassettes/termsofpayments/find_new.yml +46 -0
  176. data/spec/vcr_cassettes/termsofpayments/save_new.yml +45 -0
  177. data/spec/vcr_cassettes/termsofpayments/save_old.yml +46 -0
  178. data/spec/vcr_cassettes/units/all.yml +48 -0
  179. data/spec/vcr_cassettes/units/find_failure.yml +45 -0
  180. data/spec/vcr_cassettes/units/find_id_1.yml +46 -0
  181. data/spec/vcr_cassettes/units/find_new.yml +48 -0
  182. data/spec/vcr_cassettes/units/save_new.yml +47 -0
  183. data/spec/vcr_cassettes/units/save_old.yml +48 -0
  184. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +47 -0
  185. metadata +127 -88
  186. data/docs/account.rb +0 -59
  187. data/docs/extraction_script.js +0 -23
  188. data/docs/generation_script.rb +0 -43
  189. data/docs/json/account.json +0 -77
  190. data/lib/fortnox/api/models/document_base.rb +0 -189
  191. data/spec/fortnox/api/types/house_work_types_spec.rb +0 -64
  192. data/spec/support/matchers/type/have_house_work_type_matcher.rb +0 -7
@@ -1,86 +1,86 @@
1
- require "fortnox/api/models/base"
2
- require "fortnox/api/models/document_base"
1
+ # frozen_string_literal: true
2
+
3
+ require 'fortnox/api/models/base'
4
+ require 'fortnox/api/models/document'
3
5
 
4
6
  module Fortnox
5
7
  module API
6
8
  module Model
7
- class Invoice < Fortnox::API::Model::Base
9
+ class Invoice < Document
8
10
  UNIQUE_ID = :document_number
9
11
  STUB = { customer_number: '' }.freeze
10
12
 
11
- DocumentBase.ify( self )
12
-
13
- #UrlTaxReductionList Direct url to the tax reduction for the invoice.
14
- attribute :url_tax_reduction_list, Types::Nullable::String.with( read_only: true )
13
+ # UrlTaxReductionList Direct url to the tax reduction for the invoice.
14
+ attribute :url_tax_reduction_list, Types::Nullable::String.is(:read_only)
15
15
 
16
- #AccountingMethod Accounting Method.
16
+ # AccountingMethod Accounting Method.
17
17
  attribute :accounting_method, Types::Nullable::String
18
18
 
19
- #Balance Balance of the invoice.
20
- attribute :balance, Types::Nullable::Float.with( read_only: true )
19
+ # Balance Balance of the invoice.
20
+ attribute :balance, Types::Nullable::Float.is(:read_only)
21
21
 
22
- #Booked If the invoice is bookkept.
23
- attribute :booked, Types::Nullable::Boolean.with( read_only: true )
22
+ # Booked If the invoice is bookkept.
23
+ attribute :booked, Types::Nullable::Boolean.is(:read_only)
24
24
 
25
- #Credit If the invoice is a credit invoice.
26
- attribute :credit, Types::Nullable::Boolean.with( read_only: true )
25
+ # Credit If the invoice is a credit invoice.
26
+ attribute :credit, Types::Nullable::Boolean.is(:read_only)
27
27
 
28
- #CreditInvoiceReference Reference to the credit invoice, if one exits.
28
+ # CreditInvoiceReference Reference to the credit invoice, if one exits.
29
29
  attribute :credit_invoice_reference, Types::Nullable::Integer
30
30
 
31
- #ContractReference Reference to the contract, if one exists.
32
- attribute :contract_reference, Types::Nullable::Integer.with( read_only: true )
31
+ # ContractReference Reference to the contract, if one exists.
32
+ attribute :contract_reference, Types::Nullable::Integer.is(:read_only)
33
33
 
34
- #DueDate Due date of the invoice.
34
+ # DueDate Due date of the invoice.
35
35
  attribute :due_date, Types::Nullable::Date
36
36
 
37
- #EDIInformation Separate EDIInformation object
37
+ # EDIInformation Separate EDIInformation object
38
38
  attribute :edi_information, Types::EDIInformation
39
39
 
40
- #EUQuarterlyReport EU Quarterly Report On / Off
40
+ # EUQuarterlyReport EU Quarterly Report On / Off
41
41
  attribute :eu_quarterly_report, Types::Nullable::Boolean
42
42
 
43
- #InvoiceDate Invoice date.
43
+ # InvoiceDate Invoice date.
44
44
  attribute :invoice_date, Types::Nullable::Date
45
45
 
46
- #InvoicePeriodStart Start date of the invoice period.
47
- attribute :invoice_period_start, Types::Nullable::Date.with( read_only: true )
46
+ # InvoicePeriodStart Start date of the invoice period.
47
+ attribute :invoice_period_start, Types::Nullable::Date.is(:read_only)
48
48
 
49
- #InvoicePeriodEnd End date of the invoice period.
50
- attribute :invoice_period_end, Types::Nullable::Date.with( read_only: true )
49
+ # InvoicePeriodEnd End date of the invoice period.
50
+ attribute :invoice_period_end, Types::Nullable::Date.is(:read_only)
51
51
 
52
- #InvoiceRows Separate object
53
- attribute :invoice_rows, Types::Strict::Array.member( Types::InvoiceRow )
52
+ # InvoiceRows Separate object
53
+ attribute :invoice_rows, Types::Strict::Array.member(Types::InvoiceRow)
54
54
 
55
- #InvoiceType The type of invoice.
55
+ # InvoiceType The type of invoice.
56
56
  attribute :invoice_type, Types::Nullable::String
57
57
 
58
- #Language Language code.
58
+ # Language Language code.
59
59
  attribute :language, Types::Nullable::String
60
60
 
61
- #LastRemindDate Date of last reminder.
62
- attribute :last_remind_date, Types::Nullable::Date.with( read_only: true )
61
+ # LastRemindDate Date of last reminder.
62
+ attribute :last_remind_date, Types::Nullable::Date.is(:read_only)
63
63
 
64
- #NoxFinans If the invoice is managed by NoxFinans
65
- attribute :nox_finans, Types::Nullable::Boolean.with( read_only: true )
64
+ # NoxFinans If the invoice is managed by NoxFinans
65
+ attribute :nox_finans, Types::Nullable::Boolean.is(:read_only)
66
66
 
67
- #OCR OCR number of the invoice.
67
+ # OCR OCR number of the invoice.
68
68
  attribute :ocr, Types::Nullable::String
69
69
 
70
- #OrderReference Reference to the order, if one exists.
71
- attribute :order_reference, Types::Nullable::Integer.with( read_only: true )
70
+ # OrderReference Reference to the order, if one exists.
71
+ attribute :order_reference, Types::Nullable::Integer.is(:read_only)
72
72
 
73
- #Reminders Number of reminders sent to the customer.
74
- attribute :reminders, Types::Nullable::Integer.with( read_only: true )
73
+ # Reminders Number of reminders sent to the customer.
74
+ attribute :reminders, Types::Nullable::Integer.is(:read_only)
75
75
 
76
- #VoucherNumber Voucher number for the invoice.
77
- attribute :voucher_number, Types::Nullable::Integer.with( read_only: true )
76
+ # VoucherNumber Voucher number for the invoice.
77
+ attribute :voucher_number, Types::Nullable::Integer.is(:read_only)
78
78
 
79
- #VoucherSeries Voucher series for the invoice.
80
- attribute :voucher_series, Types::Nullable::String.with( read_only: true )
79
+ # VoucherSeries Voucher series for the invoice.
80
+ attribute :voucher_series, Types::Nullable::String.is(:read_only)
81
81
 
82
- #VoucherYear Voucher year for the invoice.
83
- attribute :voucher_year, Types::Nullable::Integer.with( read_only: true )
82
+ # VoucherYear Voucher year for the invoice.
83
+ attribute :voucher_year, Types::Nullable::Integer.is(:read_only)
84
84
  end
85
85
  end
86
86
  end
@@ -1,4 +1,6 @@
1
- require "fortnox/api/types"
1
+ # frozen_string_literal: true
2
+
3
+ require 'fortnox/api/types'
2
4
 
3
5
  module Fortnox
4
6
  module API
@@ -7,10 +9,10 @@ module Fortnox
7
9
  STUB = {}.freeze
8
10
 
9
11
  # Id integer, read-only. The ID of the label.
10
- attribute :id, Types::Required::Integer.with( read_only: true )
12
+ attribute :id, Types::Required::Integer.is(:read_only)
11
13
 
12
14
  # Description string, 25 characters, required. Description of the label
13
- attribute :description, Types::Sized::String[ 25 ].with( read_only: true )
15
+ attribute :description, Types::Sized::String[25].is(:read_only)
14
16
  end
15
17
  end
16
18
  end
@@ -1,26 +1,26 @@
1
- require "fortnox/api/models/base"
2
- require "fortnox/api/models/document_base"
1
+ # frozen_string_literal: true
2
+
3
+ require 'fortnox/api/models/base'
4
+ require 'fortnox/api/models/document'
3
5
 
4
6
  module Fortnox
5
7
  module API
6
8
  module Model
7
- class Order < Fortnox::API::Model::Base
9
+ class Order < Document
8
10
  UNIQUE_ID = :document_number
9
11
  STUB = { customer_number: '', order_rows: [] }.freeze
10
12
 
11
- DocumentBase.ify( self )
12
-
13
- #CopyRemarks I remarks shall copies from order to invoice
13
+ # CopyRemarks I remarks shall copies from order to invoice
14
14
  attribute :copy_remarks, Types::Nullable::Boolean
15
15
 
16
16
  # InvoiceReference Reference if an invoice is created from order
17
- attribute :invoice_reference, Types::Nullable::Integer.with( read_only: true )
17
+ attribute :invoice_reference, Types::Nullable::Integer.is(:read_only)
18
18
 
19
19
  # OrderDate Date of order
20
20
  attribute :order_date, Types::Nullable::Date
21
21
 
22
22
  # OrderRows Separate object
23
- attribute :order_rows, Types::Strict::Array.member( Types::OrderRow )
23
+ attribute :order_rows, Types::Strict::Array.member(Types::OrderRow)
24
24
  end
25
25
  end
26
26
  end
@@ -1,5 +1,7 @@
1
- require "fortnox/api/types"
2
- require "fortnox/api/models/base"
1
+ # frozen_string_literal: true
2
+
3
+ require 'fortnox/api/types'
4
+ require 'fortnox/api/models/base'
3
5
 
4
6
  module Fortnox
5
7
  module API
@@ -9,25 +11,25 @@ module Fortnox
9
11
  STUB = { description: '' }.freeze
10
12
 
11
13
  # Url Direct URL to the record
12
- attribute :url, Types::Nullable::String.with( read_only: true )
14
+ attribute :url, Types::Nullable::String.is(:read_only)
13
15
 
14
16
  # Comments Comments on project. 512 characters
15
- attribute :comments, Types::Sized::String[ 512 ]
17
+ attribute :comments, Types::Sized::String[512]
16
18
 
17
19
  # ContactPerson ContactPerson for project. 50 characters
18
- attribute :contact_person, Types::Sized::String[ 50 ]
20
+ attribute :contact_person, Types::Sized::String[50]
19
21
 
20
22
  # Description Description of the project. 50 characters
21
- attribute :description, Types::Sized::String[ 50 ]
23
+ attribute :description, Types::Sized::String[50]
22
24
 
23
25
  # EndDate End date of the project.
24
26
  attribute :end_date, Types::Nullable::Date
25
27
 
26
28
  # ProjectLeader Projectleader. 50 characters
27
- attribute :project_leader, Types::Sized::String[ 50 ]
29
+ attribute :project_leader, Types::Sized::String[50]
28
30
 
29
31
  # ProjectNumber Projectnumber. 20 characters
30
- attribute :project_number, Types::Sized::String[ 20 ]
32
+ attribute :project_number, Types::Sized::String[20]
31
33
 
32
34
  # Status Status of the project
33
35
  attribute :status, Types::ProjectStatusType
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fortnox/api/types'
4
+ require 'fortnox/api/models/base'
5
+
6
+ module Fortnox
7
+ module API
8
+ module Model
9
+ class TermsOfPayments < Fortnox::API::Model::Base
10
+ UNIQUE_ID = :code
11
+ STUB = { code: '', description: '' }.freeze
12
+
13
+ # Direct URL to the record
14
+ attribute :url, Types::Nullable::String.with(read_only: true)
15
+
16
+ # The code of the term of payment. Sortable
17
+ # TODO: Only writable during POST.
18
+ # TODO: Must be alphanumeric
19
+ # TODO: 30days is a valid value, but the API rewrites it as 30DAYS
20
+ # and you will not find the resource with a GET with value '30days'
21
+ attribute :code, Types::Required::String
22
+
23
+ # The description of the term of payment
24
+ attribute :description, Types::Required::String
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fortnox/api/types'
4
+ require 'fortnox/api/models/base'
5
+
6
+ module Fortnox
7
+ module API
8
+ module Model
9
+ class Unit < Fortnox::API::Model::Base
10
+ UNIQUE_ID = :code
11
+ STUB = { code: '' }.freeze
12
+
13
+ # Url Direct URL to the record
14
+ attribute :url, Types::Nullable::String.is(:read_only)
15
+
16
+ # Comments Comments on project. 512 characters
17
+ attribute :code, Types::Required::String.is(:read_only)
18
+
19
+ # ContactPerson ContactPerson for project. 50 characters
20
+ attribute :description, Types::Nullable::String
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,5 +1,9 @@
1
- require "fortnox/api/repositories/article"
2
- require "fortnox/api/repositories/customer"
3
- require "fortnox/api/repositories/invoice"
4
- require "fortnox/api/repositories/order"
5
- require "fortnox/api/repositories/project"
1
+ # frozen_string_literal: true
2
+
3
+ require 'fortnox/api/repositories/article'
4
+ require 'fortnox/api/repositories/customer'
5
+ require 'fortnox/api/repositories/invoice'
6
+ require 'fortnox/api/repositories/order'
7
+ require 'fortnox/api/repositories/project'
8
+ require 'fortnox/api/repositories/unit'
9
+ require 'fortnox/api/repositories/terms_of_payments'
@@ -1,6 +1,8 @@
1
- require "fortnox/api/repositories/base"
2
- require "fortnox/api/models/article"
3
- require "fortnox/api/mappers/article"
1
+ # frozen_string_literal: true
2
+
3
+ require 'fortnox/api/repositories/base'
4
+ require 'fortnox/api/models/article'
5
+ require 'fortnox/api/mappers/article'
4
6
 
5
7
  module Fortnox
6
8
  module API
@@ -8,7 +10,7 @@ module Fortnox
8
10
  class Article < Base
9
11
  MODEL = Model::Article
10
12
  MAPPER = Mapper::Article
11
- URI = '/articles/'.freeze
13
+ URI = '/articles/'
12
14
  end
13
15
  end
14
16
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'httparty'
2
4
  require 'fortnox/api/request_handling'
3
- require "fortnox/api/repositories/base/loaders"
4
- require "fortnox/api/repositories/base/savers"
5
+ require 'fortnox/api/repositories/base/loaders'
6
+ require 'fortnox/api/repositories/base/savers'
5
7
 
6
8
  module Fortnox
7
9
  module API
@@ -12,93 +14,94 @@ module Fortnox
12
14
  include Loaders
13
15
  include Savers
14
16
 
15
- HTTParty::Parser::SupportedFormats[ "text/html" ] = :json
17
+ HTTParty::Parser::SupportedFormats['text/html'] = :json
16
18
 
17
19
  DEFAULT_HEADERS = {
18
20
  'Content-Type' => 'application/json',
19
- 'Accept' => 'application/json',
21
+ 'Accept' => 'application/json'
20
22
  }.freeze
21
23
 
22
- HTTP_METHODS = [ :get, :put, :post, :delete ].freeze
24
+ HTTP_METHODS = %i[get put post delete].freeze
23
25
 
24
26
  attr_accessor :headers
25
27
  attr_reader :mapper, :keys_filtered_on_save
26
28
 
27
- def self.set_headers( headers = {} )
28
- self.headers.merge!( headers )
29
+ def self.set_headers(headers = {}) # rubocop:disable Naming/AccessorMethodName
30
+ self.headers.merge!(headers)
29
31
  end
30
32
 
31
33
  HTTP_METHODS.each do |method|
32
34
  define_method method do |*args|
33
- self.headers['Access-Token'] = next_access_token
35
+ headers['Access-Token'] = next_access_token
34
36
  execute do |remote|
35
- remote.send( method, *args )
37
+ remote.send(method, *args)
36
38
  end
37
39
  end
38
40
  end
39
41
 
40
- def initialize( keys_filtered_on_save: [ :url ], token_store: :default )
41
- self.class.base_uri( get_base_url )
42
+ def initialize(keys_filtered_on_save: [:url], token_store: :default)
43
+ self.class.base_uri(base_url)
42
44
 
43
- self.headers = DEFAULT_HEADERS.merge({
44
- 'Client-Secret' => get_client_secret,
45
- })
45
+ self.headers = DEFAULT_HEADERS.merge(
46
+ 'Client-Secret' => client_secret
47
+ )
46
48
 
47
49
  @keys_filtered_on_save = keys_filtered_on_save
48
50
  @token_store = token_store
49
- @mapper = Registry[ Mapper::Base.canonical_name_sym( self.class::MODEL )].new
51
+ @mapper = Registry[Mapper::Base.canonical_name_sym(self.class::MODEL)].new
50
52
  end
51
53
 
52
54
  def next_access_token
53
- @access_tokens ||= CircularQueue.new( *get_access_tokens )
55
+ @access_tokens ||= CircularQueue.new(*access_tokens)
54
56
  @access_tokens.next
55
57
  end
56
58
 
57
- def check_access_tokens!( tokens )
58
- if tokens == nil or tokens.empty?
59
- fail MissingConfiguration, "You have not provided any access tokens in token store #{ @token_store.inspect }."
60
- end
59
+ def check_access_tokens!(tokens)
60
+ tokens_present = !(tokens.nil? || tokens.empty?)
61
+ return if tokens_present
62
+ error_message = "You have not provided any access tokens in token store #{@token_store.inspect}."
63
+ raise MissingConfiguration, error_message
61
64
  end
62
65
 
63
- def get_access_tokens
66
+ def access_tokens
64
67
  begin
65
- tokens = config.token_store.fetch( @token_store )
68
+ tokens = config.token_store.fetch(@token_store)
66
69
  rescue KeyError
67
- token_store_not_found!( @token_store.inspect )
70
+ token_store_not_found!(@token_store.inspect)
68
71
  end
69
72
 
70
- check_access_tokens!( tokens )
73
+ check_access_tokens!(tokens)
71
74
  tokens
72
75
  end
73
76
 
74
77
  private
75
78
 
76
- def instantiate( hash )
77
- hash[ :new ] = false
78
- hash[ :unsaved ] = false
79
- self.class::MODEL.new( hash )
80
- end
79
+ def instantiate(hash)
80
+ hash[:new] = false
81
+ hash[:unsaved] = false
82
+ self.class::MODEL.new(hash)
83
+ end
81
84
 
82
- def get_base_url
83
- base_url = config.base_url
84
- fail MissingConfiguration, 'You have to provide a base url.' unless base_url
85
- base_url
86
- end
85
+ def base_url
86
+ base_url = config.base_url
87
+ raise MissingConfiguration, 'You have to provide a base url.' unless base_url
88
+ base_url
89
+ end
87
90
 
88
- def get_client_secret
89
- client_secret = config.client_secret
90
- fail MissingConfiguration, 'You have to provide your client secret.' unless client_secret
91
- client_secret
92
- end
91
+ def client_secret
92
+ client_secret = config.client_secret
93
+ raise MissingConfiguration, 'You have to provide your client secret.' unless client_secret
94
+ client_secret
95
+ end
93
96
 
94
- def config
95
- Fortnox::API.config
96
- end
97
+ def config
98
+ Fortnox::API.config
99
+ end
97
100
 
98
- def token_store_not_found!( store_name )
99
- fail MissingConfiguration,
100
- "There is no token store named #{ store_name }."
101
- end
101
+ def token_store_not_found!(store_name)
102
+ raise MissingConfiguration,
103
+ "There is no token store named #{store_name}. Available stores are #{config.token_store.keys}."
104
+ end
102
105
  end
103
106
  end
104
107
  end