rconomic 0.4.1 → 0.5.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 (56) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +1 -2
  3. data/Gemfile +1 -0
  4. data/README.md +6 -1
  5. data/lib/economic/account.rb +5 -7
  6. data/lib/economic/cash_book.rb +8 -10
  7. data/lib/economic/cash_book_entry.rb +1 -1
  8. data/lib/economic/creditor.rb +1 -1
  9. data/lib/economic/creditor_contact.rb +2 -2
  10. data/lib/economic/current_invoice.rb +10 -13
  11. data/lib/economic/current_invoice_line.rb +3 -3
  12. data/lib/economic/debtor.rb +1 -1
  13. data/lib/economic/debtor_contact.rb +2 -2
  14. data/lib/economic/entity.rb +19 -19
  15. data/lib/economic/invoice.rb +6 -6
  16. data/lib/economic/proxies/account_proxy.rb +4 -6
  17. data/lib/economic/proxies/actions/find_by_ci_number.rb +3 -5
  18. data/lib/economic/proxies/actions/find_by_date_interval.rb +4 -7
  19. data/lib/economic/proxies/actions/find_by_name.rb +71 -0
  20. data/lib/economic/proxies/actions/find_by_number.rb +3 -5
  21. data/lib/economic/proxies/cash_book_entry_proxy.rb +16 -13
  22. data/lib/economic/proxies/cash_book_proxy.rb +7 -23
  23. data/lib/economic/proxies/creditor_contact_proxy.rb +6 -49
  24. data/lib/economic/proxies/creditor_entry_proxy.rb +13 -19
  25. data/lib/economic/proxies/creditor_proxy.rb +6 -8
  26. data/lib/economic/proxies/current_invoice_line_proxy.rb +3 -9
  27. data/lib/economic/proxies/current_invoice_proxy.rb +12 -20
  28. data/lib/economic/proxies/debtor_contact_proxy.rb +6 -49
  29. data/lib/economic/proxies/debtor_entry_proxy.rb +9 -14
  30. data/lib/economic/proxies/debtor_proxy.rb +1 -1
  31. data/lib/economic/proxies/entity_proxy.rb +21 -20
  32. data/lib/economic/proxies/entry_proxy.rb +14 -20
  33. data/lib/economic/session.rb +21 -12
  34. data/lib/economic/support/string.rb +5 -1
  35. data/lib/rconomic.rb +2 -1
  36. data/lib/rconomic/version.rb +1 -1
  37. data/rconomic.gemspec +0 -2
  38. data/spec/economic/current_invoice_spec.rb +1 -1
  39. data/spec/economic/entity_spec.rb +4 -3
  40. data/spec/economic/proxies/actions/find_by_name_spec.rb +48 -0
  41. data/spec/economic/proxies/cash_book_proxy_spec.rb +30 -5
  42. data/spec/economic/proxies/creditor_contact_proxy_spec.rb +10 -0
  43. data/spec/economic/proxies/current_invoice_line_proxy_spec.rb +3 -3
  44. data/spec/economic/proxies/current_invoice_proxy_spec.rb +5 -5
  45. data/spec/economic/proxies/debtor_contact_proxy_spec.rb +10 -1
  46. data/spec/economic/proxies/debtor_entry_proxy_spec.rb +2 -2
  47. data/spec/economic/proxies/invoice_proxy_spec.rb +3 -3
  48. data/spec/economic/session_spec.rb +44 -3
  49. data/spec/fixtures/cash_book_get_data/success.xml +14 -0
  50. data/spec/fixtures/cash_book_get_data_array/multiple.xml +23 -0
  51. data/spec/fixtures/creditor_contact_find_by_name/multiple.xml +15 -0
  52. data/spec/fixtures/creditor_contact_find_by_name/none.xml +9 -0
  53. data/spec/fixtures/debtor_contact_find_by_name/multiple.xml +15 -0
  54. data/spec/fixtures/debtor_contact_find_by_name/none.xml +9 -0
  55. data/spec/spec_helper.rb +6 -0
  56. metadata +10 -16
@@ -1,11 +1,9 @@
1
1
  module FindByNumber
2
2
  # Returns handle with a given number.
3
3
  def find_by_number(number)
4
- response = session.request(entity_class.soap_action('FindByNumber')) do
5
- soap.body = {
6
- 'number' => number
7
- }
8
- end
4
+ response = request('FindByNumber', {
5
+ 'number' => number
6
+ })
9
7
 
10
8
  if response == {}
11
9
  nil
@@ -3,9 +3,10 @@ require 'economic/proxies/entity_proxy'
3
3
  module Economic
4
4
  class CashBookEntryProxy < EntityProxy
5
5
  def all
6
- entity_hash = session.request(CashBookProxy.entity_class.soap_action(:get_entries)) do
7
- soap.body = { "cashBookHandle" => owner.handle.to_hash }
8
- end
6
+ entity_hash = session.request(
7
+ CashBookProxy.entity_class.soap_action_name(:get_entries),
8
+ {"cashBookHandle" => owner.handle.to_hash}
9
+ )
9
10
 
10
11
  if entity_hash != {}
11
12
  [ entity_hash.values.first ].flatten.each do |id_hash|
@@ -56,9 +57,12 @@ module Economic
56
57
  end
57
58
 
58
59
  def set_due_date(id, date)
59
- session.request(entity_class.soap_action("SetDueDate")) do
60
- soap.body = { 'cashBookEntryHandle' => { 'Id1' => owner.handle[:number], 'Id2' => id }, :value => date }
61
- end
60
+ request("SetDueDate", {
61
+ 'cashBookEntryHandle' => {
62
+ 'Id1' => owner.handle[:number], 'Id2' => id
63
+ },
64
+ :value => date
65
+ })
62
66
  end
63
67
 
64
68
  protected
@@ -67,13 +71,12 @@ module Economic
67
71
  handle_name = handle_name_for_action(action)
68
72
  handle_key = Economic::Support::String.underscore(handle_name).intern
69
73
 
70
- response = session.request(entity_class.soap_action(action)) do
71
- data = ActiveSupport::OrderedHash.new
72
- data["cashBookHandle"] = { 'Number' => owner.handle[:number] }
73
- data[handle_name] = { 'Number' => handles[handle_key][:number] } if handles[handle_key]
74
- data["contraAccountHandle"] = { 'Number' => handles[:contra_account_handle][:number] } if handles[:contra_account_handle]
75
- soap.body = data
76
- end
74
+ data = {}
75
+ data["cashBookHandle"] = { 'Number' => owner.handle[:number] }
76
+ data[handle_name] = { 'Number' => handles[handle_key][:number] } if handles[handle_key]
77
+ data["contraAccountHandle"] = { 'Number' => handles[:contra_account_handle][:number] } if handles[:contra_account_handle]
78
+
79
+ response = request(action, data)
77
80
 
78
81
  find(response)
79
82
  end
@@ -3,11 +3,9 @@ require 'economic/proxies/entity_proxy'
3
3
  module Economic
4
4
  class CashBookProxy < EntityProxy
5
5
  def find_by_name(name)
6
- response = session.request entity_class.soap_action('FindByName') do
7
- soap.body = {
8
- 'name' => name
9
- }
10
- end
6
+ response = request('FindByName', {
7
+ 'name' => name
8
+ })
11
9
 
12
10
  cash_book = build
13
11
  cash_book.partial = true
@@ -16,27 +14,13 @@ module Economic
16
14
  cash_book
17
15
 
18
16
  end
19
-
20
- def all
21
- response = session.request entity_class.soap_action('GetAll')
22
17
 
23
- handles = [response[:cash_book_handle]].flatten.reject(&:blank?)
24
- cash_books = []
25
- handles.each do |handle|
26
- cash_books << get_name(handle[:number])
27
- end
28
-
29
- cash_books
30
- end
31
-
32
18
  def get_name(id)
33
- response = session.request entity_class.soap_action("GetName") do
34
- soap.body = {
35
- 'cashBookHandle' => {
36
- 'Number' => id
37
- }
19
+ response = request("GetName", {
20
+ 'cashBookHandle' => {
21
+ 'Number' => id
38
22
  }
39
- end
23
+ })
40
24
 
41
25
  cash_book = build
42
26
  cash_book.number = id
@@ -2,63 +2,20 @@ require 'economic/proxies/entity_proxy'
2
2
 
3
3
  module Economic
4
4
  class CreditorContactProxy < EntityProxy
5
-
6
- # Returns a new, unpersisted Economic::CreditorContact
7
- def build(properties = {})
8
- contact = super
9
- initialize_properties_with_values_from_owner(contact) if owner.is_a?(Creditor)
10
- contact
11
- end
12
-
13
- # Gets data for CreditorContact from the API
14
- def find(handle)
15
- handle = Entity::Handle.build(:id => handle) unless handle.is_a?(Entity::Handle)
16
- super(handle)
17
- end
18
-
19
- # Returns CreditorContact that have the given name. The objects will only be partially loaded
5
+ # Returns CreditorContact that have the given name. The objects will only be
6
+ # partially loaded
20
7
  def find_by_name(name)
21
- # Get a list of CreditorContactHandles from e-conomic
22
- response = session.request entity_class.soap_action('FindByName') do
23
- soap.body = {
24
- 'name' => name
25
- }
26
- end
27
-
28
- # Make sure we always have an array of handles even if the result only contains one
29
- handles = [response[:creditor_contact_handle]].flatten.reject(&:blank?)
30
-
31
- # Create partial CreditorContact entities
32
- contacts = handles.collect do |handle|
33
- creditor_contact = build
34
- creditor_contact.partial = true
35
- creditor_contact.persisted = true
36
- creditor_contact.handle = handle
37
- creditor_contact.id = handle[:id]
38
- creditor_contact.number = handle[:number]
39
- creditor_contact
40
- end
41
-
42
- if owner.is_a?(Creditor)
43
- # Scope to the owner
44
- contacts.select do |creditor_contact|
45
- creditor_contact.get_data
46
- creditor_contact.creditor.handle == owner.handle
47
- end
48
- else
49
- contacts
50
- end
51
-
8
+ Proxies::Actions::FindByName.new(self, name).call
52
9
  end
53
10
 
54
-
55
11
  private
56
12
 
57
13
  # Initialize properties in contact with values from owner. Returns contact.
58
14
  def initialize_properties_with_values_from_owner(contact)
59
- contact.creditor = owner
15
+ if owner.is_a?(Creditor)
16
+ contact.creditor = owner
17
+ end
60
18
  contact
61
19
  end
62
-
63
20
  end
64
21
  end
@@ -3,11 +3,9 @@ require 'economic/proxies/entity_proxy'
3
3
  module Economic
4
4
  class CreditorEntryProxy < EntityProxy
5
5
  def find_by_invoice_number(invoice_number)
6
- response = session.request(entity_class.soap_action('FindByInvoiceNumber')) do
7
- soap.body = {
8
- 'invoiceNumber' => invoice_number
9
- }
10
- end
6
+ response = request('FindByInvoiceNumber', {
7
+ 'invoiceNumber' => invoice_number
8
+ })
11
9
 
12
10
  response[:creditor_entry_handle].map do |creditor_entry_handle|
13
11
  # Kinda ugly, but we get an array instead of a hash when there's only one result. :)
@@ -16,27 +14,23 @@ module Economic
16
14
  end
17
15
 
18
16
  def find(serial_number)
19
- response = session.request(entity_class.soap_action('GetData')) do
20
- soap.body = {
21
- 'entityHandle' => {
22
- 'SerialNumber' => serial_number
23
- }
24
- }
25
- end
17
+ response = request('GetData', {
18
+ 'entityHandle' => {
19
+ 'SerialNumber' => serial_number
20
+ }
21
+ })
26
22
 
27
23
  build(response)
28
24
  end
29
25
 
30
26
  def match(*serial_numbers)
31
- response = session.request(entity_class.soap_action('MatchEntries')) do
32
- soap.body = {
33
- :entries => {
34
- "CreditorEntryHandle" => serial_numbers.map { |serial_number|
35
- { "SerialNumber" => serial_number }
36
- }
27
+ response = request('MatchEntries', {
28
+ :entries => {
29
+ "CreditorEntryHandle" => serial_numbers.map { |serial_number|
30
+ { "SerialNumber" => serial_number }
37
31
  }
38
32
  }
39
- end
33
+ })
40
34
  end
41
35
  end
42
36
  end
@@ -10,14 +10,12 @@ module Economic
10
10
  include FindByNumber
11
11
 
12
12
  def create_simple(opts)
13
- response = session.request(entity_class.soap_action('Create')) do
14
- soap.body = {
15
- 'number' => opts[:number],
16
- 'creditorGroupHandle' => { 'Number' => opts[:creditor_group_handle][:number] },
17
- :name => opts[:name],
18
- :vatZone => opts[:vat_zone]
19
- }
20
- end
13
+ response = request('Create', {
14
+ 'number' => opts[:number],
15
+ 'creditorGroupHandle' => { 'Number' => opts[:creditor_group_handle][:number] },
16
+ :name => opts[:name],
17
+ :vatZone => opts[:vat_zone]
18
+ })
21
19
 
22
20
  find(response)
23
21
  end
@@ -2,13 +2,6 @@ require 'economic/proxies/entity_proxy'
2
2
 
3
3
  module Economic
4
4
  class CurrentInvoiceLineProxy < EntityProxy
5
- # Returns a new, unpersisted Economic::CurrentInvoiceLine
6
- def build(properties = {})
7
- invoice_line = super
8
- initialize_properties_with_values_from_owner(invoice_line) if owner.is_a?(CurrentInvoice)
9
- invoice_line
10
- end
11
-
12
5
  # Gets data for CurrentInvoiceLine from the API
13
6
  def find(handle)
14
7
  handle = Entity::Handle.build(:number => handle) unless handle.is_a?(Entity::Handle)
@@ -19,9 +12,10 @@ module Economic
19
12
 
20
13
  # Initialize properties in invoice_line with values from owner
21
14
  def initialize_properties_with_values_from_owner(invoice_line)
22
- invoice_line.invoice = owner
15
+ if owner.is_a?(CurrentInvoice)
16
+ invoice_line.invoice = owner
17
+ end
23
18
  invoice_line
24
19
  end
25
-
26
20
  end
27
21
  end
@@ -5,30 +5,22 @@ module Economic
5
5
  class CurrentInvoiceProxy < EntityProxy
6
6
  include FindByDateInterval
7
7
 
8
- # Returns a new, unpersisted Economic::CurrentInvoice
9
- def build(properties = {})
10
- invoice = super
11
- initialize_properties_with_values_from_owner(invoice) if owner.is_a?(Debtor)
12
- invoice
13
- end
14
-
15
8
  private
16
9
 
17
10
  # Initialize properties in invoice with values from owner
18
11
  def initialize_properties_with_values_from_owner(invoice)
19
- invoice.debtor = owner
20
-
21
- invoice.debtor_name ||= owner.name
22
- invoice.debtor_address ||= owner.address
23
- invoice.debtor_postal_code ||= owner.postal_code
24
- invoice.debtor_city ||= owner.city
25
-
26
- invoice.term_of_payment_handle ||= owner.term_of_payment_handle
27
- invoice.layout_handle ||= owner.layout_handle
28
- invoice.currency_handle ||= owner.currency_handle
29
-
30
- invoice
12
+ if owner.is_a?(Debtor)
13
+ invoice.debtor = owner
14
+
15
+ invoice.debtor_name ||= owner.name
16
+ invoice.debtor_address ||= owner.address
17
+ invoice.debtor_postal_code ||= owner.postal_code
18
+ invoice.debtor_city ||= owner.city
19
+
20
+ invoice.term_of_payment_handle ||= owner.term_of_payment_handle
21
+ invoice.layout_handle ||= owner.layout_handle
22
+ invoice.currency_handle ||= owner.currency_handle
23
+ end
31
24
  end
32
-
33
25
  end
34
26
  end
@@ -2,63 +2,20 @@ require 'economic/proxies/entity_proxy'
2
2
 
3
3
  module Economic
4
4
  class DebtorContactProxy < EntityProxy
5
-
6
- # Returns a new, unpersisted Economic::DebtorContact
7
- def build(properties = {})
8
- contact = super
9
- initialize_properties_with_values_from_owner(contact) if owner.is_a?(Debtor)
10
- contact
11
- end
12
-
13
- # Gets data for DebtorContact from the API
14
- def find(handle)
15
- handle = Entity::Handle.build(:id => handle) unless handle.is_a?(Entity::Handle)
16
- super(handle)
17
- end
18
-
19
- # Returns DebtorContact that have the given name. The objects will only be partially loaded
5
+ # Returns DebtorContact that have the given name. The objects will only be
6
+ # partially loaded
20
7
  def find_by_name(name)
21
- # Get a list of DebtorContactHandles from e-conomic
22
- response = session.request entity_class.soap_action('FindByName') do
23
- soap.body = {
24
- 'name' => name
25
- }
26
- end
27
-
28
- # Make sure we always have an array of handles even if the result only contains one
29
- handles = [response[:debtor_contact_handle]].flatten.reject(&:blank?)
30
-
31
- # Create partial DebtorContact entities
32
- contacts = handles.collect do |handle|
33
- debtor_contact = build
34
- debtor_contact.partial = true
35
- debtor_contact.persisted = true
36
- debtor_contact.handle = handle
37
- debtor_contact.id = handle[:id]
38
- debtor_contact.number = handle[:number]
39
- debtor_contact
40
- end
41
-
42
- if owner.is_a?(Debtor)
43
- # Scope to the owner
44
- contacts.select do |debtor_contact|
45
- debtor_contact.get_data
46
- debtor_contact.debtor.handle == owner.handle
47
- end
48
- else
49
- contacts
50
- end
51
-
8
+ Proxies::Actions::FindByName.new(self, name).call
52
9
  end
53
10
 
54
-
55
11
  private
56
12
 
57
13
  # Initialize properties in contact with values from owner. Returns contact.
58
14
  def initialize_properties_with_values_from_owner(contact)
59
- contact.debtor = owner
15
+ if owner.is_a?(Debtor)
16
+ contact.debtor = owner
17
+ end
60
18
  contact
61
19
  end
62
-
63
20
  end
64
21
  end
@@ -3,13 +3,10 @@ require 'economic/proxies/entity_proxy'
3
3
  module Economic
4
4
  class DebtorEntryProxy < EntityProxy
5
5
  def find_by_invoice_number(from, to = from)
6
- response = session.request(entity_class.soap_action('FindByInvoiceNumber')) do
7
- soap.body = {
8
- 'from' => from,
9
- 'to' => to,
10
- :order! => [ 'from', 'to' ]
11
- }
12
- end
6
+ response = request('FindByInvoiceNumber', {
7
+ 'from' => from,
8
+ 'to' => to
9
+ })
13
10
 
14
11
  response[:debtor_entry_handle].map do |debtor_entry_handle|
15
12
  # Kinda ugly, but we get an array instead of a hash when there's only one result. :)
@@ -18,15 +15,13 @@ module Economic
18
15
  end
19
16
 
20
17
  def match(*serial_numbers)
21
- response = session.request(entity_class.soap_action('MatchEntries')) do
22
- soap.body = {
23
- :entries => {
24
- "DebtorEntryHandle" => serial_numbers.map { |serial_number|
25
- { "SerialNumber" => serial_number }
26
- }
18
+ response = request('MatchEntries', {
19
+ :entries => {
20
+ "DebtorEntryHandle" => serial_numbers.map { |serial_number|
21
+ { "SerialNumber" => serial_number }
27
22
  }
28
23
  }
29
- end
24
+ })
30
25
  end
31
26
  end
32
27
  end
@@ -11,7 +11,7 @@ module Economic
11
11
 
12
12
  # Returns the next available debtor number
13
13
  def next_available_number
14
- session.request Debtor.soap_action(:get_next_available_number)
14
+ request :get_next_available_number
15
15
  end
16
16
  end
17
17
  end
@@ -14,7 +14,10 @@ module Economic
14
14
 
15
15
  include Enumerable
16
16
 
17
- attr_reader :owner, :items
17
+ extend Forwardable
18
+ def_delegators :@items, :each, :empty?, :last, :size, :[]
19
+
20
+ attr_reader :owner
18
21
 
19
22
  def initialize(owner)
20
23
  @owner = owner
@@ -27,7 +30,7 @@ module Economic
27
30
 
28
31
  # Fetches all entities from the API.
29
32
  def all
30
- response = session.request(entity_class.soap_action(:get_all))
33
+ response = request(:get_all)
31
34
  handles = response.values.flatten.collect { |handle| Entity::Handle.build(handle) }
32
35
 
33
36
  if handles.size == 1
@@ -55,6 +58,7 @@ module Economic
55
58
  entity.partial = false
56
59
 
57
60
  self.append(entity)
61
+ initialize_properties_with_values_from_owner(entity)
58
62
 
59
63
  entity
60
64
  end
@@ -82,11 +86,9 @@ module Economic
82
86
  def get_data(handle)
83
87
  handle = Entity::Handle.new(handle)
84
88
 
85
- entity_hash = session.request(entity_class.soap_action(:get_data)) do
86
- soap.body = {
87
- 'entityHandle' => handle.to_hash
88
- }
89
- end
89
+ entity_hash = request(:get_data, {
90
+ 'entityHandle' => handle.to_hash
91
+ })
90
92
  entity_hash
91
93
  end
92
94
 
@@ -96,30 +98,29 @@ module Economic
96
98
  end
97
99
  alias :<< :append
98
100
 
99
- def each
100
- items.each { |i| yield i }
101
+ # Requests an action from the API endpoint
102
+ def request(action, data = nil)
103
+ session.request(entity_class.soap_action_name(action), data)
101
104
  end
102
105
 
103
- def empty?
104
- items.empty?
105
- end
106
+ protected
106
107
 
107
- # Returns the number of entities in proxy
108
- def size
109
- items.size
108
+ def items
109
+ @items
110
110
  end
111
111
 
112
- protected
113
-
114
112
  # Fetches all data for the given handles. Returns Array with hashes of entity data
115
113
  def get_data_array(handles)
116
114
  return [] unless handles && handles.any?
117
115
 
118
116
  entity_class_name_for_soap_request = entity_class.name.split('::').last
119
- response = session.request(entity_class.soap_action(:get_data_array)) do
120
- soap.body = {'entityHandles' => {"#{entity_class_name_for_soap_request}Handle" => handles.collect(&:to_hash)}}
121
- end
117
+ response = request(:get_data_array, {'entityHandles' => {"#{entity_class_name_for_soap_request}Handle" => handles.collect(&:to_hash)}})
122
118
  [response["#{entity_class.key}_data".intern]].flatten
123
119
  end
120
+
121
+ # Initialize properties of entity with values from owner. Returns entity
122
+ def initialize_properties_with_values_from_owner(entity)
123
+ entity
124
+ end
124
125
  end
125
126
  end