fortnox-api 0.9.2 → 1.0.0.rc2

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 (344) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +120 -95
  3. data/{LICENSE.txt → LICENSE.md} +0 -0
  4. data/README.md +245 -248
  5. data/bin/fortnox-setup +211 -0
  6. data/bin/fortnox-update-env +38 -0
  7. data/fortnox.gemspec +29 -0
  8. data/lib/fortnox/auth/thread_local.rb +28 -0
  9. data/lib/fortnox/collection.rb +23 -0
  10. data/lib/fortnox/mappers/country_code.rb +34 -0
  11. data/lib/fortnox/mappers/date.rb +21 -0
  12. data/lib/fortnox/mappers/document_row.rb +12 -0
  13. data/lib/fortnox/mappers/edi_information.rb +15 -0
  14. data/lib/fortnox/mappers/email_information.rb +11 -0
  15. data/lib/fortnox/mappers/invoice_row.rb +14 -0
  16. data/lib/fortnox/mappers/label_references.rb +24 -0
  17. data/lib/fortnox/mappers/order_row.rb +9 -0
  18. data/lib/fortnox/mappers/struct.rb +71 -0
  19. data/lib/fortnox/mappers/struct_array.rb +31 -0
  20. data/lib/fortnox/resource.rb +131 -0
  21. data/lib/fortnox/resources/article.rb +160 -0
  22. data/lib/fortnox/resources/customer.rb +209 -0
  23. data/lib/fortnox/resources/document.rb +202 -0
  24. data/lib/fortnox/resources/invoice.rb +92 -0
  25. data/lib/fortnox/resources/label.rb +15 -0
  26. data/lib/fortnox/resources/order.rb +38 -0
  27. data/lib/fortnox/resources/project.rb +41 -0
  28. data/lib/fortnox/resources/terms_of_payment.rb +23 -0
  29. data/lib/fortnox/resources/unit.rb +26 -0
  30. data/lib/fortnox/struct.rb +24 -0
  31. data/lib/fortnox/structs/default_delivery_types.rb +16 -0
  32. data/lib/fortnox/structs/default_templates.rb +19 -0
  33. data/lib/fortnox/structs/document_row.rb +62 -0
  34. data/lib/fortnox/structs/edi_information.rb +25 -0
  35. data/lib/fortnox/structs/email_information.rb +22 -0
  36. data/lib/fortnox/structs/invoice_row.rb +13 -0
  37. data/lib/fortnox/structs/order_row.rb +10 -0
  38. data/lib/fortnox/types.rb +129 -0
  39. data/lib/fortnox/{api/version.rb → version.rb} +1 -3
  40. data/lib/fortnox.rb +111 -0
  41. metadata +55 -580
  42. data/.codeclimate.yml +0 -20
  43. data/.env.template +0 -7
  44. data/.env.test +0 -11
  45. data/.gitignore +0 -20
  46. data/.rspec +0 -2
  47. data/.rubocop.yml +0 -41
  48. data/.tool-versions +0 -1
  49. data/.travis.yml +0 -32
  50. data/CLAUDE.md +0 -79
  51. data/CONTRIBUTE.md +0 -38
  52. data/DEVELOPER_README.md +0 -69
  53. data/Gemfile +0 -6
  54. data/Guardfile +0 -16
  55. data/Rakefile +0 -140
  56. data/bin/console +0 -22
  57. data/bin/fortnox +0 -285
  58. data/bin/get_tokens +0 -79
  59. data/bin/renew_tokens +0 -28
  60. data/docs/gotchas.md +0 -146
  61. data/fortnox-api.gemspec +0 -50
  62. data/lib/fortnox/api/mappers/article.rb +0 -23
  63. data/lib/fortnox/api/mappers/base/canonical_name_sym.rb +0 -21
  64. data/lib/fortnox/api/mappers/base/from_json.rb +0 -91
  65. data/lib/fortnox/api/mappers/base/to_json.rb +0 -66
  66. data/lib/fortnox/api/mappers/base.rb +0 -30
  67. data/lib/fortnox/api/mappers/customer.rb +0 -27
  68. data/lib/fortnox/api/mappers/default_delivery_types.rb +0 -15
  69. data/lib/fortnox/api/mappers/default_templates.rb +0 -16
  70. data/lib/fortnox/api/mappers/edi_information.rb +0 -23
  71. data/lib/fortnox/api/mappers/email_information.rb +0 -19
  72. data/lib/fortnox/api/mappers/invoice.rb +0 -29
  73. data/lib/fortnox/api/mappers/invoice_row.rb +0 -25
  74. data/lib/fortnox/api/mappers/order.rb +0 -26
  75. data/lib/fortnox/api/mappers/order_row.rb +0 -23
  76. data/lib/fortnox/api/mappers/project.rb +0 -17
  77. data/lib/fortnox/api/mappers/terms_of_payment.rb +0 -17
  78. data/lib/fortnox/api/mappers/unit.rb +0 -17
  79. data/lib/fortnox/api/mappers/value/array.rb +0 -18
  80. data/lib/fortnox/api/mappers/value/country_string.rb +0 -24
  81. data/lib/fortnox/api/mappers/value/date.rb +0 -11
  82. data/lib/fortnox/api/mappers/value/hash.rb +0 -16
  83. data/lib/fortnox/api/mappers/value/identity.rb +0 -18
  84. data/lib/fortnox/api/mappers.rb +0 -21
  85. data/lib/fortnox/api/models/article.rb +0 -134
  86. data/lib/fortnox/api/models/base.rb +0 -128
  87. data/lib/fortnox/api/models/customer.rb +0 -210
  88. data/lib/fortnox/api/models/document.rb +0 -189
  89. data/lib/fortnox/api/models/invoice.rb +0 -87
  90. data/lib/fortnox/api/models/label.rb +0 -19
  91. data/lib/fortnox/api/models/order.rb +0 -27
  92. data/lib/fortnox/api/models/project.rb +0 -42
  93. data/lib/fortnox/api/models/terms_of_payment.rb +0 -28
  94. data/lib/fortnox/api/models/unit.rb +0 -24
  95. data/lib/fortnox/api/models.rb +0 -9
  96. data/lib/fortnox/api/repositories/article.rb +0 -17
  97. data/lib/fortnox/api/repositories/authentication.rb +0 -61
  98. data/lib/fortnox/api/repositories/base/loaders.rb +0 -64
  99. data/lib/fortnox/api/repositories/base/savers.rb +0 -57
  100. data/lib/fortnox/api/repositories/base.rb +0 -93
  101. data/lib/fortnox/api/repositories/customer.rb +0 -17
  102. data/lib/fortnox/api/repositories/invoice.rb +0 -17
  103. data/lib/fortnox/api/repositories/order.rb +0 -17
  104. data/lib/fortnox/api/repositories/project.rb +0 -17
  105. data/lib/fortnox/api/repositories/terms_of_payment.rb +0 -17
  106. data/lib/fortnox/api/repositories/unit.rb +0 -17
  107. data/lib/fortnox/api/repositories.rb +0 -10
  108. data/lib/fortnox/api/request_handling.rb +0 -46
  109. data/lib/fortnox/api/types/default_delivery_types.rb +0 -20
  110. data/lib/fortnox/api/types/default_templates.rb +0 -23
  111. data/lib/fortnox/api/types/defaulted.rb +0 -11
  112. data/lib/fortnox/api/types/document_row.rb +0 -64
  113. data/lib/fortnox/api/types/edi_information.rb +0 -29
  114. data/lib/fortnox/api/types/email_information.rb +0 -26
  115. data/lib/fortnox/api/types/enums.rb +0 -116
  116. data/lib/fortnox/api/types/invoice_row.rb +0 -19
  117. data/lib/fortnox/api/types/model.rb +0 -37
  118. data/lib/fortnox/api/types/nullable.rb +0 -25
  119. data/lib/fortnox/api/types/order_row.rb +0 -16
  120. data/lib/fortnox/api/types/required.rb +0 -13
  121. data/lib/fortnox/api/types/shim/country_string.rb +0 -10
  122. data/lib/fortnox/api/types/sized.rb +0 -33
  123. data/lib/fortnox/api/types.rb +0 -144
  124. data/lib/fortnox/api.rb +0 -62
  125. data/spec/fortnox/api/mappers/article_spec.rb +0 -17
  126. data/spec/fortnox/api/mappers/base/canonical_name_sym_spec.rb +0 -36
  127. data/spec/fortnox/api/mappers/base/from_json_spec.rb +0 -70
  128. data/spec/fortnox/api/mappers/base/to_json_spec.rb +0 -68
  129. data/spec/fortnox/api/mappers/base_spec.rb +0 -154
  130. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +0 -62
  131. data/spec/fortnox/api/mappers/customer_spec.rb +0 -27
  132. data/spec/fortnox/api/mappers/default_delivery_types_spec.rb +0 -14
  133. data/spec/fortnox/api/mappers/edi_information_spec.rb +0 -23
  134. data/spec/fortnox/api/mappers/email_information_spec.rb +0 -19
  135. data/spec/fortnox/api/mappers/examples/mapper.rb +0 -34
  136. data/spec/fortnox/api/mappers/invoice_row_spec.rb +0 -24
  137. data/spec/fortnox/api/mappers/invoice_spec.rb +0 -27
  138. data/spec/fortnox/api/mappers/order_row_spec.rb +0 -21
  139. data/spec/fortnox/api/mappers/order_spec.rb +0 -23
  140. data/spec/fortnox/api/mappers/project_spec.rb +0 -12
  141. data/spec/fortnox/api/mappers/terms_of_payment_spec.rb +0 -16
  142. data/spec/fortnox/api/mappers/unit_spec.rb +0 -56
  143. data/spec/fortnox/api/models/article_spec.rb +0 -9
  144. data/spec/fortnox/api/models/base_spec.rb +0 -117
  145. data/spec/fortnox/api/models/customer_spec.rb +0 -9
  146. data/spec/fortnox/api/models/examples/document_base.rb +0 -15
  147. data/spec/fortnox/api/models/examples/model.rb +0 -22
  148. data/spec/fortnox/api/models/invoice_spec.rb +0 -11
  149. data/spec/fortnox/api/models/order_spec.rb +0 -12
  150. data/spec/fortnox/api/models/project_spec.rb +0 -9
  151. data/spec/fortnox/api/models/terms_of_payment_spec.rb +0 -9
  152. data/spec/fortnox/api/models/unit_spec.rb +0 -33
  153. data/spec/fortnox/api/repositories/article_spec.rb +0 -80
  154. data/spec/fortnox/api/repositories/authentication_spec.rb +0 -103
  155. data/spec/fortnox/api/repositories/base_spec.rb +0 -168
  156. data/spec/fortnox/api/repositories/customer_spec.rb +0 -119
  157. data/spec/fortnox/api/repositories/examples/all.rb +0 -17
  158. data/spec/fortnox/api/repositories/examples/find.rb +0 -84
  159. data/spec/fortnox/api/repositories/examples/only.rb +0 -34
  160. data/spec/fortnox/api/repositories/examples/save.rb +0 -76
  161. data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +0 -28
  162. data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +0 -26
  163. data/spec/fortnox/api/repositories/examples/search.rb +0 -39
  164. data/spec/fortnox/api/repositories/invoice_spec.rb +0 -297
  165. data/spec/fortnox/api/repositories/order_spec.rb +0 -53
  166. data/spec/fortnox/api/repositories/project_spec.rb +0 -36
  167. data/spec/fortnox/api/repositories/terms_of_payment_spec.rb +0 -34
  168. data/spec/fortnox/api/repositories/unit_spec.rb +0 -39
  169. data/spec/fortnox/api/types/account_number_spec.rb +0 -35
  170. data/spec/fortnox/api/types/country_code_spec.rb +0 -42
  171. data/spec/fortnox/api/types/country_spec.rb +0 -67
  172. data/spec/fortnox/api/types/default_delivery_types_spec.rb +0 -12
  173. data/spec/fortnox/api/types/edi_information_spec.rb +0 -15
  174. data/spec/fortnox/api/types/email_information_spec.rb +0 -15
  175. data/spec/fortnox/api/types/email_spec.rb +0 -56
  176. data/spec/fortnox/api/types/enums_spec.rb +0 -17
  177. data/spec/fortnox/api/types/examples/document_row.rb +0 -25
  178. data/spec/fortnox/api/types/examples/enum.rb +0 -55
  179. data/spec/fortnox/api/types/examples/types.rb +0 -11
  180. data/spec/fortnox/api/types/housework_types_spec.rb +0 -149
  181. data/spec/fortnox/api/types/invoice_row_spec.rb +0 -11
  182. data/spec/fortnox/api/types/model_spec.rb +0 -69
  183. data/spec/fortnox/api/types/nullable_spec.rb +0 -79
  184. data/spec/fortnox/api/types/order_row_spec.rb +0 -15
  185. data/spec/fortnox/api/types/required_spec.rb +0 -36
  186. data/spec/fortnox/api/types/sales_account_spec.rb +0 -57
  187. data/spec/fortnox/api/types/sized_spec.rb +0 -76
  188. data/spec/fortnox/api_spec.rb +0 -66
  189. data/spec/spec_helper.rb +0 -35
  190. data/spec/support/helpers/configuration_helper.rb +0 -39
  191. data/spec/support/helpers/repository_helper.rb +0 -10
  192. data/spec/support/helpers.rb +0 -3
  193. data/spec/support/matchers/type/attribute_matcher.rb +0 -40
  194. data/spec/support/matchers/type/enum_matcher.rb +0 -23
  195. data/spec/support/matchers/type/have_account_number_matcher.rb +0 -23
  196. data/spec/support/matchers/type/have_currency_matcher.rb +0 -9
  197. data/spec/support/matchers/type/have_customer_type_matcher.rb +0 -15
  198. data/spec/support/matchers/type/have_default_delivery_type_matcher.rb +0 -9
  199. data/spec/support/matchers/type/have_discount_type_matcher.rb +0 -9
  200. data/spec/support/matchers/type/have_email_matcher.rb +0 -24
  201. data/spec/support/matchers/type/have_housework_type_matcher.rb +0 -9
  202. data/spec/support/matchers/type/have_nullable_date_matcher.rb +0 -60
  203. data/spec/support/matchers/type/have_nullable_matcher.rb +0 -54
  204. data/spec/support/matchers/type/have_nullable_string_matcher.rb +0 -47
  205. data/spec/support/matchers/type/have_sized_float_matcher.rb +0 -10
  206. data/spec/support/matchers/type/have_sized_integer_matcher.rb +0 -10
  207. data/spec/support/matchers/type/have_sized_string_matcher.rb +0 -36
  208. data/spec/support/matchers/type/have_vat_type_matcher.rb +0 -9
  209. data/spec/support/matchers/type/numeric_matcher.rb +0 -52
  210. data/spec/support/matchers/type/require_attribute_matcher.rb +0 -68
  211. data/spec/support/matchers/type/type_matcher.rb +0 -40
  212. data/spec/support/matchers/type.rb +0 -19
  213. data/spec/support/matchers.rb +0 -3
  214. data/spec/support/vcr_setup.rb +0 -25
  215. data/spec/vcr_cassettes/articles/all.yml +0 -67
  216. data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +0 -62
  217. data/spec/vcr_cassettes/articles/find_failure.yml +0 -62
  218. data/spec/vcr_cassettes/articles/find_id_1.yml +0 -63
  219. data/spec/vcr_cassettes/articles/find_new.yml +0 -63
  220. data/spec/vcr_cassettes/articles/limits/quantity_in_stock_min_value.yml +0 -63
  221. data/spec/vcr_cassettes/articles/limits/quantity_in_stock_rounding_positive_value.yml +0 -63
  222. data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +0 -62
  223. data/spec/vcr_cassettes/articles/save_new.yml +0 -63
  224. data/spec/vcr_cassettes/articles/save_old.yml +0 -63
  225. data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +0 -63
  226. data/spec/vcr_cassettes/articles/search_by_name.yml +0 -65
  227. data/spec/vcr_cassettes/articles/search_miss.yml +0 -62
  228. data/spec/vcr_cassettes/articles/search_with_special_char.yml +0 -62
  229. data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +0 -62
  230. data/spec/vcr_cassettes/authentication/expired_token.yml +0 -54
  231. data/spec/vcr_cassettes/authentication/invalid_authorization.yml +0 -57
  232. data/spec/vcr_cassettes/authentication/invalid_refresh_token.yml +0 -58
  233. data/spec/vcr_cassettes/authentication/valid_request.yml +0 -63
  234. data/spec/vcr_cassettes/customers/all.yml +0 -69
  235. data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +0 -62
  236. data/spec/vcr_cassettes/customers/find_failure.yml +0 -62
  237. data/spec/vcr_cassettes/customers/find_id_1.yml +0 -64
  238. data/spec/vcr_cassettes/customers/find_new.yml +0 -63
  239. data/spec/vcr_cassettes/customers/find_with_sales_account.yml +0 -63
  240. data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +0 -63
  241. data/spec/vcr_cassettes/customers/save_new.yml +0 -63
  242. data/spec/vcr_cassettes/customers/save_new_with_country_code_SE.yml +0 -64
  243. data/spec/vcr_cassettes/customers/save_new_with_idn_email.yml +0 -67
  244. data/spec/vcr_cassettes/customers/save_new_with_sales_account.yml +0 -63
  245. data/spec/vcr_cassettes/customers/save_old.yml +0 -63
  246. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +0 -63
  247. data/spec/vcr_cassettes/customers/search_by_name.yml +0 -64
  248. data/spec/vcr_cassettes/customers/search_miss.yml +0 -62
  249. data/spec/vcr_cassettes/customers/search_with_special_char.yml +0 -62
  250. data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +0 -64
  251. data/spec/vcr_cassettes/invoices/all.yml +0 -96
  252. data/spec/vcr_cassettes/invoices/filter_hit.yml +0 -64
  253. data/spec/vcr_cassettes/invoices/filter_invalid.yml +0 -60
  254. data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +0 -62
  255. data/spec/vcr_cassettes/invoices/find_failure.yml +0 -62
  256. data/spec/vcr_cassettes/invoices/find_id_1.yml +0 -65
  257. data/spec/vcr_cassettes/invoices/find_new.yml +0 -65
  258. data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +0 -63
  259. data/spec/vcr_cassettes/invoices/row_delivered_quantity_decimals.yml +0 -65
  260. data/spec/vcr_cassettes/invoices/row_delivered_quantity_decimals_round_up.yml +0 -65
  261. data/spec/vcr_cassettes/invoices/row_description_limit.yml +0 -65
  262. data/spec/vcr_cassettes/invoices/row_price_limit.yml +0 -65
  263. data/spec/vcr_cassettes/invoices/row_price_limit_round_up.yml +0 -65
  264. data/spec/vcr_cassettes/invoices/save_new.yml +0 -65
  265. data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +0 -65
  266. data/spec/vcr_cassettes/invoices/save_new_with_country.yml +0 -65
  267. data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +0 -66
  268. data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +0 -65
  269. data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +0 -65
  270. data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +0 -65
  271. data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +0 -66
  272. data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +0 -66
  273. data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +0 -65
  274. data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +0 -65
  275. data/spec/vcr_cassettes/invoices/save_new_with_unsaved_parent.yml +0 -65
  276. data/spec/vcr_cassettes/invoices/save_old.yml +0 -65
  277. data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +0 -65
  278. data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +0 -65
  279. data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +0 -65
  280. data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +0 -65
  281. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +0 -65
  282. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +0 -65
  283. data/spec/vcr_cassettes/invoices/search_by_name.yml +0 -63
  284. data/spec/vcr_cassettes/invoices/search_miss.yml +0 -62
  285. data/spec/vcr_cassettes/invoices/search_with_special_char.yml +0 -62
  286. data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +0 -64
  287. data/spec/vcr_cassettes/orders/all.yml +0 -69
  288. data/spec/vcr_cassettes/orders/filter_hit.yml +0 -64
  289. data/spec/vcr_cassettes/orders/filter_invalid.yml +0 -60
  290. data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +0 -62
  291. data/spec/vcr_cassettes/orders/find_failure.yml +0 -62
  292. data/spec/vcr_cassettes/orders/find_id_1.yml +0 -67
  293. data/spec/vcr_cassettes/orders/find_new.yml +0 -65
  294. data/spec/vcr_cassettes/orders/housework_invalid_tax_reduction_type.yml +0 -61
  295. data/spec/vcr_cassettes/orders/housework_othercoses_invalid.yml +0 -61
  296. data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +0 -65
  297. data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +0 -65
  298. data/spec/vcr_cassettes/orders/housework_type_construction.yml +0 -65
  299. data/spec/vcr_cassettes/orders/housework_type_cooking.yml +0 -61
  300. data/spec/vcr_cassettes/orders/housework_type_electricity.yml +0 -65
  301. data/spec/vcr_cassettes/orders/housework_type_gardening.yml +0 -65
  302. data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +0 -65
  303. data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +0 -65
  304. data/spec/vcr_cassettes/orders/housework_type_hvac.yml +0 -65
  305. data/spec/vcr_cassettes/orders/housework_type_itservices.yml +0 -65
  306. data/spec/vcr_cassettes/orders/housework_type_majorappliancerepair.yml +0 -65
  307. data/spec/vcr_cassettes/orders/housework_type_masonry.yml +0 -65
  308. data/spec/vcr_cassettes/orders/housework_type_movingservices.yml +0 -65
  309. data/spec/vcr_cassettes/orders/housework_type_othercare.yml +0 -65
  310. data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +0 -65
  311. data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +0 -65
  312. data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +0 -65
  313. data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +0 -65
  314. data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +0 -61
  315. data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +0 -63
  316. data/spec/vcr_cassettes/orders/save_new.yml +0 -65
  317. data/spec/vcr_cassettes/orders/save_old.yml +0 -65
  318. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +0 -65
  319. data/spec/vcr_cassettes/orders/search_by_name.yml +0 -63
  320. data/spec/vcr_cassettes/orders/search_miss.yml +0 -62
  321. data/spec/vcr_cassettes/orders/search_with_special_char.yml +0 -62
  322. data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +0 -64
  323. data/spec/vcr_cassettes/projects/all.yml +0 -64
  324. data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +0 -62
  325. data/spec/vcr_cassettes/projects/find_failure.yml +0 -62
  326. data/spec/vcr_cassettes/projects/find_id_1.yml +0 -63
  327. data/spec/vcr_cassettes/projects/find_new.yml +0 -63
  328. data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +0 -64
  329. data/spec/vcr_cassettes/projects/save_new.yml +0 -63
  330. data/spec/vcr_cassettes/projects/save_old.yml +0 -63
  331. data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +0 -63
  332. data/spec/vcr_cassettes/termsofpayments/all.yml +0 -68
  333. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +0 -62
  334. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +0 -62
  335. data/spec/vcr_cassettes/termsofpayments/find_new.yml +0 -63
  336. data/spec/vcr_cassettes/termsofpayments/save_new.yml +0 -63
  337. data/spec/vcr_cassettes/termsofpayments/save_old.yml +0 -63
  338. data/spec/vcr_cassettes/units/all.yml +0 -64
  339. data/spec/vcr_cassettes/units/find_failure.yml +0 -62
  340. data/spec/vcr_cassettes/units/find_id_1.yml +0 -63
  341. data/spec/vcr_cassettes/units/find_new.yml +0 -63
  342. data/spec/vcr_cassettes/units/save_new.yml +0 -63
  343. data/spec/vcr_cassettes/units/save_old.yml +0 -63
  344. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +0 -63
@@ -1,87 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative 'document'
5
-
6
- module Fortnox
7
- module API
8
- module Model
9
- class Invoice < Document
10
- UNIQUE_ID = :document_number
11
- STUB = { customer_number: '' }.freeze
12
-
13
- # UrlTaxReductionList Direct url to the tax reduction for the invoice.
14
- attribute :url_tax_reduction_list, Types::Nullable::String.is(:read_only)
15
-
16
- # AccountingMethod Accounting Method.
17
- attribute :accounting_method, Types::Nullable::String
18
-
19
- # Balance Balance of the invoice.
20
- attribute :balance, Types::Nullable::Float.is(:read_only)
21
-
22
- # Booked If the invoice is bookkept.
23
- attribute :booked, Types::Nullable::Boolean.is(:read_only)
24
-
25
- # Credit If the invoice is a credit invoice.
26
- attribute :credit, Types::Nullable::Boolean.is(:read_only)
27
-
28
- # CreditInvoiceReference Reference to the credit invoice, if one exits.
29
- attribute :credit_invoice_reference, Types::Nullable::Integer
30
-
31
- # ContractReference Reference to the contract, if one exists.
32
- attribute :contract_reference, Types::Nullable::Integer.is(:read_only)
33
-
34
- # DueDate Due date of the invoice.
35
- attribute :due_date, Types::Nullable::Date
36
-
37
- # EDIInformation Separate EDIInformation object
38
- attribute :edi_information, Types::EDIInformation
39
-
40
- # EUQuarterlyReport EU Quarterly Report On / Off
41
- attribute :eu_quarterly_report, Types::Nullable::Boolean
42
-
43
- # InvoiceDate Invoice date.
44
- attribute :invoice_date, Types::Nullable::Date
45
-
46
- # InvoicePeriodStart Start date of the invoice period.
47
- attribute :invoice_period_start, Types::Nullable::Date.is(:read_only)
48
-
49
- # InvoicePeriodEnd End date of the invoice period.
50
- attribute :invoice_period_end, Types::Nullable::Date.is(:read_only)
51
-
52
- # InvoiceRows Separate object
53
- attribute :invoice_rows, Types::Strict::Array.of(Types::InvoiceRow)
54
-
55
- # InvoiceType The type of invoice.
56
- attribute :invoice_type, Types::Nullable::String
57
-
58
- # Language Language code.
59
- attribute :language, Types::Nullable::String
60
-
61
- # LastRemindDate Date of last reminder.
62
- attribute :last_remind_date, Types::Nullable::Date.is(:read_only)
63
-
64
- # NoxFinans If the invoice is managed by NoxFinans
65
- attribute :nox_finans, Types::Nullable::Boolean.is(:read_only)
66
-
67
- # OCR OCR number of the invoice.
68
- attribute :ocr, Types::Nullable::String
69
-
70
- # OrderReference Reference to the order, if one exists.
71
- attribute :order_reference, Types::Nullable::Integer.is(:read_only)
72
-
73
- # Reminders Number of reminders sent to the customer.
74
- attribute :reminders, Types::Nullable::Integer.is(:read_only)
75
-
76
- # VoucherNumber Voucher number for the invoice.
77
- attribute :voucher_number, Types::Nullable::Integer.is(:read_only)
78
-
79
- # VoucherSeries Voucher series for the invoice.
80
- attribute :voucher_series, Types::Nullable::String.is(:read_only)
81
-
82
- # VoucherYear Voucher year for the invoice.
83
- attribute :voucher_year, Types::Nullable::Integer.is(:read_only)
84
- end
85
- end
86
- end
87
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../types'
4
-
5
- module Fortnox
6
- module API
7
- module Model
8
- class Label < Model::Base
9
- STUB = {}.freeze
10
-
11
- # Id integer, read-only. The ID of the label.
12
- attribute :id, Types::Required::Integer.is(:read_only)
13
-
14
- # Description string, 25 characters, required. Description of the label
15
- attribute :description, Types::Sized::String[25].is(:read_only)
16
- end
17
- end
18
- end
19
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative 'document'
5
-
6
- module Fortnox
7
- module API
8
- module Model
9
- class Order < Document
10
- UNIQUE_ID = :document_number
11
- STUB = { customer_number: '', order_rows: [] }.freeze
12
-
13
- # CopyRemarks I remarks shall copies from order to invoice
14
- attribute :copy_remarks, Types::Nullable::Boolean
15
-
16
- # InvoiceReference Reference if an invoice is created from order
17
- attribute :invoice_reference, Types::Nullable::Integer.is(:read_only)
18
-
19
- # OrderDate Date of order
20
- attribute :order_date, Types::Nullable::Date
21
-
22
- # OrderRows Separate object
23
- attribute :order_rows, Types::Strict::Array.of(Types::OrderRow)
24
- end
25
- end
26
- end
27
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative '../types'
5
-
6
- module Fortnox
7
- module API
8
- module Model
9
- class Project < Fortnox::API::Model::Base
10
- UNIQUE_ID = :project_number
11
- STUB = { description: '' }.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 :comments, Types::Sized::String[512]
18
-
19
- # ContactPerson ContactPerson for project. 50 characters
20
- attribute :contact_person, Types::Sized::String[50]
21
-
22
- # Description Description of the project. 50 characters
23
- attribute :description, Types::Sized::String[50]
24
-
25
- # EndDate End date of the project.
26
- attribute :end_date, Types::Nullable::Date
27
-
28
- # ProjectLeader Projectleader. 50 characters
29
- attribute :project_leader, Types::Sized::String[50]
30
-
31
- # ProjectNumber Projectnumber. 20 characters
32
- attribute :project_number, Types::Sized::String[20]
33
-
34
- # Status Status of the project
35
- attribute :status, Types::ProjectStatusType
36
-
37
- # StartDate Start date of the project
38
- attribute :start_date, Types::Nullable::Date
39
- end
40
- end
41
- end
42
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../types'
4
- require_relative '../models/base'
5
-
6
- module Fortnox
7
- module API
8
- module Model
9
- class TermsOfPayment < 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
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative '../types'
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,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'models/article'
4
- require_relative 'models/customer'
5
- require_relative 'models/invoice'
6
- require_relative 'models/order'
7
- require_relative 'models/project'
8
- require_relative 'models/unit'
9
- require_relative 'models/terms_of_payment'
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative '../models/article'
5
- require_relative '../mappers/article'
6
-
7
- module Fortnox
8
- module API
9
- module Repository
10
- class Article < Base
11
- MODEL = Model::Article
12
- MAPPER = Mapper::Article
13
- URI = '/articles/'
14
- end
15
- end
16
- end
17
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
-
5
- module Fortnox
6
- module API
7
- module Repository
8
- class Authentication
9
- def renew_tokens(refresh_token:, client_id:, client_secret:)
10
- body = {
11
- grant_type: 'refresh_token',
12
- refresh_token: refresh_token
13
- }
14
-
15
- response = HTTParty.post(Fortnox::API.config.token_url,
16
- headers: headers(client_id, client_secret),
17
- body: body)
18
-
19
- validate_response(response)
20
-
21
- parsed_response_to_hash(response.parsed_response)
22
- end
23
-
24
- private
25
-
26
- def parsed_response_to_hash(parsed_response)
27
- {
28
- access_token: parsed_response['access_token'],
29
- refresh_token: parsed_response['refresh_token'],
30
- expires_in: parsed_response['expires_in'],
31
- token_type: parsed_response['token_type'],
32
- scope: parsed_response['scope']
33
- }
34
- end
35
-
36
- def headers(client_id, client_secret)
37
- credentials = Base64.encode64("#{client_id}:#{client_secret}")
38
-
39
- {
40
- 'Content-type' => 'application/x-www-form-urlencoded',
41
- Authorization: "Basic #{credentials}"
42
- }
43
- end
44
-
45
- def validate_response(response)
46
- return if response.code == 200
47
-
48
- case response.code
49
- when 400
50
- raise Fortnox::API::RemoteServerError, "Bad request. Error: \"#{response.body}\""
51
- when 401
52
- raise Fortnox::API::RemoteServerError, "Unauthorized request. Error: \"#{response.body}\""
53
- else
54
- raise Exception, "Unable to renew access token. Response code: #{response.code}. " \
55
- "Response message: #{response.message}. Response body: #{response.body}"
56
- end
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'cgi'
4
-
5
- module Fortnox
6
- module API
7
- module Repository
8
- module Loaders
9
- def all
10
- response_hash = get(self.class::URI)
11
- instantiate_collection_response(response_hash)
12
- end
13
-
14
- def only(filter)
15
- response_hash = get("#{self.class::URI}?filter=#{filter}")
16
- instantiate_collection_response(response_hash)
17
- end
18
-
19
- def search(hash)
20
- attribute, value = hash.first
21
- uri_encoded_value = CGI.escape(value)
22
- uri = "#{self.class::URI}?#{attribute}=#{uri_encoded_value}"
23
- response_hash = get(uri)
24
- instantiate_collection_response(response_hash)
25
- end
26
-
27
- def find(id_or_hash)
28
- return find_all_by(id_or_hash) if id_or_hash.is_a? Hash
29
-
30
- find_one_by(id_or_hash)
31
- end
32
-
33
- def find_one_by(id)
34
- response_hash = get("#{self.class::URI}#{id}")
35
- instantiate(@mapper.wrapped_json_hash_to_entity_hash(response_hash))
36
- end
37
-
38
- def find_all_by(hash)
39
- response_hash = get("#{self.class::URI}?#{to_query(hash)}")
40
- instantiate_collection_response(response_hash)
41
- end
42
-
43
- def to_query(hash)
44
- hash.collect do |key, value|
45
- escape(key, value)
46
- end.sort * '&'
47
- end
48
-
49
- def escape(key, value)
50
- "#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}"
51
- end
52
-
53
- private
54
-
55
- def instantiate_collection_response(response_hash)
56
- entities_hash = @mapper.wrapped_json_collection_to_entities_hash(response_hash)
57
- entities_hash.map do |entity_hash|
58
- instantiate(entity_hash)
59
- end
60
- end
61
- end
62
- end
63
- end
64
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Fortnox
4
- module API
5
- module Repository
6
- module Savers
7
- def save(entity)
8
- return true if entity.saved?
9
-
10
- return save_new(entity) if entity.new?
11
-
12
- update_existing(entity)
13
- end
14
-
15
- private
16
-
17
- def execute_save(entity)
18
- body = get_changes_on(entity).to_json
19
- result = yield body
20
- instantiate_saved(result)
21
- end
22
-
23
- def save_new(entity)
24
- execute_save(entity) do |body|
25
- post(self.class::URI, body: body)
26
- end
27
- end
28
-
29
- def update_existing(entity)
30
- execute_save(entity) do |body|
31
- put(get_update_url_for(entity), body: body)
32
- end
33
- end
34
-
35
- def get_changes_on(entity)
36
- hash = @mapper.entity_to_hash(entity, @keys_filtered_on_save)
37
- return hash unless entity.parent.saved?
38
-
39
- parent_hash = @mapper.entity_to_hash(entity.parent, @keys_filtered_on_save)
40
- @mapper.wrap_entity_json_hash(@mapper.diff(hash, parent_hash))
41
- end
42
-
43
- def get_update_url_for(entity)
44
- "#{self.class::URI}#{entity.unique_id}"
45
- end
46
-
47
- def instantiate_saved(wrapped_json_hash)
48
- instantiate(
49
- @mapper.wrapped_json_hash_to_entity_hash(
50
- wrapped_json_hash
51
- )
52
- )
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,93 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'httparty'
4
- require 'jwt'
5
- require 'base64'
6
-
7
- require_relative 'base/loaders'
8
- require_relative 'base/savers'
9
- require_relative '../request_handling'
10
-
11
- module Fortnox
12
- module API
13
- module Repository
14
- class Base
15
- include HTTParty
16
- include Fortnox::API::RequestHandling
17
- include Loaders
18
- include Savers
19
-
20
- HTTParty::Parser::SupportedFormats['text/html'] = :json
21
-
22
- headers(
23
- 'Content-Type' => 'application/json',
24
- 'Accept' => 'application/json'
25
- )
26
-
27
- HTTP_METHODS = %i[get put post delete].freeze
28
-
29
- attr_accessor :headers
30
- attr_reader :mapper, :keys_filtered_on_save
31
-
32
- def self.set_headers(headers = {})
33
- self.headers.merge!(headers)
34
- end
35
-
36
- HTTP_METHODS.each do |method|
37
- define_method method do |path, options = {}, &block|
38
- provided_headers = options[:headers] || {}
39
- provided_headers['Authorization'] = "Bearer #{access_token}"
40
- options[:headers] = provided_headers
41
- options[:base_uri] ||= base_url
42
-
43
- debug_log_request(path, options)
44
-
45
- execute do |remote|
46
- remote.send(method, path, options, &block)
47
- end
48
- end
49
- end
50
-
51
- def initialize(keys_filtered_on_save: [:url])
52
- @keys_filtered_on_save = keys_filtered_on_save
53
- @mapper = Registry[Mapper::Base.canonical_name_sym(self.class::MODEL)].new
54
- return unless access_token.nil?
55
-
56
- raise MissingAccessToken,
57
- 'No Access Token provided! You need to provide an Access Token: ' \
58
- 'Fortnox::API.access_token = token'
59
- end
60
-
61
- private
62
-
63
- def debug_log_request(path, options)
64
- return unless Fortnox::API.debugging
65
-
66
- Fortnox::API.logger.debug("path: #{path.inspect}")
67
- Fortnox::API.logger.debug("options: #{options.inspect}")
68
- end
69
-
70
- def access_token
71
- Fortnox::API.access_token
72
- end
73
-
74
- def instantiate(hash)
75
- hash[:new] = false
76
- hash[:unsaved] = false
77
- self.class::MODEL.new(hash)
78
- end
79
-
80
- def base_url
81
- base_url = config.base_url
82
- raise MissingConfiguration, 'You have to provide a base url.' unless base_url
83
-
84
- base_url
85
- end
86
-
87
- def config
88
- Fortnox::API.config
89
- end
90
- end
91
- end
92
- end
93
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative '../models/customer'
5
- require_relative '../mappers/customer'
6
-
7
- module Fortnox
8
- module API
9
- module Repository
10
- class Customer < Base
11
- MODEL = Model::Customer
12
- MAPPER = Mapper::Customer
13
- URI = '/customers/'
14
- end
15
- end
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative '../models/invoice'
5
- require_relative '../mappers/invoice'
6
-
7
- module Fortnox
8
- module API
9
- module Repository
10
- class Invoice < Base
11
- MODEL = Model::Invoice
12
- MAPPER = Mapper::Invoice
13
- URI = '/invoices/'
14
- end
15
- end
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative '../models/order'
5
- require_relative '../mappers/order'
6
-
7
- module Fortnox
8
- module API
9
- module Repository
10
- class Order < Base
11
- MODEL = Model::Order
12
- MAPPER = Mapper::Order
13
- URI = '/orders/'
14
- end
15
- end
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative '../models/project'
5
- require_relative '../mappers/project'
6
-
7
- module Fortnox
8
- module API
9
- module Repository
10
- class Project < Base
11
- MODEL = Model::Project
12
- MAPPER = Mapper::Project
13
- URI = '/projects/'
14
- end
15
- end
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative '../models/terms_of_payment'
5
- require_relative '../mappers/terms_of_payment'
6
-
7
- module Fortnox
8
- module API
9
- module Repository
10
- class TermsOfPayment < Base
11
- MODEL = Model::TermsOfPayment
12
- MAPPER = Mapper::TermsOfPayment
13
- URI = '/termsofpayments/'
14
- end
15
- end
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative '../models/unit'
5
- require_relative '../mappers/unit'
6
-
7
- module Fortnox
8
- module API
9
- module Repository
10
- class Unit < Fortnox::API::Repository::Base
11
- MODEL = Fortnox::API::Model::Unit
12
- MAPPER = Fortnox::API::Mapper::Unit
13
- URI = '/units/'
14
- end
15
- end
16
- end
17
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'repositories/article'
4
- require_relative 'repositories/customer'
5
- require_relative 'repositories/invoice'
6
- require_relative 'repositories/order'
7
- require_relative 'repositories/project'
8
- require_relative 'repositories/unit'
9
- require_relative 'repositories/terms_of_payment'
10
- require_relative 'repositories/authentication'