business_central 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +37 -0
- data/Gemfile +4 -0
- data/LICENSE +373 -0
- data/README.md +67 -0
- data/Rakefile +41 -0
- data/azure-pipelines.yml +30 -0
- data/business_central.gemspec +31 -0
- data/lib/business_central/account.rb +9 -0
- data/lib/business_central/aged_accounts_payable.rb +10 -0
- data/lib/business_central/aged_accounts_receivable.rb +10 -0
- data/lib/business_central/api_methods.rb +220 -0
- data/lib/business_central/balance_sheet.rb +10 -0
- data/lib/business_central/base.rb +56 -0
- data/lib/business_central/cash_flow_statement.rb +10 -0
- data/lib/business_central/client.rb +128 -0
- data/lib/business_central/company.rb +9 -0
- data/lib/business_central/company_information.rb +10 -0
- data/lib/business_central/countries_region.rb +9 -0
- data/lib/business_central/currency.rb +9 -0
- data/lib/business_central/customer.rb +9 -0
- data/lib/business_central/customer_financial_details.rb +10 -0
- data/lib/business_central/customer_payment.rb +14 -0
- data/lib/business_central/customer_payments_journal.rb +10 -0
- data/lib/business_central/customer_sales.rb +10 -0
- data/lib/business_central/dimension.rb +10 -0
- data/lib/business_central/dimension_line.rb +14 -0
- data/lib/business_central/employee.rb +10 -0
- data/lib/business_central/general_ledger_entry.rb +10 -0
- data/lib/business_central/income_statement.rb +10 -0
- data/lib/business_central/irs_1099_code.rb +10 -0
- data/lib/business_central/item.rb +10 -0
- data/lib/business_central/item_category.rb +10 -0
- data/lib/business_central/journal.rb +10 -0
- data/lib/business_central/journal_line.rb +14 -0
- data/lib/business_central/payment_method.rb +10 -0
- data/lib/business_central/payment_term.rb +10 -0
- data/lib/business_central/picture.rb +10 -0
- data/lib/business_central/purchase_invoice.rb +10 -0
- data/lib/business_central/purchase_invoice_line.rb +43 -0
- data/lib/business_central/request_builder.rb +60 -0
- data/lib/business_central/response/response_handler.rb +57 -0
- data/lib/business_central/retained_earnings_statement.rb +9 -0
- data/lib/business_central/sales_credit_memo.rb +10 -0
- data/lib/business_central/sales_credit_memo_line.rb +14 -0
- data/lib/business_central/sales_invoice.rb +10 -0
- data/lib/business_central/sales_invoice_line.rb +25 -0
- data/lib/business_central/sales_order.rb +9 -0
- data/lib/business_central/sales_order_line.rb +14 -0
- data/lib/business_central/sales_quote.rb +10 -0
- data/lib/business_central/sales_quote_line.rb +14 -0
- data/lib/business_central/shipment_method.rb +10 -0
- data/lib/business_central/subscription.rb +63 -0
- data/lib/business_central/tax_area.rb +10 -0
- data/lib/business_central/tax_group.rb +10 -0
- data/lib/business_central/trial_balance.rb +10 -0
- data/lib/business_central/unit_of_measure.rb +10 -0
- data/lib/business_central/url_builder.rb +33 -0
- data/lib/business_central/vendor.rb +10 -0
- data/lib/business_central/vendor_purchase.rb +10 -0
- data/lib/business_central/version.rb +3 -0
- data/lib/business_central.rb +67 -0
- data/test/business_central/account_test.rb +26 -0
- data/test/business_central/aged_accounts_payable_test.rb +8 -0
- data/test/business_central/aged_accounts_receivable_test.rb +8 -0
- data/test/business_central/base_test.rb +28 -0
- data/test/business_central/company_information_test.rb +8 -0
- data/test/business_central/company_test.rb +27 -0
- data/test/business_central/countries_region_test.rb +69 -0
- data/test/business_central/currency_test.rb +8 -0
- data/test/business_central/customer_financial_details_test.rb +20 -0
- data/test/business_central/customer_payment_test.rb +8 -0
- data/test/business_central/customer_payments_journal_test.rb +8 -0
- data/test/business_central/customer_sales_test.rb +8 -0
- data/test/business_central/customer_test.rb +138 -0
- data/test/business_central/dimension_line_test.rb +8 -0
- data/test/business_central/dimension_test.rb +8 -0
- data/test/business_central/employee_test.rb +8 -0
- data/test/business_central/general_ledger_entry_test.rb +8 -0
- data/test/business_central/income_statement_test.rb +8 -0
- data/test/business_central/irs_1099_code_test.rb +8 -0
- data/test/business_central/item_category_test.rb +8 -0
- data/test/business_central/item_test.rb +8 -0
- data/test/business_central/journal_line_test.rb +8 -0
- data/test/business_central/journal_test.rb +8 -0
- data/test/business_central/payment_method_test.rb +8 -0
- data/test/business_central/payment_term_test.rb +27 -0
- data/test/business_central/picture_test.rb +8 -0
- data/test/business_central/purchase_invoice_line_test.rb +33 -0
- data/test/business_central/purchase_invoice_test.rb +8 -0
- data/test/business_central/request_builder_test.rb +43 -0
- data/test/business_central/response/response_handler_test.rb +58 -0
- data/test/business_central/sales_credit_memo_line_test.rb +8 -0
- data/test/business_central/sales_credit_memo_test.rb +8 -0
- data/test/business_central/sales_invoice_line_test.rb +58 -0
- data/test/business_central/sales_invoice_test.rb +40 -0
- data/test/business_central/sales_order_line_test.rb +8 -0
- data/test/business_central/sales_order_test.rb +32 -0
- data/test/business_central/sales_quote_line_test.rb +8 -0
- data/test/business_central/sales_quote_test.rb +8 -0
- data/test/business_central/shipment_method_test.rb +19 -0
- data/test/business_central/subscription_test.rb +0 -0
- data/test/business_central/tax_area_test.rb +19 -0
- data/test/business_central/tax_group_test.rb +19 -0
- data/test/business_central/trial_balance_test.rb +8 -0
- data/test/business_central/unit_of_measure_test.rb +19 -0
- data/test/business_central/url_builder_test.rb +19 -0
- data/test/business_central/vendor_purchase_test.rb +8 -0
- data/test/business_central/vendor_test.rb +8 -0
- data/test/client_test.rb +72 -0
- data/test/fixtures/filter_customers_200.json +1 -0
- data/test/fixtures/get_account_200.json +1 -0
- data/test/fixtures/get_accounts_200.json +1 -0
- data/test/fixtures/get_companies_200.json +1 -0
- data/test/fixtures/get_company_200.json +1 -0
- data/test/fixtures/get_countriesRegion_200.json +1 -0
- data/test/fixtures/get_countriesRegions_200.json +1 -0
- data/test/fixtures/get_currencies_200.json +1 -0
- data/test/fixtures/get_currency_200.json +1 -0
- data/test/fixtures/get_customer_200.json +1 -0
- data/test/fixtures/get_customer_expanded_200.json +1 -0
- data/test/fixtures/get_customer_financial_details_200.json +1 -0
- data/test/fixtures/get_customers_200.json +1 -0
- data/test/fixtures/get_paymentMethod_200.json +1 -0
- data/test/fixtures/get_paymentMethods_200.json +1 -0
- data/test/fixtures/get_paymentTerm_200.json +1 -0
- data/test/fixtures/get_paymentTerms_200.json +1 -0
- data/test/fixtures/get_purchaseInvoiceLine_200.json +1 -0
- data/test/fixtures/get_purchaseInvoiceLines_200.json +1 -0
- data/test/fixtures/get_purchaseInvoice_200.json +1 -0
- data/test/fixtures/get_purchase_invoices_200.json +1 -0
- data/test/fixtures/get_salesInvoiceLine_200.json +1 -0
- data/test/fixtures/get_salesInvoiceLines_200.json +1 -0
- data/test/fixtures/get_salesInvoiceLines_single_200.json +1 -0
- data/test/fixtures/get_salesInvoice_200.json +1 -0
- data/test/fixtures/get_salesInvoices_200.json +1 -0
- data/test/fixtures/get_salesOrder_200.json +1 -0
- data/test/fixtures/get_salesOrders_200.json +1 -0
- data/test/fixtures/get_shipmentMethods_200.json +1 -0
- data/test/fixtures/get_taxAreas_200.json +1 -0
- data/test/fixtures/get_taxGroups_200.json +1 -0
- data/test/fixtures/get_unitsOfMeasure_200.json +1 -0
- data/test/fixtures/patch_countriesRegion_200.json +1 -0
- data/test/fixtures/patch_customer_200.json +1 -0
- data/test/fixtures/post_countriesRegion_200.json +1 -0
- data/test/fixtures/post_customer_200.json +1 -0
- data/test/fixtures/post_customer_409.json +1 -0
- data/test/fixtures/post_salesInvoiceLine_200.json +1 -0
- data/test/fixtures/post_salesInvoice_200.json +1 -0
- data/test/fixtures/post_subscription_200.json +1 -0
- data/test/test_helper.rb +86 -0
- metadata +408 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Provides access to the /purchaseInvoices/{Id}/purchaseInvoiceLines API
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
module BusinessCentral
|
|
6
|
+
class PurchaseInvoiceLine < BusinessCentral::Base
|
|
7
|
+
API_OBJECT_PARENT = "purchaseInvoices"
|
|
8
|
+
API_OBJECT = "purchaseInvoiceLines"
|
|
9
|
+
|
|
10
|
+
def get(purchase_invoice_id, purchase_invoice_line_id = nil)
|
|
11
|
+
get_child(purchase_invoice_id, purchase_invoice_line_id)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def create(purchase_invoice_id, data)
|
|
15
|
+
url = build_url(purchase_invoice_id, nil)
|
|
16
|
+
|
|
17
|
+
response = @client.post(url, data)
|
|
18
|
+
handle_error(response)
|
|
19
|
+
results = process(response)
|
|
20
|
+
|
|
21
|
+
return results.first
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def update(purchase_invoice_id, purchase_invoice_line_id, etag, data)
|
|
25
|
+
url = build_url(purchase_invoice_id, purchase_invoice_line_id)
|
|
26
|
+
|
|
27
|
+
response = @client.patch(url, etag, data)
|
|
28
|
+
handle_error(repsonse)
|
|
29
|
+
results = process(response)
|
|
30
|
+
|
|
31
|
+
return results.first
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def delete(purchase_invoice_id, purchase_invoice_line_id, etag)
|
|
35
|
+
url = build_url(purchase_invoice_id, purchase_invoice_line_id)
|
|
36
|
+
|
|
37
|
+
response = @client.delete(url, etag)
|
|
38
|
+
handle_error(response)
|
|
39
|
+
|
|
40
|
+
return response.code
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
##
|
|
2
|
+
# An object to build the request object
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
class BusinessCentral::RequestBuilder
|
|
6
|
+
attr_accessor :request
|
|
7
|
+
attr_reader :verb, :url, :etag, :data
|
|
8
|
+
|
|
9
|
+
# @param client [BusinessCentral::Client]
|
|
10
|
+
# @param opts [Hash] Options used to build the request
|
|
11
|
+
#
|
|
12
|
+
def initialize(client, opts = {})
|
|
13
|
+
@client = client
|
|
14
|
+
@verb = opts[:verb] if opts.has_key?(:verb)
|
|
15
|
+
@url = opts[:url] if opts.has_key?(:url)
|
|
16
|
+
@etag = opts[:etag] if opts.has_key?(:etag)
|
|
17
|
+
@data = opts[:data] if opts.has_key?(:data)
|
|
18
|
+
build
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Create the appropriate request object
|
|
22
|
+
#
|
|
23
|
+
# Populates @request with the constructed object
|
|
24
|
+
def build
|
|
25
|
+
@request = request_object.new(uri)
|
|
26
|
+
@request.content_type = "application/json"
|
|
27
|
+
@request.basic_auth(@client.api_username, @client.api_password)
|
|
28
|
+
add_etag
|
|
29
|
+
add_data
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# If an etag is supplied, add it to the request in an ['If-Match'] header
|
|
33
|
+
#
|
|
34
|
+
def add_etag
|
|
35
|
+
return if @etag.nil?
|
|
36
|
+
@request['If-Match'] = @etag
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# If form data is supplied, add it to the request body as JSON
|
|
40
|
+
#
|
|
41
|
+
def add_data
|
|
42
|
+
return if @data.nil?
|
|
43
|
+
@request.body = JSON.generate(@data)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @returns [Net::HTTP::Request] object, based on the verb supplied in the
|
|
47
|
+
# initialization opts Hash
|
|
48
|
+
#
|
|
49
|
+
def request_object
|
|
50
|
+
Object.const_get("Net::HTTP::#{@verb.capitalize}")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Contstruct URI for the request
|
|
54
|
+
#
|
|
55
|
+
# @returns [URI]
|
|
56
|
+
#
|
|
57
|
+
def uri
|
|
58
|
+
URI(@client.base_url + @url)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Provides the interface to convert the JSON response from the API
|
|
3
|
+
# to a Ruby Object
|
|
4
|
+
#
|
|
5
|
+
module BusinessCentral::Response
|
|
6
|
+
class ResponseHandler
|
|
7
|
+
attr_accessor :dataset
|
|
8
|
+
attr_accessor :compiled_data
|
|
9
|
+
|
|
10
|
+
# Constructor
|
|
11
|
+
#
|
|
12
|
+
# @param dataset [Hash | Array] the result from the API operation
|
|
13
|
+
#
|
|
14
|
+
def initialize(dataset)
|
|
15
|
+
@compiled_data = []
|
|
16
|
+
@dataset = dataset
|
|
17
|
+
process
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Compiles the data in the @dataset to the supplied class
|
|
21
|
+
#
|
|
22
|
+
def process
|
|
23
|
+
@dataset.is_a?(Array) ? process_array : process_data(@dataset)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# If the supplied result from the API operation is an array, iterate over
|
|
27
|
+
# it and process each result into @compiled_data
|
|
28
|
+
#
|
|
29
|
+
def process_array
|
|
30
|
+
@dataset.each { |data| process_data(data) }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Parse the JSON response from the API into an OpenStruct object. This will
|
|
34
|
+
# also parse any child objects, which allows the data to be accessed via
|
|
35
|
+
# regular chaining
|
|
36
|
+
#
|
|
37
|
+
# eg
|
|
38
|
+
# company.address.state
|
|
39
|
+
#
|
|
40
|
+
# @param data [JSON]
|
|
41
|
+
#
|
|
42
|
+
def process_data(data)
|
|
43
|
+
new_record = JSON.parse(sanitize(data), object_class: OpenStruct)
|
|
44
|
+
|
|
45
|
+
unless data["@odata.etag"].nil?
|
|
46
|
+
new_record.etag = data["@odata.etag"]
|
|
47
|
+
end
|
|
48
|
+
@compiled_data << new_record
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Ensures the data is in JSON format
|
|
52
|
+
#
|
|
53
|
+
def sanitize(data)
|
|
54
|
+
data.is_a?(Hash) ? data.to_json : data
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Provides access to the /salesCreditMemos/{Id}/salesCreditMemoLines API
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
module BusinessCentral
|
|
6
|
+
class SalesCreditMemoLine < BusinessCentral::Base
|
|
7
|
+
API_OBJECT_PARENT = "salesCreditMemos"
|
|
8
|
+
API_OBJECT = "salesCreditMemoLines"
|
|
9
|
+
|
|
10
|
+
def get(sales_credit_memo_id, sales_credit_memo_line_id = nil)
|
|
11
|
+
get_child(sales_credit_memo_id, sales_credit_memo_line_id)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Provides access to the /salesInvoices/{Id}/salesInvoiceLines API
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
module BusinessCentral
|
|
6
|
+
class SalesInvoiceLine < BusinessCentral::Base
|
|
7
|
+
API_OBJECT_PARENT = "salesInvoices"
|
|
8
|
+
API_OBJECT = "salesInvoiceLines"
|
|
9
|
+
|
|
10
|
+
SUPPORTED_METHODS = [:get, :create, :update, :delete]
|
|
11
|
+
|
|
12
|
+
def get(sales_invoice_id, sales_invoice_line_id = nil)
|
|
13
|
+
get_child(sales_invoice_id, sales_invoice_line_id)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def create(sales_invoice_id, data)
|
|
17
|
+
url = "/#{API_OBJECT_PARENT}(#{sales_invoice_id})/#{API_OBJECT}"
|
|
18
|
+
|
|
19
|
+
response = @client.post(url, data)
|
|
20
|
+
handle_error(response)
|
|
21
|
+
result = process(response)
|
|
22
|
+
return result.first
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Provides access to the /salesOrders/{Id}/salesOrdersLines api
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
module BusinessCentral
|
|
6
|
+
class SalesOrderLine < BusinessCentral::Base
|
|
7
|
+
API_OBJECT_PARENT = "salesOrders"
|
|
8
|
+
API_OBEJCT = "salesOrderLines"
|
|
9
|
+
|
|
10
|
+
def get(sales_order_id, sales_order_line_id = nil)
|
|
11
|
+
get_child(sales_order_id, sales_order_line_id)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Provides access to the /salesQuotes/{Id}/salesQuotesLines API
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
module BusinessCentral
|
|
6
|
+
class SalesQuoteLine < BusinessCentral::Base
|
|
7
|
+
API_OBJECT_PARENT = "salesQuotes"
|
|
8
|
+
API_OBJECT = "salesQuoteLines"
|
|
9
|
+
|
|
10
|
+
def get(sales_quote_id, sales_quote_line_id = nil)
|
|
11
|
+
get_child(sales_quote_id, sales_quote_line_id)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Access the /subscriptions API on BusinessCentral
|
|
3
|
+
#
|
|
4
|
+
# Allows the registration of Webhooks to receive notifications of updates to
|
|
5
|
+
# various resources
|
|
6
|
+
#
|
|
7
|
+
# The system uses a slightly different URL for the registration process. It
|
|
8
|
+
# doesn't include the TenantID (eg /companies(XXXX)) in the POST url
|
|
9
|
+
|
|
10
|
+
module BusinessCentral
|
|
11
|
+
class Subscription < BusinessCentral::Base
|
|
12
|
+
API_OBJECT = "subscriptions"
|
|
13
|
+
SUPPORTED_METHODS = [:post]
|
|
14
|
+
|
|
15
|
+
attr_reader :resource, :endpoint, :client
|
|
16
|
+
|
|
17
|
+
def initialize(client, resource, endpoint)
|
|
18
|
+
@client = client.nil? ? BusinessCentral::Client.new() : client
|
|
19
|
+
@resource = resource
|
|
20
|
+
@endpoint = endpoint
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def get
|
|
24
|
+
request = Net::HTTP::Get.new(URI(request_url))
|
|
25
|
+
request.content_type = "application/json"
|
|
26
|
+
request.basic_auth(@client.api_username, @client.api_password)
|
|
27
|
+
response = perform_request(request)
|
|
28
|
+
JSON.parse(response.body)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def create
|
|
32
|
+
request = Net::HTTP::Post.new(URI(request_url))
|
|
33
|
+
request.content_type = "application/json"
|
|
34
|
+
request.basic_auth(@client.api_username, @client.api_password)
|
|
35
|
+
request.body = JSON.generate(post_data)
|
|
36
|
+
request
|
|
37
|
+
|
|
38
|
+
response = perform_request(request)
|
|
39
|
+
|
|
40
|
+
JSON.parse(response.body)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def perform_request(request)
|
|
44
|
+
Net::HTTP.start(request.uri.hostname, request.uri.port, use_ssl: true) do |http|
|
|
45
|
+
http.request(request)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def request_url
|
|
50
|
+
"#{@client.api_host}#{@client.api_version}#{@client.api_path}/subscriptions"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def post_data
|
|
54
|
+
{
|
|
55
|
+
"notificationUrl": @endpoint,
|
|
56
|
+
"resource": @resource
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def build_request_object
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Builds URLs for API access
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
module BusinessCentral
|
|
6
|
+
class URLBuilder
|
|
7
|
+
attr_reader :url
|
|
8
|
+
attr_reader :parent_path, :parent_id
|
|
9
|
+
attr_reader :child_path, :child_id, :sequence
|
|
10
|
+
|
|
11
|
+
# @param parent_path [String] The path for the parent object
|
|
12
|
+
# @param parent_id [String] The object ID
|
|
13
|
+
# @param options [Hash] any associated child object
|
|
14
|
+
#
|
|
15
|
+
def initialize(parent_path, parent_id, options = {})
|
|
16
|
+
@url = ""
|
|
17
|
+
@parent_path = parent_path
|
|
18
|
+
@parent_id = parent_id
|
|
19
|
+
@child_path = options.fetch(:child_path, nil)
|
|
20
|
+
@child_id = options.fetch(:child_id, nil)
|
|
21
|
+
@sequence = options.fetch(:sequence, nil)
|
|
22
|
+
build
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Creates the URL string from the provided options
|
|
26
|
+
#
|
|
27
|
+
def build
|
|
28
|
+
@url = "/#{@parent_path}(#{@parent_id})"
|
|
29
|
+
@url += "/#{@child_path}" unless @child_path.nil?
|
|
30
|
+
@url += "(#{@child_id})" unless @child_id.nil?
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'json'
|
|
3
|
+
|
|
4
|
+
require 'business_central/api_methods'
|
|
5
|
+
require 'business_central/base'
|
|
6
|
+
require 'business_central/request_builder'
|
|
7
|
+
require 'business_central/url_builder'
|
|
8
|
+
require 'business_central/client'
|
|
9
|
+
require 'business_central/version'
|
|
10
|
+
require 'business_central/response/response_handler'
|
|
11
|
+
|
|
12
|
+
require 'business_central/account'
|
|
13
|
+
require 'business_central/aged_accounts_payable'
|
|
14
|
+
require 'business_central/aged_accounts_receivable'
|
|
15
|
+
require 'business_central/balance_sheet'
|
|
16
|
+
require 'business_central/cash_flow_statement'
|
|
17
|
+
require 'business_central/company'
|
|
18
|
+
require 'business_central/company_information'
|
|
19
|
+
require 'business_central/countries_region'
|
|
20
|
+
require 'business_central/currency'
|
|
21
|
+
require 'business_central/customer'
|
|
22
|
+
require 'business_central/customer_financial_details'
|
|
23
|
+
require 'business_central/customer_payment'
|
|
24
|
+
require 'business_central/customer_payments_journal'
|
|
25
|
+
require 'business_central/customer_sales'
|
|
26
|
+
require 'business_central/dimension'
|
|
27
|
+
require 'business_central/dimension_line'
|
|
28
|
+
require 'business_central/employee'
|
|
29
|
+
require 'business_central/general_ledger_entry'
|
|
30
|
+
require 'business_central/income_statement'
|
|
31
|
+
require 'business_central/irs_1099_code'
|
|
32
|
+
require 'business_central/item'
|
|
33
|
+
require 'business_central/item_category'
|
|
34
|
+
require 'business_central/journal'
|
|
35
|
+
require 'business_central/journal_line'
|
|
36
|
+
require 'business_central/payment_method'
|
|
37
|
+
require 'business_central/payment_term'
|
|
38
|
+
require 'business_central/picture'
|
|
39
|
+
require 'business_central/purchase_invoice'
|
|
40
|
+
require 'business_central/purchase_invoice_line'
|
|
41
|
+
require 'business_central/retained_earnings_statement'
|
|
42
|
+
require 'business_central/sales_credit_memo'
|
|
43
|
+
require 'business_central/sales_credit_memo_line'
|
|
44
|
+
require 'business_central/sales_invoice'
|
|
45
|
+
require 'business_central/sales_invoice_line'
|
|
46
|
+
require 'business_central/sales_order'
|
|
47
|
+
require 'business_central/sales_order_line'
|
|
48
|
+
require 'business_central/sales_quote'
|
|
49
|
+
require 'business_central/sales_quote_line'
|
|
50
|
+
require 'business_central/shipment_method'
|
|
51
|
+
require 'business_central/subscription'
|
|
52
|
+
require 'business_central/tax_area'
|
|
53
|
+
require 'business_central/tax_group'
|
|
54
|
+
require 'business_central/trial_balance'
|
|
55
|
+
require 'business_central/unit_of_measure'
|
|
56
|
+
require 'business_central/vendor'
|
|
57
|
+
require 'business_central/vendor_purchase'
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
module BusinessCentral
|
|
61
|
+
API_PATH = "/api/v1.0"
|
|
62
|
+
API_VERSION = "/v1.0"
|
|
63
|
+
ENDPOINT_TEST = "https://api.businesscentral.dynamics.com"
|
|
64
|
+
ENDPOINT_PRODUCTION = "https://api.businesscentral.dynamics.com"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
ServiceUnavailableError = Class.new(StandardError)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class BusinessCentral::AccountTest < Test::Unit::TestCase
|
|
4
|
+
def test_initialize
|
|
5
|
+
api_account = BusinessCentral::Account.new(bc_client)
|
|
6
|
+
assert_not_nil api_account
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def test_get_accounts
|
|
10
|
+
stub_get("accounts").
|
|
11
|
+
with(headers: stub_headers).
|
|
12
|
+
to_return( status: 200, body: fixture("get_accounts_200.json"))
|
|
13
|
+
|
|
14
|
+
accounts = BusinessCentral::Account.new(bc_client).get
|
|
15
|
+
assert accounts.length > 0
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_get_account
|
|
19
|
+
stub_get("accounts(1234)").
|
|
20
|
+
with(headers: stub_headers).
|
|
21
|
+
to_return(status: 200, body: fixture("get_account_200.json"))
|
|
22
|
+
|
|
23
|
+
account = BusinessCentral::Account.new(bc_client).get("1234")
|
|
24
|
+
assert_equal "Depreciation, Equipment", account.displayName
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class BusinessCentral::BaseTest < Test::Unit::TestCase
|
|
4
|
+
def setup
|
|
5
|
+
BusinessCentral::Base.const_set("API_OBJECT", "bar")
|
|
6
|
+
BusinessCentral::Base.const_set("API_OBJECT_PARENT", "foo")
|
|
7
|
+
BusinessCentral::Base.const_set("SUPPORTED_METHODS", [:get])
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
test "should initialize with a client" do
|
|
11
|
+
base = BusinessCentral::Base.new(bc_client)
|
|
12
|
+
assert_not_nil base
|
|
13
|
+
assert_not_nil base.client
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
test "should build a URL with only a single parameter" do
|
|
17
|
+
base = BusinessCentral::Base.new(bc_client)
|
|
18
|
+
# base.const_set(API_OBJECT, "foo")
|
|
19
|
+
url = base.build_url("1234")
|
|
20
|
+
assert_equal '/foo(1234)/bar', url
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
test "should build a URL with multiple parameters" do
|
|
24
|
+
base = BusinessCentral::Base.new(bc_client)
|
|
25
|
+
url = base.build_url("1234", "4321")
|
|
26
|
+
assert_equal "/foo(1234)/bar(4321)", url
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class BusinessCentral::CompanyTest < Test::Unit::TestCase
|
|
4
|
+
def test_initialize
|
|
5
|
+
api_company = BusinessCentral::Company.new(bc_client)
|
|
6
|
+
assert_not_nil api_company
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def test_company_success
|
|
10
|
+
stub_get("companies(1234)").
|
|
11
|
+
with(headers: stub_headers).
|
|
12
|
+
to_return(status: 200, body: fixture("get_company_200.json"))
|
|
13
|
+
|
|
14
|
+
company = BusinessCentral::Company.new(bc_client).get("1234")
|
|
15
|
+
assert_equal "CRONUS AU", company.name
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_companies_success
|
|
19
|
+
stub_get("companies").
|
|
20
|
+
with(headers: stub_headers).
|
|
21
|
+
to_return(status: 200, body: fixture("get_companies_200.json"))
|
|
22
|
+
|
|
23
|
+
companies = BusinessCentral::Company.new(bc_client).get
|
|
24
|
+
assert_equal 1, companies.length
|
|
25
|
+
assert_equal "CRONUS AU", companies.first.name
|
|
26
|
+
end
|
|
27
|
+
end
|