rconomic 0.5.1 → 0.5.2

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/LICENSE +6 -4
  4. data/README.md +19 -8
  5. data/Rakefile +9 -1
  6. data/lib/economic/account.rb +6 -6
  7. data/lib/economic/cash_book.rb +6 -6
  8. data/lib/economic/creditor.rb +26 -27
  9. data/lib/economic/current_invoice.rb +26 -1
  10. data/lib/economic/current_invoice_line.rb +17 -21
  11. data/lib/economic/debtor.rb +16 -5
  12. data/lib/economic/economic.wsdl +28493 -23200
  13. data/lib/economic/endpoint.rb +8 -1
  14. data/lib/economic/entity/handle.rb +2 -1
  15. data/lib/economic/invoice.rb +1 -0
  16. data/lib/economic/order.rb +66 -0
  17. data/lib/economic/proxies/actions/find_by_number.rb +1 -1
  18. data/lib/economic/proxies/actions/find_by_telephone_and_fax_number.rb +18 -0
  19. data/lib/economic/proxies/debtor_proxy.rb +63 -0
  20. data/lib/economic/proxies/entity_proxy.rb +0 -1
  21. data/lib/economic/proxies/order_proxy.rb +18 -0
  22. data/lib/economic/session.rb +37 -12
  23. data/lib/rconomic.rb +2 -0
  24. data/lib/rconomic/version.rb +1 -1
  25. data/rconomic.gemspec +1 -1
  26. data/spec/economic/account_spec.rb +34 -0
  27. data/spec/economic/cash_book_spec.rb +28 -0
  28. data/spec/economic/creditor_spec.rb +19 -0
  29. data/spec/economic/current_invoice_line_spec.rb +21 -0
  30. data/spec/economic/debtor_spec.rb +33 -8
  31. data/spec/economic/endpoint_spec.rb +18 -0
  32. data/spec/economic/entity/handle_spec.rb +2 -2
  33. data/spec/economic/order_spec.rb +80 -0
  34. data/spec/economic/proxies/debtor_contact_proxy_spec.rb +1 -1
  35. data/spec/economic/proxies/debtor_proxy_spec.rb +69 -0
  36. data/spec/economic/proxies/order_proxy_spec.rb +67 -0
  37. data/spec/economic/session_spec.rb +99 -11
  38. data/spec/fixtures/cash_book_update_from_data/success.xml +14 -0
  39. data/spec/fixtures/connect_with_token/success.xml +8 -0
  40. data/spec/fixtures/creditor_create_from_data/success.xml +49 -0
  41. data/spec/fixtures/current_invoice_line_create_from_data/success.xml +42 -0
  42. data/spec/fixtures/debtor_find_by_telephone_and_fax_number/found.xml +12 -0
  43. data/spec/fixtures/debtor_find_by_telephone_and_fax_number/not_found.xml +7 -0
  44. data/spec/fixtures/debtor_get_debtor_contacts/multiple.xml +15 -0
  45. data/spec/fixtures/debtor_get_debtor_contacts/none.xml +9 -0
  46. data/spec/fixtures/debtor_get_invoices/success.xml +15 -0
  47. data/spec/fixtures/debtor_get_orders/success.xml +12 -0
  48. data/spec/fixtures/order_find_by_date_interval/many.xml +15 -0
  49. data/spec/fixtures/order_find_by_date_interval/none.xml +9 -0
  50. data/spec/fixtures/order_find_by_date_interval/single.xml +12 -0
  51. data/spec/fixtures/order_get_data/success.xml +75 -0
  52. data/spec/fixtures/order_get_data_array/multiple.xml +145 -0
  53. data/spec/fixtures/order_get_data_array/single.xml +77 -0
  54. data/spec/fixtures/order_get_pdf/success.xml +8 -0
  55. metadata +28 -4
@@ -2,6 +2,11 @@
2
2
  #
3
3
  # This is where all knowledge of SOAP actions and requests exists.
4
4
  class Economic::Endpoint
5
+ extend Forwardable
6
+
7
+ def_delegator "client.globals", :logger, :logger=
8
+ def_delegator "client.globals", :log_level, :log_level=
9
+ def_delegator "client.globals", :log, :log=
5
10
 
6
11
  # Invokes soap_action on the API endpoint with the given data.
7
12
  #
@@ -27,7 +32,9 @@ class Economic::Endpoint
27
32
  # take several hundred megabytes of RAM after a while...)
28
33
  def client
29
34
  @@client ||= Savon.client do
30
- wsdl File.expand_path(File.join(File.dirname(__FILE__), "economic.wsdl"))
35
+ wsdl File.expand_path(File.join(File.dirname(__FILE__), "economic.wsdl"))
36
+ log false
37
+ log_level :info
31
38
  end
32
39
  end
33
40
 
@@ -12,6 +12,7 @@ class Economic::Entity
12
12
  :id => 'Id',
13
13
  :id1 => 'Id1',
14
14
  :id2 => 'Id2',
15
+ :name => 'Name',
15
16
  :number => 'Number',
16
17
  :serial_number => 'SerialNumber',
17
18
  :vat_code => 'VatCode'
@@ -35,7 +36,7 @@ class Economic::Entity
35
36
  verify_sanity_of_arguments!(hash)
36
37
  hash = prepare_hash_argument(hash) unless hash.is_a?(self.class)
37
38
 
38
- [:code, :vat_code].each do |key|
39
+ [:code, :name, :vat_code].each do |key|
39
40
  instance_variable_set("@#{key}", hash[key]) if hash[key]
40
41
  end
41
42
  [:id, :id1, :id2, :number, :serial_number].each do |key|
@@ -5,6 +5,7 @@ module Economic
5
5
  has_properties :number,
6
6
  :net_amount,
7
7
  :vat_amount,
8
+ :gross_amount,
8
9
  :due_date,
9
10
  :debtor_handle,
10
11
  :debtor_name,
@@ -0,0 +1,66 @@
1
+ require 'economic/entity'
2
+
3
+ module Economic
4
+ class Order < Entity
5
+ has_properties :number,
6
+ :net_amount,
7
+ :vat_amount,
8
+ :gross_amount,
9
+ :due_date,
10
+ :debtor_handle,
11
+ :debtor_name,
12
+ :debtor_name,
13
+ :debtor_address,
14
+ :debtor_postal_code,
15
+ :debtor_city,
16
+ :debtor_country,
17
+ :debtor_ean,
18
+ :attention_handle,
19
+ :heading
20
+
21
+ def attention
22
+ return nil if attention_handle.nil?
23
+ @attention ||= session.contacts.find(attention_handle)
24
+ end
25
+
26
+ def attention=(contact)
27
+ self.attention_handle = contact.handle
28
+ @attention = contact
29
+ end
30
+
31
+ def attention_handle=(handle)
32
+ @attention = nil unless handle == @attention_handle
33
+ @attention_handle = handle
34
+ end
35
+
36
+ def debtor
37
+ return nil if debtor_handle.nil?
38
+ @debtor ||= session.debtors.find(debtor_handle)
39
+ end
40
+
41
+ def debtor=(debtor)
42
+ self.debtor_handle = debtor.handle
43
+ @debtor = debtor
44
+ end
45
+
46
+ def debtor_handle=(handle)
47
+ @debtor = nil unless handle == @debtor_handle
48
+ @debtor_handle = handle
49
+ end
50
+
51
+ # Returns the PDF version of Invoice as a String.
52
+ #
53
+ # To get it as a file you can do:
54
+ #
55
+ # File.open("invoice.pdf", 'wb') do |file|
56
+ # file << invoice.pdf
57
+ # end
58
+ def pdf
59
+ response = request(:get_pdf, {
60
+ "orderHandle" => handle.to_hash
61
+ })
62
+
63
+ Base64.decode64(response)
64
+ end
65
+ end
66
+ end
@@ -5,7 +5,7 @@ module FindByNumber
5
5
  'number' => number
6
6
  })
7
7
 
8
- if response == {}
8
+ if response.empty?
9
9
  nil
10
10
  else
11
11
  entity = build
@@ -0,0 +1,18 @@
1
+ module FindByTelephoneAndFaxNumber
2
+ # Returns handle for debtor with phone or fax number.
3
+ def find_by_telephone_and_fax_number(number)
4
+ response = request('FindByTelephoneAndFaxNumber', {
5
+ 'telephoneAndFaxNumber' => number
6
+ })
7
+ if response == {}
8
+ nil
9
+ else
10
+ entity = build
11
+ entity.partial = true
12
+ entity.persisted = true
13
+ entity.handle = response[:debtor_handle]
14
+ entity.number = response[:debtor_handle][:number].to_i
15
+ entity
16
+ end
17
+ end
18
+ end
@@ -2,16 +2,79 @@ require 'economic/proxies/entity_proxy'
2
2
  require 'economic/proxies/actions/find_by_ci_number'
3
3
  require 'economic/proxies/actions/find_by_handle_with_number'
4
4
  require 'economic/proxies/actions/find_by_number'
5
+ require 'economic/proxies/actions/find_by_telephone_and_fax_number'
5
6
 
6
7
  module Economic
7
8
  class DebtorProxy < EntityProxy
8
9
  include FindByCiNumber
9
10
  include FindByHandleWithNumber
10
11
  include FindByNumber
12
+ include FindByTelephoneAndFaxNumber
11
13
 
12
14
  # Returns the next available debtor number
13
15
  def next_available_number
14
16
  request :get_next_available_number
15
17
  end
18
+
19
+ def get_debtor_contacts(debtor_handle)
20
+ response = request :get_debtor_contacts, {
21
+ 'debtorHandle' => { 'Number' => debtor_handle.number }
22
+ }
23
+ if response.empty?
24
+ nil
25
+ else
26
+ entities = []
27
+ [response[:debtor_contact_handle]].flatten.each do |handle|
28
+ entity = Economic::DebtorContact.new(:session => session)
29
+ entity.partial = true
30
+ entity.persisted = true
31
+ entity.handle = handle
32
+ entity.number = handle[:number].to_i
33
+ entities << entity
34
+ end
35
+ entities
36
+ end
37
+ end
38
+
39
+ def get_invoices(debtor_handle)
40
+ response = request :get_invoices, {
41
+ 'debtorHandle' => { 'Number' => debtor_handle.number }
42
+ }
43
+ if response.empty?
44
+ nil
45
+ else
46
+ entities = []
47
+ [response[:invoice_handle]].flatten.each do |handle|
48
+ entity = Economic::Invoice.new(:session => session)
49
+ entity.partial = true
50
+ entity.persisted = true
51
+ entity.handle = handle
52
+ entity.number = handle[:number].to_i
53
+ entities << entity
54
+ end
55
+ entities
56
+ end
57
+ end
58
+
59
+ # Returns handle for orders for debtor.
60
+ def get_orders(debtor_handle)
61
+ response = request :get_orders, {
62
+ 'debtorHandle' => { 'Number' => debtor_handle.number }
63
+ }
64
+ if response.empty?
65
+ nil
66
+ else
67
+ entities = []
68
+ [response[:order_handle]].flatten.each do |handle|
69
+ entity = Economic::Order.new(:session => session)
70
+ entity.partial = true
71
+ entity.persisted = true
72
+ entity.handle = handle
73
+ entity.number = handle[:id].to_i
74
+ entities << entity
75
+ end
76
+ entities
77
+ end
78
+ end
16
79
  end
17
80
  end
@@ -88,7 +88,6 @@ module Economic
88
88
  # Gets data for Entity from the API. Returns Hash with the response data
89
89
  def get_data(handle)
90
90
  handle = Entity::Handle.new(handle)
91
-
92
91
  entity_hash = request(:get_data, {
93
92
  'entityHandle' => handle.to_hash
94
93
  })
@@ -0,0 +1,18 @@
1
+ require 'economic/proxies/entity_proxy'
2
+ require 'economic/proxies/actions/find_by_date_interval'
3
+ require 'economic/proxies/actions/find_by_handle_with_number'
4
+
5
+ module Economic
6
+ class OrderProxy < EntityProxy
7
+ include FindByDateInterval
8
+ include FindByHandleWithNumber
9
+
10
+ def find(handle)
11
+ if handle.is_a?(Hash)
12
+ super handle
13
+ else
14
+ super({:id => handle})
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,26 +1,54 @@
1
+ require 'forwardable'
2
+
1
3
  module Economic
2
4
  # The Economic::Session contains details and behaviors for a current
3
5
  # connection to the API endpoint.
4
6
  class Session
7
+ extend Forwardable
8
+
9
+ def_delegators :endpoint, :logger=, :log_level=, :log=
10
+
5
11
  attr_accessor :agreement_number, :user_name, :password
6
12
  attr_reader :authentication_token
7
13
 
8
- def initialize(agreement_number, user_name, password)
14
+ def initialize(agreement_number = nil, user_name = nil, password = nil)
9
15
  self.agreement_number = agreement_number
10
16
  self.user_name = user_name
11
17
  self.password = password
18
+ yield endpoint if block_given?
12
19
  end
13
20
 
14
- # Authenticates with e-conomic
15
- def connect
21
+ def connect_with_token(private_app_id, access_id)
22
+ endpoint.call(
23
+ :connect_with_token,
24
+ {
25
+ :token => access_id,
26
+ :appToken => private_app_id
27
+ }
28
+ ) do |response|
29
+ store_authentication_token(response)
30
+ end
31
+ end
32
+
33
+ def connect_with_credentials(agreement_number, user_name, password)
16
34
  endpoint.call(
17
35
  :connect,
18
- authentication_details
36
+ {
37
+ :agreementNumber => agreement_number,
38
+ :userName => user_name,
39
+ :password => password
40
+ }
19
41
  ) do |response|
20
42
  store_authentication_token(response)
21
43
  end
22
44
  end
23
45
 
46
+ # Authenticates with E-conomic using credentials
47
+ # Assumes ::new was called with credentials as arguments.
48
+ def connect
49
+ connect_with_credentials(self.agreement_number, self.user_name, self.password)
50
+ end
51
+
24
52
  # Provides access to the DebtorContacts
25
53
  def contacts
26
54
  @contacts ||= DebtorContactProxy.new(self)
@@ -37,6 +65,11 @@ module Economic
37
65
  @invoices ||= InvoiceProxy.new(self)
38
66
  end
39
67
 
68
+ # Provides access to the orders
69
+ def orders
70
+ @orders ||= OrderProxy.new(self)
71
+ end
72
+
40
73
  # Provides access to the debtors
41
74
  def debtors
42
75
  @debtors ||= DebtorProxy.new(self)
@@ -88,14 +121,6 @@ module Economic
88
121
 
89
122
  private
90
123
 
91
- def authentication_details
92
- {
93
- :agreementNumber => self.agreement_number,
94
- :userName => self.user_name,
95
- :password => self.password
96
- }
97
- end
98
-
99
124
  def store_authentication_token(response)
100
125
  @authentication_token = response.http.cookies
101
126
  end
data/lib/rconomic.rb CHANGED
@@ -12,6 +12,7 @@ require 'economic/creditor_contact'
12
12
  require 'economic/current_invoice'
13
13
  require 'economic/current_invoice_line'
14
14
  require 'economic/invoice'
15
+ require 'economic/order'
15
16
  require 'economic/cash_book'
16
17
  require 'economic/cash_book_entry'
17
18
  require 'economic/account'
@@ -26,6 +27,7 @@ require 'economic/proxies/debtor_contact_proxy'
26
27
  require 'economic/proxies/creditor_proxy'
27
28
  require 'economic/proxies/creditor_contact_proxy'
28
29
  require 'economic/proxies/invoice_proxy'
30
+ require 'economic/proxies/order_proxy'
29
31
  require 'economic/proxies/cash_book_proxy'
30
32
  require 'economic/proxies/cash_book_entry_proxy'
31
33
  require 'economic/proxies/account_proxy'
@@ -1,3 +1,3 @@
1
1
  module Rconomic
2
- VERSION = "0.5.1"
2
+ VERSION = "0.5.2"
3
3
  end
data/rconomic.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.authors = ["Jakob Skjerning"]
14
14
  s.email = 'jakob@mentalized.net'
15
15
  s.homepage = 'https://github.com/lokalebasen/rconomic'
16
-
16
+ s.license = 'MIT'
17
17
  s.version = Rconomic::VERSION
18
18
  s.platform = Gem::Platform::RUBY
19
19
 
@@ -0,0 +1,34 @@
1
+ require './spec/spec_helper'
2
+
3
+ describe Economic::Account do
4
+ let(:session) { make_session }
5
+ subject { Economic::Account.new(:session => session) }
6
+
7
+ it "inherits from Economic::Entity" do
8
+ expect(Economic::Account.ancestors).to include(Economic::Entity)
9
+ end
10
+
11
+ describe "#save" do
12
+ it 'should save it' do
13
+ stub_request('Account_CreateFromData', nil, :success)
14
+ subject.save
15
+ end
16
+
17
+ it "builds and sends data to API" do
18
+ subject.handle = {"Name" => "Bob"}
19
+ subject.name = "Bob"
20
+ subject.number = 42
21
+ mock_request(
22
+ :account_create_from_data, {
23
+ "data" => {
24
+ "Handle" => {"Name" => "Bob"},
25
+ "Name" => "Bob",
26
+ "Number" => 42
27
+ }
28
+ },
29
+ :success
30
+ )
31
+ subject.save
32
+ end
33
+ end
34
+ end
@@ -31,4 +31,32 @@ describe Economic::CashBook do
31
31
  expect(subject.book).to eq(832)
32
32
  end
33
33
  end
34
+
35
+ describe "#save" do
36
+ before :each do
37
+ subject.persisted = true
38
+ end
39
+
40
+ it 'should save it' do
41
+ stub_request('CashBook_UpdateFromData', nil, :success)
42
+ subject.save
43
+ end
44
+
45
+ it "builds and sends data to API" do
46
+ subject.handle = {"Number" => 42}
47
+ subject.name = "Bob"
48
+ subject.number = 42
49
+ mock_request(
50
+ :cash_book_update_from_data, {
51
+ "data" => {
52
+ "Handle" => {"Number" => 42},
53
+ "Name" => "Bob",
54
+ "Number" => 42
55
+ }
56
+ },
57
+ :success
58
+ )
59
+ subject.save
60
+ end
61
+ end
34
62
  end
@@ -49,4 +49,23 @@ describe Economic::Creditor do
49
49
  end
50
50
  end
51
51
 
52
+ describe "#save" do
53
+ it 'should save it' do
54
+ stub_request('Creditor_CreateFromData', nil, :success)
55
+ subject.save
56
+ end
57
+
58
+ it "builds and sends data to API" do
59
+ mock_request(
60
+ :creditor_create_from_data, {
61
+ "data" => {
62
+ "Handle" => {},
63
+ "Number" => nil
64
+ }
65
+ },
66
+ :success
67
+ )
68
+ subject.save
69
+ end
70
+ end
52
71
  end