vatsense 0.1.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 (245) hide show
  1. checksums.yaml +7 -0
  2. data/.ignore +2 -0
  3. data/CHANGELOG.md +14 -0
  4. data/README.md +235 -0
  5. data/SECURITY.md +27 -0
  6. data/lib/vatsense/client.rb +129 -0
  7. data/lib/vatsense/errors.rb +228 -0
  8. data/lib/vatsense/file_part.rb +58 -0
  9. data/lib/vatsense/internal/transport/base_client.rb +595 -0
  10. data/lib/vatsense/internal/transport/pooled_net_requester.rb +210 -0
  11. data/lib/vatsense/internal/type/array_of.rb +168 -0
  12. data/lib/vatsense/internal/type/base_model.rb +531 -0
  13. data/lib/vatsense/internal/type/base_page.rb +55 -0
  14. data/lib/vatsense/internal/type/boolean.rb +77 -0
  15. data/lib/vatsense/internal/type/converter.rb +327 -0
  16. data/lib/vatsense/internal/type/enum.rb +131 -0
  17. data/lib/vatsense/internal/type/file_input.rb +111 -0
  18. data/lib/vatsense/internal/type/hash_of.rb +188 -0
  19. data/lib/vatsense/internal/type/request_parameters.rb +42 -0
  20. data/lib/vatsense/internal/type/union.rb +237 -0
  21. data/lib/vatsense/internal/type/unknown.rb +81 -0
  22. data/lib/vatsense/internal/util.rb +951 -0
  23. data/lib/vatsense/internal.rb +20 -0
  24. data/lib/vatsense/models/country.rb +70 -0
  25. data/lib/vatsense/models/country_list_params.rb +34 -0
  26. data/lib/vatsense/models/country_list_provinces_params.rb +22 -0
  27. data/lib/vatsense/models/country_list_provinces_response.rb +67 -0
  28. data/lib/vatsense/models/country_list_response.rb +28 -0
  29. data/lib/vatsense/models/create_invoice.rb +171 -0
  30. data/lib/vatsense/models/currency_calculate_vat_price_params.rb +53 -0
  31. data/lib/vatsense/models/currency_calculate_vat_price_response.rb +28 -0
  32. data/lib/vatsense/models/currency_convert_params.rb +53 -0
  33. data/lib/vatsense/models/currency_convert_response.rb +87 -0
  34. data/lib/vatsense/models/currency_list_params.rb +45 -0
  35. data/lib/vatsense/models/currency_list_response.rb +72 -0
  36. data/lib/vatsense/models/find_rate.rb +28 -0
  37. data/lib/vatsense/models/invoice/invoice_item.rb +71 -0
  38. data/lib/vatsense/models/invoice/invoice_item_input.rb +52 -0
  39. data/lib/vatsense/models/invoice/item_add_params.rb +28 -0
  40. data/lib/vatsense/models/invoice/item_delete_params.rb +28 -0
  41. data/lib/vatsense/models/invoice/item_retrieve_params.rb +28 -0
  42. data/lib/vatsense/models/invoice/item_retrieve_response.rb +30 -0
  43. data/lib/vatsense/models/invoice/item_update_params.rb +28 -0
  44. data/lib/vatsense/models/invoice.rb +301 -0
  45. data/lib/vatsense/models/invoice_business_input.rb +80 -0
  46. data/lib/vatsense/models/invoice_conversion_input.rb +24 -0
  47. data/lib/vatsense/models/invoice_create_params.rb +14 -0
  48. data/lib/vatsense/models/invoice_customer_input.rb +59 -0
  49. data/lib/vatsense/models/invoice_delete_params.rb +20 -0
  50. data/lib/vatsense/models/invoice_delete_response.rb +22 -0
  51. data/lib/vatsense/models/invoice_list_params.rb +38 -0
  52. data/lib/vatsense/models/invoice_list_response.rb +28 -0
  53. data/lib/vatsense/models/invoice_response.rb +28 -0
  54. data/lib/vatsense/models/invoice_retrieve_params.rb +20 -0
  55. data/lib/vatsense/models/invoice_update_params.rb +20 -0
  56. data/lib/vatsense/models/rate.rb +74 -0
  57. data/lib/vatsense/models/rate_calculate_price_params.rb +88 -0
  58. data/lib/vatsense/models/rate_calculate_price_response.rb +79 -0
  59. data/lib/vatsense/models/rate_details_params.rb +69 -0
  60. data/lib/vatsense/models/rate_find_params.rb +69 -0
  61. data/lib/vatsense/models/rate_list_params.rb +51 -0
  62. data/lib/vatsense/models/rate_list_response.rb +28 -0
  63. data/lib/vatsense/models/rate_list_types_params.rb +14 -0
  64. data/lib/vatsense/models/rate_list_types_response.rb +28 -0
  65. data/lib/vatsense/models/rate_with_tax_rate.rb +49 -0
  66. data/lib/vatsense/models/sandbox_generate_key_params.rb +14 -0
  67. data/lib/vatsense/models/sandbox_generate_key_response.rb +68 -0
  68. data/lib/vatsense/models/tax_rate.rb +76 -0
  69. data/lib/vatsense/models/usage_retrieve_params.rb +14 -0
  70. data/lib/vatsense/models/usage_retrieve_response.rb +67 -0
  71. data/lib/vatsense/models/validate_check_params.rb +48 -0
  72. data/lib/vatsense/models/validate_check_response.rb +135 -0
  73. data/lib/vatsense/models/vat_price.rb +86 -0
  74. data/lib/vatsense/models.rb +103 -0
  75. data/lib/vatsense/request_options.rb +77 -0
  76. data/lib/vatsense/resources/countries.rb +70 -0
  77. data/lib/vatsense/resources/currency.rb +111 -0
  78. data/lib/vatsense/resources/invoice/item.rb +133 -0
  79. data/lib/vatsense/resources/invoice.rb +206 -0
  80. data/lib/vatsense/resources/rates.rb +190 -0
  81. data/lib/vatsense/resources/sandbox.rb +36 -0
  82. data/lib/vatsense/resources/usage.rb +33 -0
  83. data/lib/vatsense/resources/validate.rb +56 -0
  84. data/lib/vatsense/version.rb +5 -0
  85. data/lib/vatsense.rb +113 -0
  86. data/manifest.yaml +17 -0
  87. data/rbi/vatsense/client.rbi +93 -0
  88. data/rbi/vatsense/errors.rbi +205 -0
  89. data/rbi/vatsense/file_part.rbi +37 -0
  90. data/rbi/vatsense/internal/transport/base_client.rbi +300 -0
  91. data/rbi/vatsense/internal/transport/pooled_net_requester.rbi +83 -0
  92. data/rbi/vatsense/internal/type/array_of.rbi +104 -0
  93. data/rbi/vatsense/internal/type/base_model.rbi +306 -0
  94. data/rbi/vatsense/internal/type/base_page.rbi +42 -0
  95. data/rbi/vatsense/internal/type/boolean.rbi +58 -0
  96. data/rbi/vatsense/internal/type/converter.rbi +216 -0
  97. data/rbi/vatsense/internal/type/enum.rbi +82 -0
  98. data/rbi/vatsense/internal/type/file_input.rbi +59 -0
  99. data/rbi/vatsense/internal/type/hash_of.rbi +104 -0
  100. data/rbi/vatsense/internal/type/request_parameters.rbi +29 -0
  101. data/rbi/vatsense/internal/type/union.rbi +128 -0
  102. data/rbi/vatsense/internal/type/unknown.rbi +58 -0
  103. data/rbi/vatsense/internal/util.rbi +507 -0
  104. data/rbi/vatsense/internal.rbi +16 -0
  105. data/rbi/vatsense/models/country.rbi +111 -0
  106. data/rbi/vatsense/models/country_list_params.rbi +59 -0
  107. data/rbi/vatsense/models/country_list_provinces_params.rbi +43 -0
  108. data/rbi/vatsense/models/country_list_provinces_response.rbi +177 -0
  109. data/rbi/vatsense/models/country_list_response.rbi +55 -0
  110. data/rbi/vatsense/models/create_invoice.rbi +240 -0
  111. data/rbi/vatsense/models/currency_calculate_vat_price_params.rbi +100 -0
  112. data/rbi/vatsense/models/currency_calculate_vat_price_response.rbi +51 -0
  113. data/rbi/vatsense/models/currency_convert_params.rbi +81 -0
  114. data/rbi/vatsense/models/currency_convert_response.rbi +190 -0
  115. data/rbi/vatsense/models/currency_list_params.rbi +79 -0
  116. data/rbi/vatsense/models/currency_list_response.rbi +174 -0
  117. data/rbi/vatsense/models/find_rate.rbi +50 -0
  118. data/rbi/vatsense/models/invoice/invoice_item.rbi +129 -0
  119. data/rbi/vatsense/models/invoice/invoice_item_input.rbi +79 -0
  120. data/rbi/vatsense/models/invoice/item_add_params.rbi +45 -0
  121. data/rbi/vatsense/models/invoice/item_delete_params.rbi +48 -0
  122. data/rbi/vatsense/models/invoice/item_retrieve_params.rbi +48 -0
  123. data/rbi/vatsense/models/invoice/item_retrieve_response.rbi +57 -0
  124. data/rbi/vatsense/models/invoice/item_update_params.rbi +48 -0
  125. data/rbi/vatsense/models/invoice.rbi +481 -0
  126. data/rbi/vatsense/models/invoice_business_input.rbi +113 -0
  127. data/rbi/vatsense/models/invoice_conversion_input.rbi +35 -0
  128. data/rbi/vatsense/models/invoice_create_params.rbi +27 -0
  129. data/rbi/vatsense/models/invoice_customer_input.rbi +93 -0
  130. data/rbi/vatsense/models/invoice_delete_params.rbi +35 -0
  131. data/rbi/vatsense/models/invoice_delete_response.rbi +31 -0
  132. data/rbi/vatsense/models/invoice_list_params.rbi +68 -0
  133. data/rbi/vatsense/models/invoice_list_response.rbi +55 -0
  134. data/rbi/vatsense/models/invoice_response.rbi +48 -0
  135. data/rbi/vatsense/models/invoice_retrieve_params.rbi +35 -0
  136. data/rbi/vatsense/models/invoice_update_params.rbi +35 -0
  137. data/rbi/vatsense/models/rate.rbi +119 -0
  138. data/rbi/vatsense/models/rate_calculate_price_params.rbi +144 -0
  139. data/rbi/vatsense/models/rate_calculate_price_response.rbi +184 -0
  140. data/rbi/vatsense/models/rate_details_params.rbi +109 -0
  141. data/rbi/vatsense/models/rate_find_params.rbi +109 -0
  142. data/rbi/vatsense/models/rate_list_params.rbi +83 -0
  143. data/rbi/vatsense/models/rate_list_response.rbi +48 -0
  144. data/rbi/vatsense/models/rate_list_types_params.rbi +27 -0
  145. data/rbi/vatsense/models/rate_list_types_response.rbi +51 -0
  146. data/rbi/vatsense/models/rate_with_tax_rate.rbi +94 -0
  147. data/rbi/vatsense/models/sandbox_generate_key_params.rbi +27 -0
  148. data/rbi/vatsense/models/sandbox_generate_key_response.rbi +135 -0
  149. data/rbi/vatsense/models/tax_rate.rbi +109 -0
  150. data/rbi/vatsense/models/usage_retrieve_params.rbi +27 -0
  151. data/rbi/vatsense/models/usage_retrieve_response.rbi +155 -0
  152. data/rbi/vatsense/models/validate_check_params.rbi +82 -0
  153. data/rbi/vatsense/models/validate_check_response.rbi +285 -0
  154. data/rbi/vatsense/models/vat_price.rbi +136 -0
  155. data/rbi/vatsense/models.rbi +66 -0
  156. data/rbi/vatsense/request_options.rbi +59 -0
  157. data/rbi/vatsense/resources/countries.rbi +49 -0
  158. data/rbi/vatsense/resources/currency.rbi +82 -0
  159. data/rbi/vatsense/resources/invoice/item.rbi +97 -0
  160. data/rbi/vatsense/resources/invoice.rbi +191 -0
  161. data/rbi/vatsense/resources/rates.rbi +164 -0
  162. data/rbi/vatsense/resources/sandbox.rbi +24 -0
  163. data/rbi/vatsense/resources/usage.rbi +22 -0
  164. data/rbi/vatsense/resources/validate.rbi +51 -0
  165. data/rbi/vatsense/version.rbi +5 -0
  166. data/sig/vatsense/client.rbs +45 -0
  167. data/sig/vatsense/errors.rbs +117 -0
  168. data/sig/vatsense/file_part.rbs +21 -0
  169. data/sig/vatsense/internal/transport/base_client.rbs +135 -0
  170. data/sig/vatsense/internal/transport/pooled_net_requester.rbs +48 -0
  171. data/sig/vatsense/internal/type/array_of.rbs +48 -0
  172. data/sig/vatsense/internal/type/base_model.rbs +102 -0
  173. data/sig/vatsense/internal/type/base_page.rbs +24 -0
  174. data/sig/vatsense/internal/type/boolean.rbs +26 -0
  175. data/sig/vatsense/internal/type/converter.rbs +79 -0
  176. data/sig/vatsense/internal/type/enum.rbs +32 -0
  177. data/sig/vatsense/internal/type/file_input.rbs +25 -0
  178. data/sig/vatsense/internal/type/hash_of.rbs +48 -0
  179. data/sig/vatsense/internal/type/request_parameters.rbs +17 -0
  180. data/sig/vatsense/internal/type/union.rbs +52 -0
  181. data/sig/vatsense/internal/type/unknown.rbs +26 -0
  182. data/sig/vatsense/internal/util.rbs +195 -0
  183. data/sig/vatsense/internal.rbs +9 -0
  184. data/sig/vatsense/models/country.rbs +76 -0
  185. data/sig/vatsense/models/country_list_params.rbs +32 -0
  186. data/sig/vatsense/models/country_list_provinces_params.rbs +23 -0
  187. data/sig/vatsense/models/country_list_provinces_response.rbs +90 -0
  188. data/sig/vatsense/models/country_list_response.rbs +32 -0
  189. data/sig/vatsense/models/create_invoice.rbs +154 -0
  190. data/sig/vatsense/models/currency_calculate_vat_price_params.rbs +47 -0
  191. data/sig/vatsense/models/currency_calculate_vat_price_response.rbs +28 -0
  192. data/sig/vatsense/models/currency_convert_params.rbs +47 -0
  193. data/sig/vatsense/models/currency_convert_response.rbs +104 -0
  194. data/sig/vatsense/models/currency_list_params.rbs +45 -0
  195. data/sig/vatsense/models/currency_list_response.rbs +90 -0
  196. data/sig/vatsense/models/find_rate.rbs +32 -0
  197. data/sig/vatsense/models/invoice/invoice_item.rbs +85 -0
  198. data/sig/vatsense/models/invoice/invoice_item_input.rbs +46 -0
  199. data/sig/vatsense/models/invoice/item_add_params.rbs +33 -0
  200. data/sig/vatsense/models/invoice/item_delete_params.rbs +30 -0
  201. data/sig/vatsense/models/invoice/item_retrieve_params.rbs +30 -0
  202. data/sig/vatsense/models/invoice/item_retrieve_response.rbs +36 -0
  203. data/sig/vatsense/models/invoice/item_update_params.rbs +34 -0
  204. data/sig/vatsense/models/invoice.rbs +332 -0
  205. data/sig/vatsense/models/invoice_business_input.rbs +72 -0
  206. data/sig/vatsense/models/invoice_conversion_input.rbs +15 -0
  207. data/sig/vatsense/models/invoice_create_params.rbs +15 -0
  208. data/sig/vatsense/models/invoice_customer_input.rbs +62 -0
  209. data/sig/vatsense/models/invoice_delete_params.rbs +23 -0
  210. data/sig/vatsense/models/invoice_delete_response.rbs +15 -0
  211. data/sig/vatsense/models/invoice_list_params.rbs +38 -0
  212. data/sig/vatsense/models/invoice_list_response.rbs +34 -0
  213. data/sig/vatsense/models/invoice_response.rbs +32 -0
  214. data/sig/vatsense/models/invoice_retrieve_params.rbs +23 -0
  215. data/sig/vatsense/models/invoice_update_params.rbs +25 -0
  216. data/sig/vatsense/models/rate.rbs +79 -0
  217. data/sig/vatsense/models/rate_calculate_price_params.rbs +77 -0
  218. data/sig/vatsense/models/rate_calculate_price_response.rbs +104 -0
  219. data/sig/vatsense/models/rate_details_params.rbs +63 -0
  220. data/sig/vatsense/models/rate_find_params.rbs +63 -0
  221. data/sig/vatsense/models/rate_list_params.rbs +44 -0
  222. data/sig/vatsense/models/rate_list_response.rbs +32 -0
  223. data/sig/vatsense/models/rate_list_types_params.rbs +15 -0
  224. data/sig/vatsense/models/rate_list_types_response.rbs +28 -0
  225. data/sig/vatsense/models/rate_with_tax_rate.rbs +62 -0
  226. data/sig/vatsense/models/sandbox_generate_key_params.rbs +15 -0
  227. data/sig/vatsense/models/sandbox_generate_key_response.rbs +85 -0
  228. data/sig/vatsense/models/tax_rate.rbs +72 -0
  229. data/sig/vatsense/models/usage_retrieve_params.rbs +15 -0
  230. data/sig/vatsense/models/usage_retrieve_response.rbs +81 -0
  231. data/sig/vatsense/models/validate_check_params.rbs +38 -0
  232. data/sig/vatsense/models/validate_check_response.rbs +161 -0
  233. data/sig/vatsense/models/vat_price.rbs +89 -0
  234. data/sig/vatsense/models.rbs +63 -0
  235. data/sig/vatsense/request_options.rbs +34 -0
  236. data/sig/vatsense/resources/countries.rbs +18 -0
  237. data/sig/vatsense/resources/currency.rbs +27 -0
  238. data/sig/vatsense/resources/invoice/item.rbs +38 -0
  239. data/sig/vatsense/resources/invoice.rbs +69 -0
  240. data/sig/vatsense/resources/rates.rbs +50 -0
  241. data/sig/vatsense/resources/sandbox.rbs +11 -0
  242. data/sig/vatsense/resources/usage.rbs +11 -0
  243. data/sig/vatsense/resources/validate.rbs +14 -0
  244. data/sig/vatsense/version.rbs +3 -0
  245. metadata +316 -0
@@ -0,0 +1,206 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vatsense
4
+ module Resources
5
+ # VAT-compliant invoice management
6
+ class Invoice
7
+ # VAT-compliant invoice management
8
+ # @return [Vatsense::Resources::Invoice::Item]
9
+ attr_reader :item
10
+
11
+ # Some parameter documentations has been truncated, see
12
+ # {Vatsense::Models::InvoiceCreateParams} for more details.
13
+ #
14
+ # Create a new VAT-compliant invoice. VAT Sense will automatically calculate the
15
+ # totals based on the items provided.
16
+ #
17
+ # Not available with sandbox API keys.
18
+ #
19
+ # @overload create(business:, currency_code:, date:, items:, tax_point:, conversion: nil, customer: nil, has_vat: nil, invoice_number: nil, is_copy: nil, is_reverse_charge: nil, notes: nil, pad_invoice_number: nil, serial: nil, tax_type: nil, type: nil, zero_rated: nil, request_options: {})
20
+ #
21
+ # @param business [Vatsense::Models::InvoiceBusinessInput]
22
+ #
23
+ # @param currency_code [String] The 3-character currency code the invoice is billed in.
24
+ #
25
+ # @param date [String] The date the invoice was issued (YYYY-MM-DD or YYYY-MM-DD HH:MM:SS).
26
+ #
27
+ # @param items [Array<Vatsense::Models::Invoice::InvoiceItemInput>]
28
+ #
29
+ # @param tax_point [String] The tax point or "time of supply" (YYYY-MM-DD or YYYY-MM-DD HH:MM:SS).
30
+ #
31
+ # @param conversion [Vatsense::Models::InvoiceConversionInput]
32
+ #
33
+ # @param customer [Vatsense::Models::InvoiceCustomerInput]
34
+ #
35
+ # @param has_vat [Boolean] Whether the invoice is subject to VAT.
36
+ #
37
+ # @param invoice_number [String] A unique invoice number. If not provided, defaults to an auto-incremented number
38
+ #
39
+ # @param is_copy [Boolean] Whether the invoice is a copy of a primary invoice.
40
+ #
41
+ # @param is_reverse_charge [Boolean] Whether the invoice is zero-rated due to reverse charge.
42
+ #
43
+ # @param notes [String] Any additional notes for the invoice.
44
+ #
45
+ # @param pad_invoice_number [Integer] Pad the auto-generated invoice number with leading zeros to this length.
46
+ #
47
+ # @param serial [String] A serial prepended to the auto-generated invoice number. Each unique serial has
48
+ #
49
+ # @param tax_type [Symbol, Vatsense::Models::CreateInvoice::TaxType] Whether item prices include or exclude VAT.
50
+ #
51
+ # @param type [Symbol, Vatsense::Models::CreateInvoice::Type] The type of invoice.
52
+ #
53
+ # @param zero_rated [Boolean] Whether the invoice has been zero-rated.
54
+ #
55
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
56
+ #
57
+ # @return [Vatsense::Models::InvoiceResponse]
58
+ #
59
+ # @see Vatsense::Models::InvoiceCreateParams
60
+ def create(params)
61
+ parsed, options = Vatsense::InvoiceCreateParams.dump_request(params)
62
+ @client.request(
63
+ method: :post,
64
+ path: "invoice",
65
+ body: parsed,
66
+ model: Vatsense::InvoiceResponse,
67
+ options: options
68
+ )
69
+ end
70
+
71
+ # Retrieve a specific invoice by its ID.
72
+ #
73
+ # @overload retrieve(invoice_id, request_options: {})
74
+ #
75
+ # @param invoice_id [String] The unique identifier of the invoice.
76
+ #
77
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
78
+ #
79
+ # @return [Vatsense::Models::InvoiceResponse]
80
+ #
81
+ # @see Vatsense::Models::InvoiceRetrieveParams
82
+ def retrieve(invoice_id, params = {})
83
+ @client.request(
84
+ method: :get,
85
+ path: ["invoice/%1$s", invoice_id],
86
+ model: Vatsense::InvoiceResponse,
87
+ options: params[:request_options]
88
+ )
89
+ end
90
+
91
+ # Some parameter documentations has been truncated, see
92
+ # {Vatsense::Models::InvoiceUpdateParams} for more details.
93
+ #
94
+ # Update an existing invoice. Only the fields provided will be updated.
95
+ #
96
+ # @overload update(invoice_id, business:, currency_code:, date:, items:, tax_point:, conversion: nil, customer: nil, has_vat: nil, invoice_number: nil, is_copy: nil, is_reverse_charge: nil, notes: nil, pad_invoice_number: nil, serial: nil, tax_type: nil, type: nil, zero_rated: nil, request_options: {})
97
+ #
98
+ # @param invoice_id [String] The unique identifier of the invoice.
99
+ #
100
+ # @param business [Vatsense::Models::InvoiceBusinessInput]
101
+ #
102
+ # @param currency_code [String] The 3-character currency code the invoice is billed in.
103
+ #
104
+ # @param date [String] The date the invoice was issued (YYYY-MM-DD or YYYY-MM-DD HH:MM:SS).
105
+ #
106
+ # @param items [Array<Vatsense::Models::Invoice::InvoiceItemInput>]
107
+ #
108
+ # @param tax_point [String] The tax point or "time of supply" (YYYY-MM-DD or YYYY-MM-DD HH:MM:SS).
109
+ #
110
+ # @param conversion [Vatsense::Models::InvoiceConversionInput]
111
+ #
112
+ # @param customer [Vatsense::Models::InvoiceCustomerInput]
113
+ #
114
+ # @param has_vat [Boolean] Whether the invoice is subject to VAT.
115
+ #
116
+ # @param invoice_number [String] A unique invoice number. If not provided, defaults to an auto-incremented number
117
+ #
118
+ # @param is_copy [Boolean] Whether the invoice is a copy of a primary invoice.
119
+ #
120
+ # @param is_reverse_charge [Boolean] Whether the invoice is zero-rated due to reverse charge.
121
+ #
122
+ # @param notes [String] Any additional notes for the invoice.
123
+ #
124
+ # @param pad_invoice_number [Integer] Pad the auto-generated invoice number with leading zeros to this length.
125
+ #
126
+ # @param serial [String] A serial prepended to the auto-generated invoice number. Each unique serial has
127
+ #
128
+ # @param tax_type [Symbol, Vatsense::Models::CreateInvoice::TaxType] Whether item prices include or exclude VAT.
129
+ #
130
+ # @param type [Symbol, Vatsense::Models::CreateInvoice::Type] The type of invoice.
131
+ #
132
+ # @param zero_rated [Boolean] Whether the invoice has been zero-rated.
133
+ #
134
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
135
+ #
136
+ # @return [Vatsense::Models::InvoiceResponse]
137
+ #
138
+ # @see Vatsense::Models::InvoiceUpdateParams
139
+ def update(invoice_id, params)
140
+ parsed, options = Vatsense::InvoiceUpdateParams.dump_request(params)
141
+ @client.request(
142
+ method: :patch,
143
+ path: ["invoice/%1$s", invoice_id],
144
+ body: parsed,
145
+ model: Vatsense::InvoiceResponse,
146
+ options: options
147
+ )
148
+ end
149
+
150
+ # Retrieve a paginated list of all invoices.
151
+ #
152
+ # @overload list(limit: nil, offset: nil, search: nil, request_options: {})
153
+ #
154
+ # @param limit [Integer] Number of invoices to return (default 10, max 100).
155
+ #
156
+ # @param offset [Integer] Number of invoices to skip (default 0).
157
+ #
158
+ # @param search [String] Search query to filter invoices.
159
+ #
160
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
161
+ #
162
+ # @return [Vatsense::Models::InvoiceListResponse]
163
+ #
164
+ # @see Vatsense::Models::InvoiceListParams
165
+ def list(params = {})
166
+ parsed, options = Vatsense::InvoiceListParams.dump_request(params)
167
+ query = Vatsense::Internal::Util.encode_query_params(parsed)
168
+ @client.request(
169
+ method: :get,
170
+ path: "invoice",
171
+ query: query,
172
+ model: Vatsense::Models::InvoiceListResponse,
173
+ options: options
174
+ )
175
+ end
176
+
177
+ # Permanently delete an invoice.
178
+ #
179
+ # @overload delete(invoice_id, request_options: {})
180
+ #
181
+ # @param invoice_id [String] The unique identifier of the invoice.
182
+ #
183
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
184
+ #
185
+ # @return [Vatsense::Models::InvoiceDeleteResponse]
186
+ #
187
+ # @see Vatsense::Models::InvoiceDeleteParams
188
+ def delete(invoice_id, params = {})
189
+ @client.request(
190
+ method: :delete,
191
+ path: ["invoice/%1$s", invoice_id],
192
+ model: Vatsense::Models::InvoiceDeleteResponse,
193
+ options: params[:request_options]
194
+ )
195
+ end
196
+
197
+ # @api private
198
+ #
199
+ # @param client [Vatsense::Client]
200
+ def initialize(client:)
201
+ @client = client
202
+ @item = Vatsense::Resources::Invoice::Item.new(client: client)
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,190 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vatsense
4
+ module Resources
5
+ # VAT/GST rate lookups for countries worldwide
6
+ class Rates
7
+ # Some parameter documentations has been truncated, see
8
+ # {Vatsense::Models::RateListParams} for more details.
9
+ #
10
+ # Returns a list of VAT/GST rates for all countries, sorted alphabetically by
11
+ # country code. Each rate is returned as a rate object containing the standard
12
+ # rate and any other applicable rates.
13
+ #
14
+ # You can optionally filter by country code, IP address, or EU membership.
15
+ #
16
+ # @overload list(country_code: nil, eu: nil, ip_address: nil, period: nil, request_options: {})
17
+ #
18
+ # @param country_code [String] A 2-character ISO 3166-1 alpha-2 country code (e.g. "GB", "FR").
19
+ #
20
+ # @param eu [Boolean] Filter results by EU membership. Use 1 for EU countries only, 0 for non-EU only.
21
+ #
22
+ # @param ip_address [String] An IPv4 or IPv6 address. If provided, the country will be determined from the IP
23
+ #
24
+ # @param period [Time] A historical date to retrieve rates for (format "YYYY-MM-DD HH:MM:SS"). Must be
25
+ #
26
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
27
+ #
28
+ # @return [Vatsense::Models::RateListResponse]
29
+ #
30
+ # @see Vatsense::Models::RateListParams
31
+ def list(params = {})
32
+ parsed, options = Vatsense::RateListParams.dump_request(params)
33
+ query = Vatsense::Internal::Util.encode_query_params(parsed)
34
+ @client.request(
35
+ method: :get,
36
+ path: "rates",
37
+ query: query,
38
+ model: Vatsense::Models::RateListResponse,
39
+ options: options
40
+ )
41
+ end
42
+
43
+ # Some parameter documentations has been truncated, see
44
+ # {Vatsense::Models::RateCalculatePriceParams} for more details.
45
+ #
46
+ # Combines the functionality of the "Find a tax rate" and "VAT price calculation"
47
+ # endpoints to return the particular VAT price for an applicable VAT rate.
48
+ # Requires both a location (country_code or ip_address) and a price to calculate.
49
+ #
50
+ # @overload calculate_price(price:, tax_type:, country_code: nil, eu: nil, ip_address: nil, province_code: nil, type: nil, request_options: {})
51
+ #
52
+ # @param price [String] The price to calculate on. Must be a string with exactly 2 decimal places (e.g.
53
+ #
54
+ # @param tax_type [Symbol, Vatsense::Models::RateCalculatePriceParams::TaxType] Whether the provided price is inclusive or exclusive of VAT.
55
+ #
56
+ # @param country_code [String] A 2-character ISO 3166-1 alpha-2 country code (e.g. "GB", "FR").
57
+ #
58
+ # @param eu [Boolean] Filter results by EU membership. Use 1 for EU countries only, 0 for non-EU only.
59
+ #
60
+ # @param ip_address [String] An IPv4 or IPv6 address. If provided, the country will be determined from the IP
61
+ #
62
+ # @param province_code [String] A 2-character province code (e.g. "NU", "NT"). If providing a province
63
+ #
64
+ # @param type [String] The product type to find the applicable rate for. See the /rates/types
65
+ #
66
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
67
+ #
68
+ # @return [Vatsense::Models::RateCalculatePriceResponse]
69
+ #
70
+ # @see Vatsense::Models::RateCalculatePriceParams
71
+ def calculate_price(params)
72
+ parsed, options = Vatsense::RateCalculatePriceParams.dump_request(params)
73
+ query = Vatsense::Internal::Util.encode_query_params(parsed)
74
+ @client.request(
75
+ method: :get,
76
+ path: "rates/price",
77
+ query: query,
78
+ model: Vatsense::Models::RateCalculatePriceResponse,
79
+ options: options
80
+ )
81
+ end
82
+
83
+ # Some parameter documentations has been truncated, see
84
+ # {Vatsense::Models::RateDetailsParams} for more details.
85
+ #
86
+ # Get detailed tax rate information for a location, including all applicable rate
87
+ # classes (standard, reduced, zero, etc.).
88
+ #
89
+ # @overload details(country_code: nil, eu: nil, ip_address: nil, period: nil, province_code: nil, type: nil, request_options: {})
90
+ #
91
+ # @param country_code [String] A 2-character ISO 3166-1 alpha-2 country code (e.g. "GB", "FR").
92
+ #
93
+ # @param eu [Boolean] Filter results by EU membership. Use 1 for EU countries only, 0 for non-EU only.
94
+ #
95
+ # @param ip_address [String] An IPv4 or IPv6 address. If provided, the country will be determined from the IP
96
+ #
97
+ # @param period [Time] A historical date to retrieve rates for (format "YYYY-MM-DD HH:MM:SS"). Must be
98
+ #
99
+ # @param province_code [String] A 2-character province code (e.g. "NU", "NT"). If providing a province
100
+ #
101
+ # @param type [String] The product type to find the applicable rate for. See the /rates/types
102
+ #
103
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
104
+ #
105
+ # @return [Vatsense::Models::FindRate]
106
+ #
107
+ # @see Vatsense::Models::RateDetailsParams
108
+ def details(params = {})
109
+ parsed, options = Vatsense::RateDetailsParams.dump_request(params)
110
+ query = Vatsense::Internal::Util.encode_query_params(parsed)
111
+ @client.request(
112
+ method: :get,
113
+ path: "rates/tax_rate",
114
+ query: query,
115
+ model: Vatsense::FindRate,
116
+ options: options
117
+ )
118
+ end
119
+
120
+ # Some parameter documentations has been truncated, see
121
+ # {Vatsense::Models::RateFindParams} for more details.
122
+ #
123
+ # A handy endpoint for finding a rate that applies to a particular country and
124
+ # optional product type, based on country code or IP address.
125
+ #
126
+ # If no type is provided, or no specific rate is applied to the given type, then
127
+ # the standard rate will be returned if the country is subject to tax.
128
+ #
129
+ # If the country is not subject to VAT/GST then an error response will be
130
+ # returned, indicating no tax applies.
131
+ #
132
+ # @overload find(country_code: nil, eu: nil, ip_address: nil, period: nil, province_code: nil, type: nil, request_options: {})
133
+ #
134
+ # @param country_code [String] A 2-character ISO 3166-1 alpha-2 country code (e.g. "GB", "FR").
135
+ #
136
+ # @param eu [Boolean] Filter results by EU membership. Use 1 for EU countries only, 0 for non-EU only.
137
+ #
138
+ # @param ip_address [String] An IPv4 or IPv6 address. If provided, the country will be determined from the IP
139
+ #
140
+ # @param period [Time] A historical date to retrieve rates for (format "YYYY-MM-DD HH:MM:SS"). Must be
141
+ #
142
+ # @param province_code [String] A 2-character province code (e.g. "NU", "NT"). If providing a province
143
+ #
144
+ # @param type [String] The product type to find the applicable rate for. See the /rates/types
145
+ #
146
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
147
+ #
148
+ # @return [Vatsense::Models::FindRate]
149
+ #
150
+ # @see Vatsense::Models::RateFindParams
151
+ def find(params = {})
152
+ parsed, options = Vatsense::RateFindParams.dump_request(params)
153
+ query = Vatsense::Internal::Util.encode_query_params(parsed)
154
+ @client.request(
155
+ method: :get,
156
+ path: "rates/rate",
157
+ query: query,
158
+ model: Vatsense::FindRate,
159
+ options: options
160
+ )
161
+ end
162
+
163
+ # Returns a list of all available product types that can be used to filter tax
164
+ # rates.
165
+ #
166
+ # @overload list_types(request_options: {})
167
+ #
168
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
169
+ #
170
+ # @return [Vatsense::Models::RateListTypesResponse]
171
+ #
172
+ # @see Vatsense::Models::RateListTypesParams
173
+ def list_types(params = {})
174
+ @client.request(
175
+ method: :get,
176
+ path: "rates/types",
177
+ model: Vatsense::Models::RateListTypesResponse,
178
+ options: params[:request_options]
179
+ )
180
+ end
181
+
182
+ # @api private
183
+ #
184
+ # @param client [Vatsense::Client]
185
+ def initialize(client:)
186
+ @client = client
187
+ end
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vatsense
4
+ module Resources
5
+ # Temporary sandbox API keys for testing
6
+ class Sandbox
7
+ # Generate a temporary sandbox API key for testing. Sandbox keys have limited
8
+ # request allowances and restricted endpoint access (no invoice endpoints). Rate
9
+ # limited to 1 key per IP address per 6 hours.
10
+ #
11
+ # @overload generate_key(request_options: {})
12
+ #
13
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
14
+ #
15
+ # @return [Vatsense::Models::SandboxGenerateKeyResponse]
16
+ #
17
+ # @see Vatsense::Models::SandboxGenerateKeyParams
18
+ def generate_key(params = {})
19
+ @client.request(
20
+ method: :post,
21
+ path: "sandbox/key",
22
+ model: Vatsense::Models::SandboxGenerateKeyResponse,
23
+ security: {},
24
+ options: params[:request_options]
25
+ )
26
+ end
27
+
28
+ # @api private
29
+ #
30
+ # @param client [Vatsense::Client]
31
+ def initialize(client:)
32
+ @client = client
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vatsense
4
+ module Resources
5
+ # API usage statistics
6
+ class Usage
7
+ # Check your used and remaining API requests.
8
+ #
9
+ # @overload retrieve(request_options: {})
10
+ #
11
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
12
+ #
13
+ # @return [Vatsense::Models::UsageRetrieveResponse]
14
+ #
15
+ # @see Vatsense::Models::UsageRetrieveParams
16
+ def retrieve(params = {})
17
+ @client.request(
18
+ method: :get,
19
+ path: "usage",
20
+ model: Vatsense::Models::UsageRetrieveResponse,
21
+ options: params[:request_options]
22
+ )
23
+ end
24
+
25
+ # @api private
26
+ #
27
+ # @param client [Vatsense::Client]
28
+ def initialize(client:)
29
+ @client = client
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vatsense
4
+ module Resources
5
+ # VAT and EORI number validation
6
+ class Validate
7
+ # Some parameter documentations has been truncated, see
8
+ # {Vatsense::Models::ValidateCheckParams} for more details.
9
+ #
10
+ # Check whether a given VAT number or EORI number is valid against live government
11
+ # records.
12
+ #
13
+ # **VAT validation** checks against UK (HMRC), EU (VIES), Australia, Norway,
14
+ # Switzerland, South Africa, and Brazil records.
15
+ #
16
+ # **EORI validation** checks against UK and EU records only.
17
+ #
18
+ # If the external validation service is temporarily unavailable, the API returns a
19
+ # `412` error and the request does not count against your usage quota.
20
+ #
21
+ # Provide either `vat_number` or `eori_number`, but not both.
22
+ #
23
+ # @overload check(eori_number: nil, requester_vat_number: nil, vat_number: nil, request_options: {})
24
+ #
25
+ # @param eori_number [String] The EORI number to validate. Must include the leading 2-character
26
+ #
27
+ # @param requester_vat_number [String] Your own VAT number. If supplied, the response will include a unique
28
+ #
29
+ # @param vat_number [String] The VAT number to validate. Must include the leading 2-character
30
+ #
31
+ # @param request_options [Vatsense::RequestOptions, Hash{Symbol=>Object}, nil]
32
+ #
33
+ # @return [Vatsense::Models::ValidateCheckResponse]
34
+ #
35
+ # @see Vatsense::Models::ValidateCheckParams
36
+ def check(params = {})
37
+ parsed, options = Vatsense::ValidateCheckParams.dump_request(params)
38
+ query = Vatsense::Internal::Util.encode_query_params(parsed)
39
+ @client.request(
40
+ method: :get,
41
+ path: "validate",
42
+ query: query,
43
+ model: Vatsense::Models::ValidateCheckResponse,
44
+ options: options
45
+ )
46
+ end
47
+
48
+ # @api private
49
+ #
50
+ # @param client [Vatsense::Client]
51
+ def initialize(client:)
52
+ @client = client
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vatsense
4
+ VERSION = "0.1.0"
5
+ end
data/lib/vatsense.rb ADDED
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Standard libraries.
4
+ # rubocop:disable Lint/RedundantRequireStatement
5
+ require "English"
6
+ require "base64"
7
+ require "cgi"
8
+ require "date"
9
+ require "erb"
10
+ require "etc"
11
+ require "json"
12
+ require "net/http"
13
+ require "openssl"
14
+ require "pathname"
15
+ require "rbconfig"
16
+ require "securerandom"
17
+ require "set"
18
+ require "stringio"
19
+ require "time"
20
+ require "uri"
21
+ # rubocop:enable Lint/RedundantRequireStatement
22
+
23
+ # We already ship the preferred sorbet manifests in the package itself.
24
+ # `tapioca` currently does not offer us a way to opt out of unnecessary compilation.
25
+ if Object.const_defined?(:Tapioca) &&
26
+ caller.chain([$PROGRAM_NAME]).chain(ARGV).any?(/tapioca/) &&
27
+ ARGV.none?(/dsl/)
28
+ return
29
+ end
30
+
31
+ # Gems.
32
+ require "connection_pool"
33
+
34
+ # Package files.
35
+ require_relative "vatsense/version"
36
+ require_relative "vatsense/internal/util"
37
+ require_relative "vatsense/internal/type/converter"
38
+ require_relative "vatsense/internal/type/unknown"
39
+ require_relative "vatsense/internal/type/boolean"
40
+ require_relative "vatsense/internal/type/file_input"
41
+ require_relative "vatsense/internal/type/enum"
42
+ require_relative "vatsense/internal/type/union"
43
+ require_relative "vatsense/internal/type/array_of"
44
+ require_relative "vatsense/internal/type/hash_of"
45
+ require_relative "vatsense/internal/type/base_model"
46
+ require_relative "vatsense/internal/type/base_page"
47
+ require_relative "vatsense/internal/type/request_parameters"
48
+ require_relative "vatsense/internal"
49
+ require_relative "vatsense/request_options"
50
+ require_relative "vatsense/file_part"
51
+ require_relative "vatsense/errors"
52
+ require_relative "vatsense/internal/transport/base_client"
53
+ require_relative "vatsense/internal/transport/pooled_net_requester"
54
+ require_relative "vatsense/client"
55
+ require_relative "vatsense/models/invoice/invoice_item_input"
56
+ require_relative "vatsense/models/create_invoice"
57
+ require_relative "vatsense/models/tax_rate"
58
+ require_relative "vatsense/models/country"
59
+ require_relative "vatsense/models/country_list_params"
60
+ require_relative "vatsense/models/country_list_provinces_params"
61
+ require_relative "vatsense/models/country_list_provinces_response"
62
+ require_relative "vatsense/models/country_list_response"
63
+ require_relative "vatsense/models/currency_calculate_vat_price_params"
64
+ require_relative "vatsense/models/currency_calculate_vat_price_response"
65
+ require_relative "vatsense/models/currency_convert_params"
66
+ require_relative "vatsense/models/currency_convert_response"
67
+ require_relative "vatsense/models/currency_list_params"
68
+ require_relative "vatsense/models/currency_list_response"
69
+ require_relative "vatsense/models/find_rate"
70
+ require_relative "vatsense/models/invoice/invoice_item"
71
+ require_relative "vatsense/models/invoice/item_add_params"
72
+ require_relative "vatsense/models/invoice/item_delete_params"
73
+ require_relative "vatsense/models/invoice/item_retrieve_params"
74
+ require_relative "vatsense/models/invoice/item_retrieve_response"
75
+ require_relative "vatsense/models/invoice/item_update_params"
76
+ require_relative "vatsense/models/invoice"
77
+ require_relative "vatsense/models/invoice_business_input"
78
+ require_relative "vatsense/models/invoice_conversion_input"
79
+ require_relative "vatsense/models/invoice_create_params"
80
+ require_relative "vatsense/models/invoice_customer_input"
81
+ require_relative "vatsense/models/invoice_delete_params"
82
+ require_relative "vatsense/models/invoice_delete_response"
83
+ require_relative "vatsense/models/invoice_list_params"
84
+ require_relative "vatsense/models/invoice_list_response"
85
+ require_relative "vatsense/models/invoice_response"
86
+ require_relative "vatsense/models/invoice_retrieve_params"
87
+ require_relative "vatsense/models/invoice_update_params"
88
+ require_relative "vatsense/models/rate"
89
+ require_relative "vatsense/models/rate_calculate_price_params"
90
+ require_relative "vatsense/models/rate_calculate_price_response"
91
+ require_relative "vatsense/models/rate_details_params"
92
+ require_relative "vatsense/models/rate_find_params"
93
+ require_relative "vatsense/models/rate_list_params"
94
+ require_relative "vatsense/models/rate_list_response"
95
+ require_relative "vatsense/models/rate_list_types_params"
96
+ require_relative "vatsense/models/rate_list_types_response"
97
+ require_relative "vatsense/models/rate_with_tax_rate"
98
+ require_relative "vatsense/models/sandbox_generate_key_params"
99
+ require_relative "vatsense/models/sandbox_generate_key_response"
100
+ require_relative "vatsense/models/usage_retrieve_params"
101
+ require_relative "vatsense/models/usage_retrieve_response"
102
+ require_relative "vatsense/models/validate_check_params"
103
+ require_relative "vatsense/models/validate_check_response"
104
+ require_relative "vatsense/models/vat_price"
105
+ require_relative "vatsense/models"
106
+ require_relative "vatsense/resources/countries"
107
+ require_relative "vatsense/resources/currency"
108
+ require_relative "vatsense/resources/invoice"
109
+ require_relative "vatsense/resources/invoice/item"
110
+ require_relative "vatsense/resources/rates"
111
+ require_relative "vatsense/resources/sandbox"
112
+ require_relative "vatsense/resources/usage"
113
+ require_relative "vatsense/resources/validate"
data/manifest.yaml ADDED
@@ -0,0 +1,17 @@
1
+ dependencies:
2
+ - English
3
+ - base64
4
+ - cgi
5
+ - date
6
+ - erb
7
+ - etc
8
+ - json
9
+ - net/http
10
+ - openssl
11
+ - pathname
12
+ - rbconfig
13
+ - securerandom
14
+ - set
15
+ - stringio
16
+ - time
17
+ - uri