rconomic 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
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