rconomic 0.4 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +15 -0
  2. data/.travis.yml +1 -2
  3. data/Gemfile +1 -1
  4. data/README.md +1 -1
  5. data/lib/economic/account.rb +2 -2
  6. data/lib/economic/cash_book.rb +1 -1
  7. data/lib/economic/cash_book_entry.rb +33 -36
  8. data/lib/economic/creditor.rb +2 -2
  9. data/lib/economic/creditor_contact.rb +3 -3
  10. data/lib/economic/current_invoice.rb +26 -25
  11. data/lib/economic/current_invoice_line.rb +17 -17
  12. data/lib/economic/debtor.rb +3 -3
  13. data/lib/economic/debtor_contact.rb +4 -4
  14. data/lib/economic/debtor_entry.rb +1 -2
  15. data/lib/economic/entity/handle.rb +30 -8
  16. data/lib/economic/entity.rb +23 -3
  17. data/lib/economic/entry.rb +1 -2
  18. data/lib/economic/invoice.rb +2 -2
  19. data/lib/economic/proxies/actions/find_by_ci_number.rb +25 -0
  20. data/lib/economic/proxies/actions/find_by_date_interval.rb +27 -0
  21. data/lib/economic/proxies/actions/find_by_handle_with_number.rb +12 -0
  22. data/lib/economic/proxies/actions/find_by_number.rb +21 -0
  23. data/lib/economic/proxies/creditor_contact_proxy.rb +1 -1
  24. data/lib/economic/proxies/creditor_proxy.rb +6 -53
  25. data/lib/economic/proxies/current_invoice_line_proxy.rb +1 -1
  26. data/lib/economic/proxies/current_invoice_proxy.rb +2 -17
  27. data/lib/economic/proxies/debtor_contact_proxy.rb +2 -2
  28. data/lib/economic/proxies/debtor_proxy.rb +6 -53
  29. data/lib/economic/proxies/entity_proxy.rb +27 -11
  30. data/lib/economic/proxies/invoice_proxy.rb +4 -26
  31. data/lib/rconomic/version.rb +1 -1
  32. data/spec/economic/cash_book_entry_spec.rb +8 -0
  33. data/spec/economic/current_invoice_line_spec.rb +27 -0
  34. data/spec/economic/current_invoice_spec.rb +24 -1
  35. data/spec/economic/entity/handle_spec.rb +53 -3
  36. data/spec/economic/entity_spec.rb +41 -13
  37. data/spec/economic/proxies/cash_book_entry_proxy_spec.rb +0 -7
  38. data/spec/economic/proxies/current_invoice_proxy_spec.rb +4 -9
  39. data/spec/economic/proxies/debtor_proxy_spec.rb +1 -1
  40. data/spec/economic/proxies/invoice_proxy_spec.rb +4 -9
  41. data/spec/fixtures/invoice_get_data_array/multiple.xml +143 -0
  42. data/spec/fixtures/invoice_get_data_array/single.xml +75 -0
  43. metadata +64 -80
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MTMxZDg2MjQyNWQ5ZmY1MWIzZmI3YmFhNWZkYmJkODBjOTJkMTc1OQ==
5
+ data.tar.gz: !binary |-
6
+ ZGYxYjM4MjI1N2E1MmM4ZWY4ZWJhZTVlMWRkOWZmM2E4MmVkNWNlMA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MGFlMzg5YTc1MDZhOTA2NjdjMmJlYWFjMGQzZWE4NjlkY2Y4OTJjYTQ1Yzkx
10
+ MWQ0OTY2YjRlNmZjODljZjk2ZDBiOTg0N2U1OTgwZGZhYjM2MzkyY2ExM2Nk
11
+ ZGE1NTkyZjg2NWEyNzM0MTJiMmE0NzVhOTY1ZDI0ZjhjOWNiYmU=
12
+ data.tar.gz: !binary |-
13
+ NmJkOTk0MmExOTgwYmIwMGQyMGNkMjdhODUwZTY5MWY1OGQwYzNlNGJmMGNh
14
+ NjU1ZjdkYWVmNTNmYjJlYzcyZjRiZmMxYTRiNzUzZWRhODZlNWE5MzAwY2Rh
15
+ NDA3YTFlODExYjM0NjFiZGUyNjM3MDk4YjNmNTM3M2FlNWNkZGM=
data/.travis.yml CHANGED
@@ -4,9 +4,8 @@ rvm:
4
4
  - 1.9.2
5
5
  - 1.9.3
6
6
  - ree
7
- - rbx
8
7
 
9
8
  # Specify the recipients for email notification
10
9
  notifications:
11
10
  recipients:
12
- - jakob@mentalized.net
11
+ - jakob@mentalized.net
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source :rubygems
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
data/README.md CHANGED
@@ -3,7 +3,7 @@ r-conomic
3
3
 
4
4
  Ruby wrapper for the [e-conomic](http://www.e-conomic.co.uk) SOAP API, that aims at making working with the API bearable.
5
5
 
6
- E-conomic is a web-based accounting system. For their marketing speak, see [http://www.e-conomic.co.uk/about/](). More details about their API at [http://www.e-conomic.co.uk/integration/integration-partner/]().
6
+ E-conomic is a web-based accounting system. For their marketing speak, see [http://www.e-conomic.co.uk/about/](). More details about their API at [http://www.e-conomic.com/developer]().
7
7
 
8
8
  [![Build Status](https://secure.travis-ci.org/lokalebasen/rconomic.png?branch=master)](http://travis-ci.org/lokalebasen/rconomic)
9
9
 
@@ -6,7 +6,7 @@ module Economic
6
6
 
7
7
 
8
8
  def handle
9
- Handle.new({:name => @name})
9
+ Handle.build({:name => @name})
10
10
  end
11
11
 
12
12
 
@@ -22,4 +22,4 @@ module Economic
22
22
  return data
23
23
  end
24
24
  end
25
- end
25
+ end
@@ -9,7 +9,7 @@ module Economic
9
9
  has_properties :name, :number
10
10
 
11
11
  def handle
12
- Handle.new({:number => @number})
12
+ @handle ||= Handle.new({:number => @number})
13
13
  end
14
14
 
15
15
  def entries
@@ -1,7 +1,6 @@
1
1
  require 'economic/entity'
2
2
 
3
3
  module Economic
4
-
5
4
  # Represents a cash book in E-conomic.
6
5
  #
7
6
  # API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_ICashBook.html
@@ -37,8 +36,39 @@ module Economic
37
36
  :vat_account_handle,
38
37
  :voucher_number
39
38
 
39
+ defaults(
40
+ :account_handle => nil,
41
+ :amount => 0,
42
+ :amount_default_currency => 0,
43
+ :bank_payment_creditor_id => nil,
44
+ :bank_payment_creditor_invoice_id => nil,
45
+ :bank_payment_type_handle => nil,
46
+ :capitalise_handle => nil,
47
+ :cash_book_handle => nil,
48
+ :contra_account_handle => nil,
49
+ :contra_vat_account_handle => nil,
50
+ :cost_type_handle => nil,
51
+ :creditor_handle => nil,
52
+ :creditor_invoice_number => nil,
53
+ :currency_handle => nil,
54
+ :date => Time.now,
55
+ :debtor_handle => nil,
56
+ :debtor_invoice_number => nil,
57
+ :department_handle => nil,
58
+ :distribution_key_handle => nil,
59
+ :due_date => nil,
60
+ :employee_handle => nil,
61
+ :end_date => nil,
62
+ :project_handle => nil,
63
+ :start_date => Time.now,
64
+ :text => "",
65
+ :type => "",
66
+ :vat_account_handle => nil,
67
+ :voucher_number => 0
68
+ )
69
+
40
70
  def handle
41
- Handle.new(:id1 => @id1, :id2 => @id2)
71
+ @handle ||= Handle.new(:id1 => @id1, :id2 => @id2)
42
72
  end
43
73
 
44
74
  protected
@@ -46,7 +76,7 @@ module Economic
46
76
  def build_soap_data
47
77
  data = ActiveSupport::OrderedHash.new
48
78
 
49
- data['Handle'] = handle.to_hash unless handle.to_hash.empty?
79
+ data['Handle'] = handle.to_hash unless handle.empty?
50
80
  data['Id1'] = id1 unless id1.blank?
51
81
  data['Id2'] = id2 unless id2.blank?
52
82
  data['Type'] = type unless type.blank?
@@ -80,38 +110,5 @@ module Economic
80
110
 
81
111
  return data
82
112
  end
83
-
84
- def initialize_defaults
85
- self.account_handle = nil
86
- self.amount = 0
87
- self.amount_default_currency = 0
88
- self.bank_payment_creditor_id = nil
89
- self.bank_payment_creditor_invoice_id = nil
90
- self.bank_payment_type_handle = nil
91
- self.capitalise_handle = nil
92
- self.cash_book_handle = nil
93
- self.contra_account_handle = nil
94
- self.contra_vat_account_handle = nil
95
- self.cost_type_handle = nil
96
- self.creditor_handle = nil
97
- self.creditor_invoice_number = nil
98
- self.currency_handle = nil
99
- self.date = Time.now
100
- self.debtor_handle = nil
101
- self.debtor_invoice_number = nil
102
- self.department_handle = nil
103
- self.distribution_key_handle = nil
104
- self.due_date = nil
105
- self.employee_handle = nil
106
- self.end_date = nil
107
- self.project_handle = nil
108
- self.start_date = Time.now
109
- self.text = ""
110
- self.type = ""
111
- self.vat_account_handle = nil
112
- self.voucher_number = 0
113
- end
114
-
115
-
116
113
  end
117
114
  end
@@ -22,10 +22,10 @@ module Economic
22
22
  # creditor.term_of_payment = 1
23
23
  # creditor.save
24
24
  class Creditor < Entity
25
- has_properties :handle, :number, :creditor_group_handle, :name, :vat_zone, :currency_handle, :term_of_payment_handle, :is_accessible, :ci_number, :email, :address, :postal_code, :city, :country, :bank_account, :attention_handle, :your_reference_handle, :our_reference_handle, :default_payment_type_handle, :default_payment_creditor_id, :county, :auto_contra_account_handle
25
+ has_properties :number, :creditor_group_handle, :name, :vat_zone, :currency_handle, :term_of_payment_handle, :is_accessible, :ci_number, :email, :address, :postal_code, :city, :country, :bank_account, :attention_handle, :your_reference_handle, :our_reference_handle, :default_payment_type_handle, :default_payment_creditor_id, :county, :auto_contra_account_handle
26
26
 
27
27
  def handle
28
- Handle.new({:number => @number})
28
+ @handle ||= Handle.build({:number => @number})
29
29
  end
30
30
 
31
31
  # Returns the Creditors contacts
@@ -18,10 +18,10 @@ module Economic
18
18
  # contact.name = 'John Appleseed'
19
19
  # contact.save
20
20
  class CreditorContact < Entity
21
- has_properties :handle, :id, :creditor_handle, :name, :number, :telephone_number, :email, :comments, :external_id
21
+ has_properties :id, :creditor_handle, :name, :number, :telephone_number, :email, :comments, :external_id
22
22
 
23
23
  def creditor
24
- return nil if creditor_handle.blank?
24
+ return nil if creditor_handle.nil?
25
25
  @creditor ||= session.creditors.find(creditor_handle[:number])
26
26
  end
27
27
 
@@ -36,7 +36,7 @@ module Economic
36
36
  end
37
37
 
38
38
  def handle
39
- Handle.new({:id => @id})
39
+ @handle ||= Handle.build({:id => @id})
40
40
  end
41
41
 
42
42
  protected
@@ -28,12 +28,30 @@ module Economic
28
28
  class CurrentInvoice < Entity
29
29
  has_properties :id, :debtor_handle, :debtor_name, :debtor_address, :debtor_postal_code, :debtor_city, :debtor_country, :attention_handle, :date, :term_of_payment_handle, :due_date, :currency_handle, :exchange_rate, :is_vat_included, :layout_handle, :delivery_date, :net_amount, :vat_amount, :gross_amount, :margin, :margin_as_percent, :heading
30
30
 
31
+ defaults(
32
+ :id => 0,
33
+ :date => Time.now,
34
+ :term_of_payment_handle => nil,
35
+ :due_date => nil,
36
+ :currency_handle => nil,
37
+ :exchange_rate => 100, # Why am _I_ inputting this?
38
+ :is_vat_included => nil,
39
+ :layout_handle => nil,
40
+ :delivery_date => nil,
41
+ :heading => nil,
42
+ :net_amount => 0,
43
+ :vat_amount => 0,
44
+ :gross_amount => 0,
45
+ :margin => 0,
46
+ :margin_as_percent => 0 # Why do I have to input both Margin and MarginAsPercent? Shouldn't powerful Windows machines running ASP.NET be able to compute this?
47
+ )
48
+
31
49
  def initialize(properties = {})
32
50
  super
33
51
  end
34
52
 
35
53
  def attention
36
- return nil if attention_handle.blank?
54
+ return nil if attention_handle.nil?
37
55
  @attention ||= session.contacts.find(attention_handle)
38
56
  end
39
57
 
@@ -78,7 +96,7 @@ module Economic
78
96
  end
79
97
 
80
98
  def debtor
81
- return nil if debtor_handle.blank?
99
+ return nil if debtor_handle.nil?
82
100
  @debtor ||= session.debtors.find(debtor_handle)
83
101
  end
84
102
 
@@ -93,19 +111,21 @@ module Economic
93
111
  end
94
112
 
95
113
  def handle
96
- Handle.new(:id => @id)
114
+ @handle ||= Handle.new(:id => @id)
97
115
  end
98
116
 
99
- # Returns the current invoice lines of CurrentInvoice
100
117
  def lines
101
118
  @lines ||= CurrentInvoiceLineProxy.new(self)
102
119
  end
103
120
 
104
121
  def save
122
+ lines = self.lines
123
+
105
124
  result = super
106
- id = result[:id]
125
+ self.id = result[:id].to_i
126
+ @handle = nil # Reset a memoized handle, leaving it up to #handle to recreate it with correct id
107
127
 
108
- self.lines.each do |invoice_line|
128
+ lines.each do |invoice_line|
109
129
  invoice_line.session = session
110
130
  invoice_line.invoice = self
111
131
  invoice_line.save
@@ -114,24 +134,6 @@ module Economic
114
134
 
115
135
  protected
116
136
 
117
- def initialize_defaults
118
- self.id = 0
119
- self.date = Time.now
120
- self.term_of_payment_handle = nil
121
- self.due_date = nil
122
- self.currency_handle = nil
123
- self.exchange_rate = 100 # Why am _I_ inputting this?
124
- self.is_vat_included = nil
125
- self.layout_handle = nil
126
- self.delivery_date = nil
127
- self.heading = nil
128
- self.net_amount = 0
129
- self.vat_amount = 0
130
- self.gross_amount = 0
131
- self.margin = 0
132
- self.margin_as_percent = 0 # Why do I have to input both Margin and MarginAsPercent? Shouldn't powerful Windows machines running ASP.NET be able to compute this?
133
- end
134
-
135
137
  # Returns OrderedHash with the properties of CurrentInvoice in the correct order, camelcased and ready
136
138
  # to be sent via SOAP
137
139
  def build_soap_data
@@ -162,7 +164,6 @@ module Economic
162
164
 
163
165
  return data
164
166
  end
165
-
166
167
  end
167
168
 
168
169
  end
@@ -9,10 +9,25 @@ module Economic
9
9
  #
10
10
  # See Economic::CurrentInvoice for usage example
11
11
  class CurrentInvoiceLine < Entity
12
- has_properties :invoice_handle, :description, :delivery_date, :unit_handle, :product_handle, :quantity, :unit_net_price, :discount_as_percent, :unit_cost_price, :total_net_amount, :total_margin, :margin_as_percent
12
+ has_properties :number, :invoice_handle, :description, :delivery_date, :unit_handle, :product_handle, :quantity, :unit_net_price, :discount_as_percent, :unit_cost_price, :total_net_amount, :total_margin, :margin_as_percent
13
+
14
+ defaults(
15
+ :invoice_handle => nil,
16
+ :description => nil,
17
+ :delivery_date => nil,
18
+ :unit_handle => nil,
19
+ :product_handle => nil,
20
+ :quantity => nil,
21
+ :unit_net_price => nil,
22
+ :discount_as_percent => 0,
23
+ :unit_cost_price => 0,
24
+ :total_net_amount => nil,
25
+ :total_margin => 0,
26
+ :margin_as_percent => 0
27
+ )
13
28
 
14
29
  def handle
15
- Handle.new(:number => number)
30
+ @handle ||= Handle.build(:number => number)
16
31
  end
17
32
 
18
33
  def invoice
@@ -32,21 +47,6 @@ module Economic
32
47
 
33
48
  protected
34
49
 
35
- def initialize_defaults
36
- self.invoice_handle = nil
37
- self.description = nil
38
- self.delivery_date = nil
39
- self.unit_handle = nil
40
- self.product_handle = nil
41
- self.quantity = nil
42
- self.unit_net_price = nil
43
- self.discount_as_percent = 0
44
- self.unit_cost_price = 0
45
- self.total_net_amount = nil
46
- self.total_margin = 0
47
- self.margin_as_percent = 0
48
- end
49
-
50
50
  # Returns OrderedHash with the properties of CurrentInvoice in the correct order, camelcased and ready
51
51
  # to be sent via SOAP
52
52
  def build_soap_data
@@ -25,10 +25,10 @@ module Economic
25
25
  # debtor.layout_handle = { :id => 16 }
26
26
  # debtor.save
27
27
  class Debtor < Entity
28
- has_properties :handle, :number, :debtor_group_handle, :name, :vat_zone, :currency_handle, :price_group_handle, :is_accessible, :ean, :public_entry_number, :email, :telephone_and_fax_number, :website, :address, :postal_code, :city, :country, :credit_maximum, :vat_number, :county, :ci_number, :term_of_payment_handle, :layout_handle, :attention_handle, :your_reference_handle, :our_reference_handle, :balance
28
+ has_properties :number, :debtor_group_handle, :name, :vat_zone, :currency_handle, :price_group_handle, :is_accessible, :ean, :public_entry_number, :email, :telephone_and_fax_number, :website, :address, :postal_code, :city, :country, :credit_maximum, :vat_number, :county, :ci_number, :term_of_payment_handle, :layout_handle, :attention_handle, :your_reference_handle, :our_reference_handle, :balance
29
29
 
30
30
  def handle
31
- Handle.new({:number => @number})
31
+ @handle ||= Handle.new({:number => @number})
32
32
  end
33
33
 
34
34
  # Returns the Debtors contacts
@@ -79,4 +79,4 @@ module Economic
79
79
 
80
80
  end
81
81
 
82
- end
82
+ end
@@ -18,10 +18,10 @@ module Economic
18
18
  # contact.name = 'John Appleseed'
19
19
  # contact.save
20
20
  class DebtorContact < Entity
21
- has_properties :handle, :id, :debtor_handle, :name, :number, :telephone_number, :email, :comments, :external_id, :is_to_receive_email_copy_of_order, :is_to_receive_email_copy_of_invoice
21
+ has_properties :id, :debtor_handle, :name, :number, :telephone_number, :email, :comments, :external_id, :is_to_receive_email_copy_of_order, :is_to_receive_email_copy_of_invoice
22
22
 
23
23
  def debtor
24
- return nil if debtor_handle.blank?
24
+ return nil if debtor_handle.nil?
25
25
  @debtor ||= session.debtors.find(debtor_handle[:number])
26
26
  end
27
27
 
@@ -36,7 +36,7 @@ module Economic
36
36
  end
37
37
 
38
38
  def handle
39
- Handle.new({:id => @id})
39
+ @handle ||= Handle.new({:id => @id})
40
40
  end
41
41
 
42
42
  protected
@@ -61,4 +61,4 @@ module Economic
61
61
 
62
62
  end
63
63
 
64
- end
64
+ end
@@ -7,8 +7,7 @@ module Economic
7
7
  # API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_IDebtorEntry.html
8
8
 
9
9
  class DebtorEntry < Entity
10
- has_properties :handle,
11
- :serial_number,
10
+ has_properties :serial_number,
12
11
  :type,
13
12
  :date,
14
13
  :debtor_handle,
@@ -1,6 +1,19 @@
1
1
  class Economic::Entity
2
2
  class Handle
3
- attr_accessor :id, :id1, :id2, :number
3
+ attr_accessor :id, :id1, :id2, :number, :serial_number
4
+
5
+ def self.build(options)
6
+ return options if options.is_a?(Handle)
7
+ return nil if options.nil?
8
+ new(options)
9
+ end
10
+
11
+ # Returns true if Handle hasn't been initialized with any values yet. This
12
+ # usually happens when the handle is constructed for an entity whose id
13
+ # properties (id, number, etc) haven't been set yet.
14
+ def empty?
15
+ to_hash.empty?
16
+ end
4
17
 
5
18
  def initialize(hash)
6
19
  verify_sanity_of_arguments!(hash)
@@ -10,29 +23,38 @@ class Economic::Entity
10
23
  @id1 = hash[:id1].to_i if hash[:id1]
11
24
  @id2 = hash[:id2].to_i if hash[:id2]
12
25
  @number = hash[:number].to_i if hash[:number]
26
+ @serial_number = hash[:serial_number].to_i if hash[:serial_number]
13
27
  end
14
28
 
15
- def to_hash
29
+ def to_hash(only_keys = id_properties.keys)
30
+ only_keys = [only_keys].flatten
16
31
  hash = {}
17
- hash['Id'] = id unless id.blank?
18
- hash['Id1'] = id1 unless id1.blank?
19
- hash['Id2'] = id2 unless id2.blank?
20
- hash['Number'] = number unless number.blank?
32
+ hash['Id'] = id if only_keys.include?(:id) && !id.blank?
33
+ hash['Id1'] = id1 unless id1.blank? if only_keys.include?(:id1)
34
+ hash['Id2'] = id2 unless id2.blank? if only_keys.include?(:id2)
35
+ hash['Number'] = number unless number.blank? if only_keys.include?(:number)
36
+ hash['SerialNumber'] = serial_number unless serial_number.blank? if only_keys.include?(:serial_number)
21
37
  hash
22
38
  end
23
39
 
24
40
  def [](key)
25
- {:id => @id, :id1 => @id1, :id2 => @id2, :number => @number}[key]
41
+ {:id => @id, :id1 => @id1, :id2 => @id2, :number => @number, :serial_number => @serial_number}[key]
26
42
  end
27
43
 
28
44
  def ==(other)
45
+ return true if self.object_id == other.object_id
29
46
  return false if other.nil?
47
+ return false if empty? || (other.respond_to?(:empty?) && other.empty?)
30
48
  return false unless other.respond_to?(:id) && other.respond_to?(:number)
31
49
  self.id == other.id && self.number == other.number && self.id1 == other.id1 && self.id2 == other.id2
32
50
  end
33
51
 
34
52
  private
35
53
 
54
+ def id_properties
55
+ {:id => 'Id', :id1 => 'Id1', :id2 => 'Id2', :number => 'Number', :serial_number => 'SerialNumber'}
56
+ end
57
+
36
58
  # Raises exceptions if hash doesn't contain values we can use to construct a new handle
37
59
  def verify_sanity_of_arguments!(hash)
38
60
  return if hash.is_a?(self.class)
@@ -42,7 +64,7 @@ class Economic::Entity
42
64
  end
43
65
 
44
66
  if hash.respond_to?(:keys)
45
- unknown_keys = hash.keys - [:id, :id1, :id2, :number, "Number", "Id", "Id1", "Id2"]
67
+ unknown_keys = hash.keys - id_properties.keys - id_properties.values
46
68
  raise ArgumentError.new("Unknown keys in handle: #{unknown_keys.inspect}") unless unknown_keys.empty?
47
69
 
48
70
  not_to_iable = hash.select { |k, v| !v.respond_to?(:to_i) }
@@ -6,6 +6,16 @@ module Economic
6
6
  attr_accessor :persisted, :session, :partial
7
7
 
8
8
  class << self
9
+ # Sets default property values that an entity should be initialized with
10
+ def defaults(default_values)
11
+ @default_values = default_values
12
+ end
13
+
14
+ # Returns the default values for properties
15
+ def default_values
16
+ @default_values || {}
17
+ end
18
+
9
19
  def properties_not_triggering_full_load
10
20
  [:id, :number, :handle]
11
21
  end
@@ -13,7 +23,7 @@ module Economic
13
23
  def has_properties(*properties)
14
24
  @properties = properties
15
25
  properties.each do |property|
16
- unless properties_not_triggering_full_load.include?(property) || instance_methods.collect(&:to_s).include?(property.to_s)
26
+ unless properties_not_triggering_full_load.include?(property)
17
27
  # Create property accessors that loads the full Entity from the API if necessary
18
28
  define_method "#{property}" do
19
29
  value = instance_variable_get("@#{property}")
@@ -61,7 +71,11 @@ module Economic
61
71
  end
62
72
 
63
73
  def handle
64
- Handle.new({:number => @number, :id => @id})
74
+ @handle ||= Handle.build({:number => @number, :id => @id})
75
+ end
76
+
77
+ def handle=(handle)
78
+ @handle = Handle.build(handle)
65
79
  end
66
80
 
67
81
  def initialize(properties = {})
@@ -173,6 +187,10 @@ module Economic
173
187
  return response
174
188
  end
175
189
 
190
+ def defaults
191
+ self.class.default_values
192
+ end
193
+
176
194
  def update
177
195
  response = session.request soap_action(:update_from_data) do
178
196
  soap.body = {'data' => build_soap_data}
@@ -201,7 +219,9 @@ module Economic
201
219
  end
202
220
 
203
221
  def initialize_defaults
204
- nil
222
+ defaults.each do |property_name, default_value|
223
+ self.send("#{property_name}=", default_value)
224
+ end
205
225
  end
206
226
  end
207
227
 
@@ -7,8 +7,7 @@ module Economic
7
7
  # API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_IEntry.html
8
8
 
9
9
  class Entry < Entity
10
- has_properties :handle,
11
- :serial_number,
10
+ has_properties :serial_number,
12
11
  :account_handle,
13
12
  :amount,
14
13
  :amount_default_currency,
@@ -5,7 +5,7 @@ module Economic
5
5
  has_properties :number, :net_amount, :vat_amount, :due_date, :debtor_handle, :debtor_name, :debtor_name, :debtor_address, :debtor_postal_code, :debtor_city, :debtor_country, :debtor_ean, :attention_handle, :heading
6
6
 
7
7
  def attention
8
- return nil if attention_handle.blank?
8
+ return nil if attention_handle.nil?
9
9
  @attention ||= session.contacts.find(attention_handle)
10
10
  end
11
11
 
@@ -20,7 +20,7 @@ module Economic
20
20
  end
21
21
 
22
22
  def debtor
23
- return nil if debtor_handle.blank?
23
+ return nil if debtor_handle.nil?
24
24
  @debtor ||= session.debtors.find(debtor_handle)
25
25
  end
26
26
 
@@ -0,0 +1,25 @@
1
+ module FindByCiNumber
2
+ # Returns Debtors that have the given ci_number. The Debtor objects will only be partially loaded
3
+ def find_by_ci_number(ci_number)
4
+ # Get a list of handles from e-conomic
5
+ response = session.request entity_class.soap_action('FindByCINumber') do
6
+ soap.body = {
7
+ 'ciNumber' => ci_number
8
+ }
9
+ end
10
+
11
+ # Make sure we always have an array of handles even if the result only contains one
12
+ handle_key = "#{entity_class_name.downcase}_handle".intern
13
+ handles = [response[handle_key]].flatten.reject(&:blank?)
14
+
15
+ # Create partial Debtor entities
16
+ handles.collect do |handle|
17
+ entity = build
18
+ entity.partial = true
19
+ entity.persisted = true
20
+ entity.handle = handle
21
+ entity.number = handle[:number]
22
+ entity
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module Economic
2
+ module FindByDateInterval
3
+
4
+ # Returns entity objects for a given interval of days.
5
+ def find_by_date_interval(from, unto)
6
+ response = session.request entity_class.soap_action("FindByDateInterval") do
7
+ soap.body = {
8
+ 'first' => from.iso8601,
9
+ 'last' => unto.iso8601,
10
+ :order! => ['first', 'last']
11
+ }
12
+ end
13
+
14
+ handle_key = "#{Support::String.underscore(entity_class_name)}_handle".intern
15
+ handles = [ response[handle_key] ].flatten.reject(&:blank?).collect do |handle|
16
+ Entity::Handle.build(handle)
17
+ end
18
+
19
+ get_data_array(handles).collect do |entity_hash|
20
+ entity = build(entity_hash)
21
+ entity.persisted = true
22
+ entity
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ # Use FindByHandleWithNumber when the SOAP action to find entity requires
2
+ # `Number` to be passed rather than the default `Id`
3
+ module FindByHandleWithNumber
4
+ def find(handle)
5
+ handle = if handle.respond_to?(:to_i)
6
+ Economic::Entity::Handle.build(:number => handle.to_i)
7
+ else
8
+ Economic::Entity::Handle.build(handle)
9
+ end
10
+ super(handle)
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ module FindByNumber
2
+ # Returns handle with a given number.
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
9
+
10
+ if response == {}
11
+ nil
12
+ else
13
+ entity = build
14
+ entity.partial = true
15
+ entity.persisted = true
16
+ entity.handle = response
17
+ entity.number = response[:number].to_i
18
+ entity
19
+ end
20
+ end
21
+ end
@@ -12,7 +12,7 @@ module Economic
12
12
 
13
13
  # Gets data for CreditorContact from the API
14
14
  def find(handle)
15
- handle = Entity::Handle.new(:id => handle) unless handle.is_a?(Entity::Handle)
15
+ handle = Entity::Handle.build(:id => handle) unless handle.is_a?(Entity::Handle)
16
16
  super(handle)
17
17
  end
18
18