business-central 1.0.1 → 1.0.6

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 (128) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +58 -15
  3. data/lib/business_central.rb +47 -2
  4. data/lib/business_central/client.rb +82 -39
  5. data/lib/business_central/exceptions.rb +30 -10
  6. data/lib/business_central/object/account.rb +4 -12
  7. data/lib/business_central/object/aged_account_payable.rb +4 -12
  8. data/lib/business_central/object/aged_account_receivable.rb +4 -12
  9. data/lib/business_central/object/argument_helper.rb +22 -0
  10. data/lib/business_central/object/attachment.rb +30 -0
  11. data/lib/business_central/object/balance_sheet.rb +4 -12
  12. data/lib/business_central/object/base.rb +100 -49
  13. data/lib/business_central/object/cash_flow_statement.rb +4 -12
  14. data/lib/business_central/object/company.rb +9 -2
  15. data/lib/business_central/object/company_information.rb +7 -15
  16. data/lib/business_central/object/country_region.rb +26 -0
  17. data/lib/business_central/object/currency.rb +29 -0
  18. data/lib/business_central/object/customer.rb +34 -0
  19. data/lib/business_central/object/customer_financial_detail.rb +13 -0
  20. data/lib/business_central/object/customer_payment.rb +43 -0
  21. data/lib/business_central/object/customer_payment_journal.rb +25 -0
  22. data/lib/business_central/object/customer_sale.rb +13 -0
  23. data/lib/business_central/object/default_dimension.rb +51 -0
  24. data/lib/business_central/object/dimension.rb +20 -0
  25. data/lib/business_central/object/dimension_line.rb +37 -0
  26. data/lib/business_central/object/dimension_value.rb +28 -0
  27. data/lib/business_central/object/employee.rb +21 -0
  28. data/lib/business_central/object/filter_query.rb +18 -0
  29. data/lib/business_central/object/general_ledger_entry.rb +13 -0
  30. data/lib/business_central/object/income_statement.rb +13 -0
  31. data/lib/business_central/object/irs1099_code.rb +16 -0
  32. data/lib/business_central/object/item.rb +16 -19
  33. data/lib/business_central/object/item_category.rb +16 -0
  34. data/lib/business_central/object/journal.rb +29 -0
  35. data/lib/business_central/object/journal_line.rb +48 -0
  36. data/lib/business_central/object/object_helper.rb +49 -0
  37. data/lib/business_central/object/payment_method.rb +16 -0
  38. data/lib/business_central/object/payment_term.rb +16 -0
  39. data/lib/business_central/object/picture.rb +53 -0
  40. data/lib/business_central/object/purchase_invoice.rb +8 -16
  41. data/lib/business_central/object/purchase_invoice_line.rb +14 -18
  42. data/lib/business_central/object/request.rb +61 -50
  43. data/lib/business_central/object/response.rb +31 -23
  44. data/lib/business_central/object/retained_earning_statement.rb +13 -0
  45. data/lib/business_central/object/sales_credit_memo.rb +20 -0
  46. data/lib/business_central/object/sales_credit_memo_line.rb +30 -0
  47. data/lib/business_central/object/sales_invoice.rb +62 -0
  48. data/lib/business_central/object/sales_invoice_line.rb +30 -0
  49. data/lib/business_central/object/sales_order.rb +20 -0
  50. data/lib/business_central/object/sales_order_line.rb +30 -0
  51. data/lib/business_central/object/sales_quote.rb +20 -0
  52. data/lib/business_central/object/sales_quote_line.rb +30 -0
  53. data/lib/business_central/object/shipment_method.rb +16 -0
  54. data/lib/business_central/object/subscription.rb +16 -0
  55. data/lib/business_central/object/tax_area.rb +16 -0
  56. data/lib/business_central/object/tax_group.rb +16 -0
  57. data/lib/business_central/object/time_registration_entry.rb +16 -0
  58. data/lib/business_central/object/trial_balance.rb +13 -0
  59. data/lib/business_central/object/units_of_measure.rb +16 -0
  60. data/lib/business_central/object/url_builder.rb +59 -0
  61. data/lib/business_central/object/url_helper.rb +44 -0
  62. data/lib/business_central/object/validation.rb +10 -7
  63. data/lib/business_central/object/vendor.rb +12 -15
  64. data/lib/business_central/object/vendor_purchase.rb +13 -0
  65. data/lib/business_central/version.rb +4 -2
  66. data/lib/business_central/web_service.rb +78 -0
  67. data/lib/core_ext/string.rb +18 -12
  68. data/test/business_central/client_test.rb +49 -7
  69. data/test/business_central/object/account_test.rb +6 -5
  70. data/test/business_central/object/aged_account_payable_test.rb +6 -5
  71. data/test/business_central/object/aged_account_receivable_test.rb +6 -5
  72. data/test/business_central/object/attachment_test.rb +117 -0
  73. data/test/business_central/object/balance_sheet_test.rb +6 -5
  74. data/test/business_central/object/base_test.rb +41 -0
  75. data/test/business_central/object/cash_flow_statement_test.rb +6 -5
  76. data/test/business_central/object/company_information_test.rb +9 -10
  77. data/test/business_central/object/company_test.rb +6 -5
  78. data/test/business_central/object/country_region_test.rb +129 -0
  79. data/test/business_central/object/currency_test.rb +150 -0
  80. data/test/business_central/object/customer_financial_detail_test.rb +68 -0
  81. data/test/business_central/object/customer_payment_journal_test.rb +134 -0
  82. data/test/business_central/object/customer_payment_test.rb +141 -0
  83. data/test/business_central/object/customer_sale_test.rb +72 -0
  84. data/test/business_central/object/customer_test.rb +168 -0
  85. data/test/business_central/object/default_dimension_test.rb +170 -0
  86. data/test/business_central/object/dimension_line_test.rb +165 -0
  87. data/test/business_central/object/dimension_test.rb +65 -0
  88. data/test/business_central/object/dimension_value_test.rb +68 -0
  89. data/test/business_central/object/employee_test.rb +141 -0
  90. data/test/business_central/object/filter_query_test.rb +36 -0
  91. data/test/business_central/object/general_ledger_entry_test.rb +82 -0
  92. data/test/business_central/object/income_statement_test.rb +82 -0
  93. data/test/business_central/object/irs1099_code_test.rb +124 -0
  94. data/test/business_central/object/item_category_test.rb +122 -0
  95. data/test/business_central/object/item_test.rb +16 -17
  96. data/test/business_central/object/journal_line_test.rb +152 -0
  97. data/test/business_central/object/journal_test.rb +144 -0
  98. data/test/business_central/object/payment_method_test.rb +134 -0
  99. data/test/business_central/object/payment_term_test.rb +134 -0
  100. data/test/business_central/object/picture_test.rb +74 -0
  101. data/test/business_central/object/purchase_invoice_line_test.rb +15 -15
  102. data/test/business_central/object/purchase_invoice_test.rb +15 -15
  103. data/test/business_central/object/request_test.rb +75 -12
  104. data/test/business_central/object/response_test.rb +34 -9
  105. data/test/business_central/object/retained_earning_statement_test.rb +52 -0
  106. data/test/business_central/object/sales_credit_memo_line_test.rb +134 -0
  107. data/test/business_central/object/sales_credit_memo_test.rb +146 -0
  108. data/test/business_central/object/sales_invoice_line_test.rb +164 -0
  109. data/test/business_central/object/sales_invoice_test.rb +156 -0
  110. data/test/business_central/object/sales_order_line_test.rb +134 -0
  111. data/test/business_central/object/sales_order_test.rb +146 -0
  112. data/test/business_central/object/sales_quote_line_test.rb +134 -0
  113. data/test/business_central/object/sales_quote_test.rb +146 -0
  114. data/test/business_central/object/shipment_method_test.rb +133 -0
  115. data/test/business_central/object/subscription_test.rb +126 -0
  116. data/test/business_central/object/tax_area_test.rb +126 -0
  117. data/test/business_central/object/tax_group_test.rb +126 -0
  118. data/test/business_central/object/time_registration_entry_test.rb +126 -0
  119. data/test/business_central/object/trial_balance_test.rb +82 -0
  120. data/test/business_central/object/units_of_measure_test.rb +126 -0
  121. data/test/business_central/object/validation_test.rb +5 -4
  122. data/test/business_central/object/vendor_purchase_test.rb +82 -0
  123. data/test/business_central/object/vendor_test.rb +16 -16
  124. data/test/business_central/web_service_test.rb +100 -0
  125. data/test/business_central_test.rb +3 -1
  126. data/test/test_helper.rb +16 -6
  127. metadata +188 -37
  128. data/lib/business_central/object/helper.rb +0 -15
@@ -1,35 +1,43 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BusinessCentral
2
4
  module Object
3
5
  class Response
4
- attr_reader :results
6
+ class << self
7
+ def success?(status)
8
+ [200, 201].include?(status)
9
+ end
5
10
 
6
- def initialize(response)
7
- @results = nil
8
- if !response.blank?
9
- @response = JSON.parse(response)
10
- if @response.has_key?('value')
11
- @response = @response['value']
12
- end
13
- process
11
+ def success_no_content?(status)
12
+ status == 204
14
13
  end
15
- end
16
14
 
17
- def self.success?(status)
18
- status == 200 || status == 201
19
- end
15
+ def unauthorized?(status)
16
+ status == 401
17
+ end
20
18
 
21
- def self.deleted?(status)
22
- status == 204
19
+ def not_found?(status)
20
+ status == 404
21
+ end
23
22
  end
24
23
 
25
- def self.unauthorized?(status)
26
- status == 401
24
+ attr_reader :results
25
+
26
+ def initialize(response)
27
+ @results = nil
28
+ return if response.blank?
29
+
30
+ @response = JSON.parse(response)
31
+ @response = @response['value'] if @response.key?('value')
32
+ process
27
33
  end
28
34
 
29
35
  private
30
36
 
31
37
  def process
32
- if @response.is_a?(Array)
38
+ if @response.is_a?(String)
39
+ @results = @response
40
+ elsif @response.is_a?(Array)
33
41
  @results = []
34
42
  @response.each do |data|
35
43
  @results << convert(data)
@@ -40,11 +48,11 @@ module BusinessCentral
40
48
  end
41
49
 
42
50
  def convert(data)
43
- result = {}
51
+ result = {}
44
52
  data.each do |key, value|
45
- if key == "@odata.etag"
53
+ if key == '@odata.etag'
46
54
  result[:etag] = value
47
- elsif key == "@odata.context"
55
+ elsif key == '@odata.context'
48
56
  result[:context] = value
49
57
  elsif value.is_a?(Hash)
50
58
  result[key.to_snake_case.to_sym] = convert(value)
@@ -53,8 +61,8 @@ module BusinessCentral
53
61
  end
54
62
  end
55
63
 
56
- return result
64
+ result
57
65
  end
58
66
  end
59
67
  end
60
- end
68
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class RetainedEarningStatement < Base
6
+ OBJECT = 'retainedEarningsStatement'
7
+
8
+ OBJECT_METHODS = %i[
9
+ get
10
+ ].freeze
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class SalesCreditMemo < Base
6
+ extend BusinessCentral::Object::ObjectHelper
7
+
8
+ OBJECT = 'salesCreditMemos'
9
+
10
+ OBJECT_METHODS = %i[
11
+ get
12
+ post
13
+ patch
14
+ delete
15
+ ].freeze
16
+
17
+ navigation :sales_credit_memo_line
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class SalesCreditMemoLine < Base
6
+ OBJECT = 'salesCreditMemoLines'
7
+
8
+ OBJECT_METHODS = %i[
9
+ get
10
+ post
11
+ patch
12
+ delete
13
+ ].freeze
14
+
15
+ OBJECT_PARENTS = %w[
16
+ salesCreditMemos
17
+ ].freeze
18
+
19
+ def initialize(client, parent: 'salesCreditMemos', parent_id:, **args)
20
+ return if !valid_parent?(parent)
21
+
22
+ super(client, args)
23
+ @parent_path << {
24
+ path: parent,
25
+ id: parent_id
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class SalesInvoice < Base
6
+ extend BusinessCentral::Object::ObjectHelper
7
+
8
+ OBJECT = 'salesInvoices'
9
+
10
+ OBJECT_VALIDATION = {
11
+ customer_purchase_order_reference: {
12
+ maximum_length: 10
13
+ },
14
+ customer_number: {
15
+ maximum_length: 20
16
+ },
17
+ contact_id: {
18
+ maximum_length: 250
19
+ },
20
+ currency_code: {
21
+ maximum_length: 10
22
+ },
23
+ email: {
24
+ maximum_length: 80
25
+ },
26
+ phone: {
27
+ maximum_length: 30
28
+ },
29
+ payment_terms: {
30
+ maximum_length: 10
31
+ },
32
+ shipment_method: {
33
+ maximum_length: 10
34
+ },
35
+ salesperson: {
36
+ maximum_length: 20
37
+ },
38
+ bill_to_name: {
39
+ maximum_length: 100
40
+ },
41
+ bill_to_customer_number: {
42
+ maximum_length: 20
43
+ },
44
+ ship_to_name: {
45
+ maximum_length: 100
46
+ },
47
+ ship_to_contact: {
48
+ maximum_length: 100
49
+ }
50
+ }.freeze
51
+
52
+ OBJECT_METHODS = %i[
53
+ get
54
+ post
55
+ patch
56
+ delete
57
+ ].freeze
58
+
59
+ navigation :sales_invoice_line
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class SalesInvoiceLine < Base
6
+ OBJECT = 'salesInvoiceLines'
7
+
8
+ OBJECT_METHODS = %i[
9
+ get
10
+ post
11
+ patch
12
+ delete
13
+ ].freeze
14
+
15
+ OBJECT_PARENTS = %w[
16
+ salesInvoices
17
+ ].freeze
18
+
19
+ def initialize(client, parent: 'salesInvoices', parent_id:, **args)
20
+ return if !valid_parent?(parent)
21
+
22
+ super(client, args)
23
+ @parent_path << {
24
+ path: parent,
25
+ id: parent_id
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class SalesOrder < Base
6
+ extend BusinessCentral::Object::ObjectHelper
7
+
8
+ OBJECT = 'salesOrders'
9
+
10
+ OBJECT_METHODS = %i[
11
+ get
12
+ post
13
+ patch
14
+ delete
15
+ ].freeze
16
+
17
+ navigation :sales_order_line
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class SalesOrderLine < Base
6
+ OBJECT = 'salesOrderLines'
7
+
8
+ OBJECT_METHODS = %i[
9
+ get
10
+ post
11
+ patch
12
+ delete
13
+ ].freeze
14
+
15
+ OBJECT_PARENTS = %w[
16
+ salesOrders
17
+ ].freeze
18
+
19
+ def initialize(client, parent: 'salesOrders', parent_id:, **args)
20
+ return if !valid_parent?(parent)
21
+
22
+ super(client, args)
23
+ @parent_path << {
24
+ path: parent,
25
+ id: parent_id
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class SalesQuote < Base
6
+ extend BusinessCentral::Object::ObjectHelper
7
+
8
+ OBJECT = 'salesQuotes'
9
+
10
+ OBJECT_METHODS = %i[
11
+ get
12
+ post
13
+ patch
14
+ delete
15
+ ].freeze
16
+
17
+ navigation :sales_quote_line
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class SalesQuoteLine < Base
6
+ OBJECT = 'salesQuoteLines'
7
+
8
+ OBJECT_METHODS = %i[
9
+ get
10
+ post
11
+ patch
12
+ delete
13
+ ].freeze
14
+
15
+ OBJECT_PARENTS = %w[
16
+ salesQuotes
17
+ ].freeze
18
+
19
+ def initialize(client, parent: 'salesQuotes', parent_id:, **args)
20
+ return if !valid_parent?(parent)
21
+
22
+ super(client, args)
23
+ @parent_path << {
24
+ path: parent,
25
+ id: parent_id
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class ShipmentMethod < Base
6
+ OBJECT = 'shipmentMethods'
7
+
8
+ OBJECT_METHODS = %i[
9
+ get
10
+ post
11
+ patch
12
+ delete
13
+ ].freeze
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class Subscription < Base
6
+ OBJECT = 'subscriptions'
7
+
8
+ OBJECT_METHODS = %i[
9
+ get
10
+ post
11
+ patch
12
+ delete
13
+ ].freeze
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class TaxArea < Base
6
+ OBJECT = 'taxAreas'
7
+
8
+ OBJECT_METHODS = %i[
9
+ get
10
+ post
11
+ patch
12
+ delete
13
+ ].freeze
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class TaxGroup < Base
6
+ OBJECT = 'taxGroups'
7
+
8
+ OBJECT_METHODS = %i[
9
+ get
10
+ post
11
+ patch
12
+ delete
13
+ ].freeze
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BusinessCentral
4
+ module Object
5
+ class TimeRegistrationEntry < Base
6
+ OBJECT = 'timeRegistrationEntries'
7
+
8
+ OBJECT_METHODS = %i[
9
+ get
10
+ post
11
+ patch
12
+ delete
13
+ ].freeze
14
+ end
15
+ end
16
+ end