rconomic 0.3 → 0.4

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 (78) hide show
  1. data/README.md +2 -1
  2. data/lib/economic/cash_book_entry.rb +42 -36
  3. data/lib/economic/creditor.rb +67 -0
  4. data/lib/economic/creditor_contact.rb +62 -0
  5. data/lib/economic/creditor_entry.rb +26 -0
  6. data/lib/economic/current_invoice.rb +30 -10
  7. data/lib/economic/current_invoice_line.rb +2 -0
  8. data/lib/economic/debtor_entry.rb +27 -0
  9. data/lib/economic/economic.wsdl +23134 -17255
  10. data/lib/economic/entity/handle.rb +1 -1
  11. data/lib/economic/entity.rb +8 -4
  12. data/lib/economic/entry.rb +26 -0
  13. data/lib/economic/proxies/cash_book_entry_proxy.rb +53 -15
  14. data/lib/economic/proxies/creditor_contact_proxy.rb +64 -0
  15. data/lib/economic/proxies/creditor_entry_proxy.rb +42 -0
  16. data/lib/economic/proxies/creditor_proxy.rb +73 -0
  17. data/lib/economic/proxies/current_invoice_proxy.rb +2 -1
  18. data/lib/economic/proxies/debtor_entry_proxy.rb +32 -0
  19. data/lib/economic/proxies/entity_proxy.rb +2 -2
  20. data/lib/economic/proxies/entry_proxy.rb +63 -0
  21. data/lib/economic/proxies/invoice_proxy.rb +2 -1
  22. data/lib/economic/session.rb +21 -4
  23. data/lib/economic/support/string.rb +5 -0
  24. data/lib/rconomic/version.rb +1 -1
  25. data/lib/rconomic.rb +10 -0
  26. data/rconomic.gemspec +6 -1
  27. data/spec/economic/creditor_contact_spec.rb +106 -0
  28. data/spec/economic/creditor_spec.rb +52 -0
  29. data/spec/economic/current_invoice_spec.rb +14 -0
  30. data/spec/economic/debtor_entry_spec.rb +20 -0
  31. data/spec/economic/debtor_spec.rb +12 -0
  32. data/spec/economic/entity/handle_spec.rb +21 -0
  33. data/spec/economic/entity_spec.rb +31 -0
  34. data/spec/economic/entry_spec.rb +20 -0
  35. data/spec/economic/proxies/cash_book_entry_proxy_spec.rb +35 -2
  36. data/spec/economic/proxies/creditor_contact_proxy_spec.rb +55 -0
  37. data/spec/economic/proxies/creditor_entry_proxy_spec.rb +49 -0
  38. data/spec/economic/proxies/creditor_proxy_spec.rb +81 -0
  39. data/spec/economic/proxies/current_invoice_line_proxy_spec.rb +1 -1
  40. data/spec/economic/proxies/current_invoice_proxy_spec.rb +3 -3
  41. data/spec/economic/proxies/debtor_entry_proxy_spec.rb +47 -0
  42. data/spec/economic/proxies/entry_proxy_spec.rb +73 -0
  43. data/spec/economic/proxies/invoice_proxy_spec.rb +3 -3
  44. data/spec/fixtures/cash_book_entry_create_creditor_invoice/success.xml +11 -0
  45. data/spec/fixtures/cash_book_entry_create_creditor_payment/success.xml +11 -0
  46. data/spec/fixtures/cash_book_entry_get_data/success.xml +4 -4
  47. data/spec/fixtures/cash_book_entry_set_due_date/success.xml +6 -0
  48. data/spec/fixtures/cash_book_get_all/multiple.xml +2 -2
  49. data/spec/fixtures/cash_book_get_entries/success.xml +4 -4
  50. data/spec/fixtures/creditor_contact_get_data/success.xml +22 -0
  51. data/spec/fixtures/creditor_entry_find_by_invoice_number/many.xml +15 -0
  52. data/spec/fixtures/creditor_entry_find_by_invoice_number/single.xml +12 -0
  53. data/spec/fixtures/creditor_entry_get_data/success.xml +32 -0
  54. data/spec/fixtures/creditor_entry_match_entries/success.xml +5 -0
  55. data/spec/fixtures/creditor_find_by_number/found.xml +10 -0
  56. data/spec/fixtures/creditor_find_by_number/not_found.xml +7 -0
  57. data/spec/fixtures/creditor_get_all/multiple.xml +15 -0
  58. data/spec/fixtures/creditor_get_all/single.xml +12 -0
  59. data/spec/fixtures/creditor_get_data/success.xml +49 -0
  60. data/spec/fixtures/creditor_get_data_array/multiple.xml +93 -0
  61. data/spec/fixtures/current_invoice_book_with_number/success.xml +10 -0
  62. data/spec/fixtures/current_invoice_get_data_array/multiple.xml +4 -4
  63. data/spec/fixtures/debtor_entry_find_by_invoice_number/many.xml +15 -0
  64. data/spec/fixtures/debtor_entry_find_by_invoice_number/single.xml +12 -0
  65. data/spec/fixtures/debtor_entry_match_entries/success.xml +6 -0
  66. data/spec/fixtures/debtor_get_data_array/multiple.xml +4 -4
  67. data/spec/fixtures/entry_find_by_date_interval/many.xml +15 -0
  68. data/spec/fixtures/entry_find_by_date_interval/none.xml +9 -0
  69. data/spec/fixtures/entry_find_by_date_interval/single.xml +12 -0
  70. data/spec/fixtures/entry_find_by_serial_number_interval/many.xml +15 -0
  71. data/spec/fixtures/entry_find_by_serial_number_interval/none.xml +9 -0
  72. data/spec/fixtures/entry_find_by_serial_number_interval/single.xml +12 -0
  73. data/spec/fixtures/entry_get_data/success.xml +40 -0
  74. data/spec/fixtures/entry_get_last_used_serial_number/success.xml +8 -0
  75. data/spec/spec_helper.rb +22 -2
  76. metadata +68 -11
  77. data/Gemfile.lock +0 -61
  78. data/spec/fixtures/wsdl.xml +0 -56596
data/README.md CHANGED
@@ -5,6 +5,7 @@ Ruby wrapper for the [e-conomic](http://www.e-conomic.co.uk) SOAP API, that aims
5
5
 
6
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/]().
7
7
 
8
+ [![Build Status](https://secure.travis-ci.org/lokalebasen/rconomic.png?branch=master)](http://travis-ci.org/lokalebasen/rconomic)
8
9
 
9
10
  Usage example
10
11
  -------------
@@ -60,7 +61,6 @@ Usage example
60
61
  # without specifying the voucher number, the API will complain. This way, E-Conomics will assign a voucher number for us.
61
62
 
62
63
  cash_book_entry = cash_book.entries.create_debtor_payment(:debtor_handle => debtor.handle, :contra_account_handle => { :number => '1920' })
63
- cash_book_entry.cash_book_entry_type = "DebtorPayment" # For some reason, we need to specify this.
64
64
  cash_book_entry.amount = -123.45
65
65
  cash_book_entry.currency_handle = { "Code" => "DKK" }
66
66
  cash_book_entry.debtor_invoice_number = invoice.number
@@ -91,6 +91,7 @@ Not even remotely... For now, limited to a small subset of all the [available op
91
91
  CurrentInvoiceLine | X | X | X | X
92
92
  Debtor | X | X | X | X
93
93
  DebtorContact | X | X | X | X
94
+ Entry | X | X | X | X
94
95
  Invoice | X | X | |
95
96
 
96
97
 
@@ -33,50 +33,23 @@ module Economic
33
33
  :project_handle,
34
34
  :start_date,
35
35
  :text,
36
- :cash_book_entry_type,
36
+ :type,
37
37
  :vat_account_handle,
38
38
  :voucher_number
39
39
 
40
- def initialize_defaults
41
- self.account_handle = nil
42
- self.amount = 0
43
- self.amount_default_currency = 0
44
- self.bank_payment_creditor_id = 0
45
- self.bank_payment_creditor_invoice_id = 0
46
- self.bank_payment_type_handle = nil
47
- self.capitalise_handle = nil
48
- self.cash_book_handle = nil
49
- self.contra_account_handle = nil
50
- self.contra_vat_account_handle = nil
51
- self.cost_type_handle = nil
52
- self.creditor_handle = nil
53
- self.creditor_invoice_number = nil
54
- self.currency_handle = nil
55
- self.date = Time.now
56
- self.debtor_handle = nil
57
- self.debtor_invoice_number = nil
58
- self.department_handle = nil
59
- self.distribution_key_handle = nil
60
- self.due_date = nil
61
- self.employee_handle = nil
62
- self.end_date = nil
63
- self.project_handle = nil
64
- self.start_date = Time.now
65
- self.text = ""
66
- self.cash_book_entry_type = ""
67
- self.vat_account_handle = nil
68
- self.voucher_number = 0
69
- end
70
-
71
40
  def handle
72
41
  Handle.new(:id1 => @id1, :id2 => @id2)
73
42
  end
74
43
 
44
+ protected
45
+
75
46
  def build_soap_data
76
47
  data = ActiveSupport::OrderedHash.new
77
48
 
78
- data['Handle'] = handle.to_hash
79
- data['Type'] = cash_book_entry_type unless cash_book_entry_type.blank?
49
+ data['Handle'] = handle.to_hash unless handle.to_hash.empty?
50
+ data['Id1'] = id1 unless id1.blank?
51
+ data['Id2'] = id2 unless id2.blank?
52
+ data['Type'] = type unless type.blank?
80
53
  data['CashBookHandle'] = { 'Number' => cash_book_handle[:number] } unless cash_book_handle.blank?
81
54
  data['DebtorHandle'] = { 'Number' => debtor_handle[:number] } unless debtor_handle.blank?
82
55
  data['CreditorHandle'] = { 'Number' => creditor_handle[:number] } unless creditor_handle.blank?
@@ -98,8 +71,8 @@ module Economic
98
71
  data['ProjectHandle'] = { 'Number' => project_handle[:number] } unless project_handle.blank?
99
72
  data['CostTypeHandle'] = { 'Number' => cost_type_handle[:number] } unless cost_type_handle.blank?
100
73
  data['BankPaymentTypeHandle'] = { 'Number' => bank_payment_type_handle[:number] } unless bank_payment_type_handle.blank?
101
- data['BankPaymentCreditorId'] = bank_payment_creditor_id
102
- data['BankPaymentCreditorInvoiceId'] = bank_payment_creditor_invoice_id
74
+ data['BankPaymentCreditorId'] = bank_payment_creditor_id unless bank_payment_creditor_id.blank?
75
+ data['BankPaymentCreditorInvoiceId'] = bank_payment_creditor_invoice_id unless bank_payment_creditor_invoice_id.blank?
103
76
  data['CapitaliseHandle'] = { 'Number' => capitalise_handle[:number] } unless capitalise_handle.blank?
104
77
  data['StartDate'] = start_date
105
78
  data['EndDate'] = end_date
@@ -107,5 +80,38 @@ module Economic
107
80
 
108
81
  return data
109
82
  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
+
110
116
  end
111
117
  end
@@ -0,0 +1,67 @@
1
+ require 'economic/entity'
2
+
3
+ module Economic
4
+
5
+ # Represents a creditor in E-conomic.
6
+ #
7
+ # API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_ICreditor.html
8
+ #
9
+ # Examples
10
+ #
11
+ # # Find a creditor:
12
+ # creditor = economic.creditors.find(558)
13
+ #
14
+ # # Creating a creditor:
15
+ # creditor = economic.creditors.build
16
+ # creditor.number = economic.creditors.next_available_number
17
+ # creditor.creditor_group_handle = { :number => 1 }
18
+ # creditor.name = 'Apple Inc'
19
+ # creditor.vat_zone = 'HomeCountry' # HomeCountry, EU, Abroad
20
+ # creditor.is_accessible = true
21
+ # creditor.ci_number = '12345678'
22
+ # creditor.term_of_payment = 1
23
+ # creditor.save
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
26
+
27
+ def handle
28
+ Handle.new({:number => @number})
29
+ end
30
+
31
+ # Returns the Creditors contacts
32
+ def contacts
33
+ @contacts ||= CreditorContactProxy.new(self)
34
+ end
35
+
36
+ protected
37
+
38
+ def build_soap_data
39
+ data = ActiveSupport::OrderedHash.new
40
+
41
+ data['Handle'] = handle.to_hash
42
+ data['Number'] = handle.number
43
+ data['CreditorGroupHandle'] = { 'Number' => creditor_group_handle[:number] } unless creditor_group_handle.blank?
44
+ data['Name'] = name unless name.blank?
45
+ data['VatZone'] = vat_zone unless vat_zone.blank?
46
+ data['CurrencyHandle'] = { 'Code' => currency_handle[:code] } unless currency_handle.blank?
47
+ data['TermOfPaymentHandle'] = { 'Id' => term_of_payment_handle[:id] } unless term_of_payment_handle.blank?
48
+ data['IsAccessible'] = is_accessible unless is_accessible.blank?
49
+ data['CINumber'] = ci_number unless ci_number.blank?
50
+ data['Email'] = email unless email.blank?
51
+ data['Address'] = address unless address.blank?
52
+ data['PostalCode'] = postal_code unless postal_code.blank?
53
+ data['City'] = city unless city.blank?
54
+ data['Country'] = country unless country.blank?
55
+ data['BankAccount'] = bank_account unless bank_account.blank?
56
+ data['AttentionHandle'] = { 'Id' => attention_handle[:id] } unless attention_handle.blank?
57
+ data['YourReferenceHandle'] = { 'Id' => your_reference_handle[:id] } unless your_reference_handle.blank?
58
+ data['OurReferenceHandle'] = { 'Number' => our_reference_handle[:number] } unless our_reference_handle.blank?
59
+ data['DefaultPaymentTypeHandle'] = { 'Number' => default_payment_type_handle[:number] } unless default_payment_type_handle.blank?
60
+ data['DefaultPaymentCreditorId'] = default_payment_creditor_id unless default_payment_creditor_id.blank?
61
+ data['County'] = county unless county.blank?
62
+ data['AutoContraAccountHandle'] = { 'Number' => auto_contra_account_handle[:number] } unless auto_contra_account_handle.blank?
63
+
64
+ data
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,62 @@
1
+ require 'economic/entity'
2
+
3
+ module Economic
4
+
5
+ # Represents a creditor contact.
6
+ #
7
+ # API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_ICreditorContact.html
8
+ #
9
+ # Examples
10
+ #
11
+ # # Find contact
12
+ # contact = economic.contacts.find(5)
13
+ #
14
+ # # Creating a contact
15
+ # contact = creditor.contacts.build
16
+ # contact.id = 0
17
+ # contact.number = 0
18
+ # contact.name = 'John Appleseed'
19
+ # contact.save
20
+ class CreditorContact < Entity
21
+ has_properties :handle, :id, :creditor_handle, :name, :number, :telephone_number, :email, :comments, :external_id
22
+
23
+ def creditor
24
+ return nil if creditor_handle.blank?
25
+ @creditor ||= session.creditors.find(creditor_handle[:number])
26
+ end
27
+
28
+ def creditor=(creditor)
29
+ self.creditor_handle = creditor.handle
30
+ @creditor = creditor
31
+ end
32
+
33
+ def creditor_handle=(handle)
34
+ @creditor = nil unless handle == @creditor_handle
35
+ @creditor_handle = handle
36
+ end
37
+
38
+ def handle
39
+ Handle.new({:id => @id})
40
+ end
41
+
42
+ protected
43
+
44
+ def build_soap_data
45
+ data = ActiveSupport::OrderedHash.new
46
+
47
+ data['Handle'] = handle.to_hash
48
+ data['Id'] = id unless id.blank?
49
+ data['CreditorHandle'] = { 'Number' => creditor_handle[:number] } unless creditor_handle.blank?
50
+ data['Name'] = name unless name.blank?
51
+ data['Number'] = handle.number
52
+ data['TelephoneNumber'] = telephone_number unless telephone_number.blank?
53
+ data['Email'] = email unless email.blank?
54
+ data['Comments'] = comments unless comments.blank?
55
+ data['ExternalId'] = external_id unless external_id.blank?
56
+
57
+ return data
58
+ end
59
+
60
+ end
61
+
62
+ end
@@ -0,0 +1,26 @@
1
+ require 'economic/entity'
2
+
3
+ module Economic
4
+
5
+ # Represents a creditor entry in E-conomic.
6
+ #
7
+ # API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_ICreditorEntry.html
8
+
9
+ class CreditorEntry < Entity
10
+ has_properties :account,
11
+ :amount,
12
+ :amount_default_currency,
13
+ :creditor,
14
+ :currency,
15
+ :date,
16
+ :due_date,
17
+ :invoice_number,
18
+ :remainder,
19
+ :remainder_default_currency,
20
+ :serial_number,
21
+ :text,
22
+ :type,
23
+ :voucher_number
24
+ end
25
+
26
+ end
@@ -60,6 +60,23 @@ module Economic
60
60
  session.invoices.find(response[:number])
61
61
  end
62
62
 
63
+ # Books a current invoice. The given number will be assigned to the
64
+ # resulting Economic::Invoice.
65
+ #
66
+ # Returns the resulting Economic::Invoice object
67
+ def book_with_number(number)
68
+ response = session.request soap_action(:book_with_number) do
69
+ soap.body = {
70
+ "currentInvoiceHandle" => handle.to_hash,
71
+ "number" => number,
72
+ :order! => ["currentInvoiceHandle", "number"]
73
+ }
74
+ end
75
+
76
+ # Find the created Invoice
77
+ session.invoices.find(response[:number])
78
+ end
79
+
63
80
  def debtor
64
81
  return nil if debtor_handle.blank?
65
82
  @debtor ||= session.debtors.find(debtor_handle)
@@ -84,6 +101,19 @@ module Economic
84
101
  @lines ||= CurrentInvoiceLineProxy.new(self)
85
102
  end
86
103
 
104
+ def save
105
+ result = super
106
+ id = result[:id]
107
+
108
+ self.lines.each do |invoice_line|
109
+ invoice_line.session = session
110
+ invoice_line.invoice = self
111
+ invoice_line.save
112
+ end
113
+ end
114
+
115
+ protected
116
+
87
117
  def initialize_defaults
88
118
  self.id = 0
89
119
  self.date = Time.now
@@ -133,16 +163,6 @@ module Economic
133
163
  return data
134
164
  end
135
165
 
136
- def save
137
- result = super
138
- id = result[:id]
139
-
140
- self.lines.each do |invoice_line|
141
- invoice_line.session = session
142
- invoice_line.invoice = self
143
- invoice_line.save
144
- end
145
- end
146
166
  end
147
167
 
148
168
  end
@@ -30,6 +30,8 @@ module Economic
30
30
  @invoice_handle = handle
31
31
  end
32
32
 
33
+ protected
34
+
33
35
  def initialize_defaults
34
36
  self.invoice_handle = nil
35
37
  self.description = nil
@@ -0,0 +1,27 @@
1
+ require 'economic/entity'
2
+
3
+ module Economic
4
+
5
+ # Represents a debtor entry in E-conomic.
6
+ #
7
+ # API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_IDebtorEntry.html
8
+
9
+ class DebtorEntry < Entity
10
+ has_properties :handle,
11
+ :serial_number,
12
+ :type,
13
+ :date,
14
+ :debtor_handle,
15
+ :account_handle,
16
+ :voucher_number,
17
+ :text,
18
+ :amount_default_currency,
19
+ :currency_handle,
20
+ :amount,
21
+ :invoice_number,
22
+ :due_date,
23
+ :remainder,
24
+ :remainder_default_currency
25
+ end
26
+
27
+ end