rconomic 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +40 -0
- data/.ruby-version +1 -0
- data/.travis.yml +14 -3
- data/CHANGELOG.md +28 -0
- data/Gemfile +5 -4
- data/Guardfile +9 -4
- data/README.md +23 -4
- data/Rakefile +5 -5
- data/gemfiles/Gemfile.ruby-2.0 +14 -0
- data/lib/economic/account.rb +3 -3
- data/lib/economic/cash_book.rb +4 -7
- data/lib/economic/cash_book_entry.rb +4 -24
- data/lib/economic/company.rb +61 -0
- data/lib/economic/creditor.rb +4 -5
- data/lib/economic/creditor_contact.rb +5 -6
- data/lib/economic/creditor_entry.rb +1 -3
- data/lib/economic/current_invoice.rb +14 -21
- data/lib/economic/current_invoice_line.rb +4 -13
- data/lib/economic/debtor.rb +10 -11
- data/lib/economic/debtor_contact.rb +7 -8
- data/lib/economic/debtor_entry.rb +1 -3
- data/lib/economic/endpoint.rb +36 -6
- data/lib/economic/entity/handle.rb +54 -29
- data/lib/economic/entity/mapper.rb +1 -1
- data/lib/economic/entity.rb +26 -29
- data/lib/economic/entry.rb +1 -2
- data/lib/economic/invoice.rb +15 -8
- data/lib/economic/order.rb +2 -4
- data/lib/economic/product.rb +73 -0
- data/lib/economic/proxies/account_proxy.rb +2 -4
- data/lib/economic/proxies/actions/debtor_contact/all.rb +63 -0
- data/lib/economic/proxies/actions/find_by_ci_number.rb +1 -3
- data/lib/economic/proxies/actions/find_by_date_interval.rb +3 -6
- data/lib/economic/proxies/actions/find_by_handle_with_number.rb +1 -1
- data/lib/economic/proxies/actions/find_by_name.rb +1 -1
- data/lib/economic/proxies/actions/find_by_number.rb +2 -4
- data/lib/economic/proxies/actions/find_by_telephone_and_fax_number.rb +1 -3
- data/lib/economic/proxies/cash_book_entry_proxy.rb +19 -22
- data/lib/economic/proxies/cash_book_proxy.rb +5 -10
- data/lib/economic/proxies/company_proxy.rb +9 -0
- data/lib/economic/proxies/creditor_contact_proxy.rb +2 -2
- data/lib/economic/proxies/creditor_entry_proxy.rb +8 -14
- data/lib/economic/proxies/creditor_proxy.rb +8 -11
- data/lib/economic/proxies/current_invoice_line_proxy.rb +2 -2
- data/lib/economic/proxies/current_invoice_proxy.rb +3 -3
- data/lib/economic/proxies/debtor_contact_proxy.rb +6 -2
- data/lib/economic/proxies/debtor_entry_proxy.rb +6 -10
- data/lib/economic/proxies/debtor_proxy.rb +40 -55
- data/lib/economic/proxies/entity_proxy.rb +15 -15
- data/lib/economic/proxies/entry_proxy.rb +10 -16
- data/lib/economic/proxies/invoice_proxy.rb +3 -3
- data/lib/economic/proxies/order_proxy.rb +3 -3
- data/lib/economic/proxies/product_proxy.rb +11 -0
- data/lib/economic/session.rb +48 -21
- data/lib/economic/support/string.rb +5 -5
- data/lib/rconomic/version.rb +1 -1
- data/lib/rconomic.rb +39 -34
- data/lib/savon_ext/request.rb +17 -0
- data/rconomic.gemspec +8 -7
- data/spec/economic/account_spec.rb +3 -3
- data/spec/economic/cash_book_entry_spec.rb +26 -3
- data/spec/economic/cash_book_spec.rb +7 -7
- data/spec/economic/company_spec.rb +20 -0
- data/spec/economic/creditor_contact_spec.rb +4 -5
- data/spec/economic/creditor_entry_spec.rb +20 -0
- data/spec/economic/creditor_spec.rb +3 -3
- data/spec/economic/current_invoice_line_spec.rb +3 -3
- data/spec/economic/current_invoice_spec.rb +19 -19
- data/spec/economic/debtor_contact_spec.rb +4 -5
- data/spec/economic/debtor_entry_spec.rb +1 -1
- data/spec/economic/debtor_spec.rb +13 -13
- data/spec/economic/endpoint_spec.rb +27 -11
- data/spec/economic/entity/handle_spec.rb +10 -23
- data/spec/economic/entity/mapper_spec.rb +26 -30
- data/spec/economic/entity_spec.rb +36 -31
- data/spec/economic/entry_spec.rb +1 -1
- data/spec/economic/invoice_spec.rb +49 -7
- data/spec/economic/order_spec.rb +4 -4
- data/spec/economic/product_spec.rb +72 -0
- data/spec/economic/proxies/account_proxy_spec.rb +74 -0
- data/spec/economic/proxies/actions/debtor_contact/all_spec.rb +26 -0
- data/spec/economic/proxies/actions/find_by_name_spec.rb +6 -7
- data/spec/economic/proxies/cash_book_entry_proxy_spec.rb +27 -29
- data/spec/economic/proxies/cash_book_proxy_spec.rb +14 -22
- data/spec/economic/proxies/company_proxy_spec.rb +47 -0
- data/spec/economic/proxies/creditor_contact_proxy_spec.rb +11 -5
- data/spec/economic/proxies/creditor_entry_proxy_spec.rb +12 -12
- data/spec/economic/proxies/creditor_proxy_spec.rb +15 -15
- data/spec/economic/proxies/current_invoice_line_proxy_spec.rb +10 -4
- data/spec/economic/proxies/current_invoice_proxy_spec.rb +37 -19
- data/spec/economic/proxies/debtor_contact_proxy_spec.rb +8 -4
- data/spec/economic/proxies/debtor_entry_proxy_spec.rb +21 -11
- data/spec/economic/proxies/debtor_proxy_spec.rb +81 -40
- data/spec/economic/proxies/entry_proxy_spec.rb +17 -14
- data/spec/economic/proxies/invoice_proxy_spec.rb +24 -10
- data/spec/economic/proxies/order_proxy_spec.rb +20 -10
- data/spec/economic/proxies/product_proxy_spec.rb +86 -0
- data/spec/economic/session_spec.rb +74 -35
- data/spec/fixtures/account_get_all/multiple.xml +15 -0
- data/spec/fixtures/account_get_all/none.xml +8 -0
- data/spec/fixtures/account_get_all/single.xml +12 -0
- data/spec/fixtures/account_get_data_array/multiple.xml +69 -0
- data/spec/fixtures/company_get/success.xml +10 -0
- data/spec/fixtures/company_get_data/success.xml +32 -0
- data/spec/fixtures/current_invoice_line_create_from_data/success.xml +6 -37
- data/spec/fixtures/debtor_create_from_data/success.xml +5 -52
- data/spec/fixtures/debtor_get_orders/none.xml +9 -0
- data/spec/fixtures/product_create_from_data/success.xml +37 -0
- data/spec/fixtures/product_find_by_number/found.xml +10 -0
- data/spec/fixtures/product_find_by_number/not_found.xml +6 -0
- data/spec/fixtures/product_get_all/multiple.xml +15 -0
- data/spec/fixtures/product_get_all/single.xml +12 -0
- data/spec/fixtures/product_get_data/success.xml +37 -0
- data/spec/fixtures/product_get_data_array/multiple.xml +69 -0
- data/spec/spec_helper.rb +6 -9
- data/spec/support/factories.rb +14 -14
- metadata +54 -9
data/lib/economic/debtor.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "economic/entity"
|
2
2
|
|
3
3
|
module Economic
|
4
|
-
|
5
4
|
# Represents a debtor in E-conomic.
|
6
5
|
#
|
7
6
|
# API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_IDebtor.html
|
@@ -53,7 +52,7 @@ module Economic
|
|
53
52
|
:balance
|
54
53
|
|
55
54
|
def handle
|
56
|
-
@handle || Handle.new(
|
55
|
+
@handle || Handle.new(:number => @number)
|
57
56
|
end
|
58
57
|
|
59
58
|
# Provides access to the current invoices for Debtor - ie invoices that
|
@@ -64,27 +63,27 @@ module Economic
|
|
64
63
|
|
65
64
|
# Returns the Debtors contacts
|
66
65
|
def contacts
|
67
|
-
return [] if
|
68
|
-
@contacts ||= DebtorProxy.new(self).get_debtor_contacts(
|
66
|
+
return [] if handle.empty?
|
67
|
+
@contacts ||= DebtorProxy.new(self).get_debtor_contacts(handle)
|
69
68
|
end
|
70
69
|
|
71
70
|
def invoices
|
72
|
-
return [] if
|
73
|
-
@invoices ||= DebtorProxy.new(self).get_invoices(
|
71
|
+
return [] if handle.empty?
|
72
|
+
@invoices ||= DebtorProxy.new(self).get_invoices(handle)
|
74
73
|
end
|
75
74
|
|
76
75
|
def orders
|
77
|
-
return [] if
|
78
|
-
@orders ||= DebtorProxy.new(self).get_orders(
|
76
|
+
return [] if handle.empty?
|
77
|
+
@orders ||= DebtorProxy.new(self).get_orders(handle)
|
79
78
|
end
|
80
79
|
|
81
80
|
protected
|
82
81
|
|
83
82
|
def fields
|
84
|
-
to_hash =
|
83
|
+
to_hash = proc { |handle| handle.to_hash }
|
85
84
|
[
|
86
85
|
["Handle", :handle, to_hash, :required],
|
87
|
-
["Number", :handle,
|
86
|
+
["Number", :handle, proc { |h| h.number }, :required],
|
88
87
|
["DebtorGroupHandle", :debtor_group_handle, to_hash],
|
89
88
|
["Name", :name, nil, :required],
|
90
89
|
["VatZone", :vat_zone, nil, :required],
|
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "economic/entity"
|
2
2
|
|
3
3
|
module Economic
|
4
|
-
|
5
4
|
# Represents a debtor contact.
|
6
5
|
#
|
7
6
|
# API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_IDebtorContact.html
|
@@ -45,7 +44,7 @@ module Economic
|
|
45
44
|
end
|
46
45
|
|
47
46
|
def handle
|
48
|
-
@handle || Handle.new(
|
47
|
+
@handle || Handle.new(:id => @id)
|
49
48
|
end
|
50
49
|
|
51
50
|
protected
|
@@ -53,17 +52,17 @@ module Economic
|
|
53
52
|
# Returns the field rules to use when mapping to SOAP data
|
54
53
|
def fields
|
55
54
|
[
|
56
|
-
["Handle", :handle,
|
57
|
-
["Id", :handle,
|
58
|
-
["DebtorHandle", :debtor,
|
55
|
+
["Handle", :handle, proc { |v| v.to_hash }, :required],
|
56
|
+
["Id", :handle, proc { |v| v.id }, :required],
|
57
|
+
["DebtorHandle", :debtor, proc { |v| v.handle.to_hash }],
|
59
58
|
["Name", :name, nil, :required],
|
60
59
|
["Number", :number],
|
61
60
|
["TelephoneNumber", :telephone_number],
|
62
61
|
["Email", :email],
|
63
62
|
["Comments", :comments],
|
64
63
|
["ExternalId", :external_id],
|
65
|
-
["IsToReceiveEmailCopyOfOrder", :is_to_receive_email_copy_of_order,
|
66
|
-
["IsToReceiveEmailCopyOfInvoice", :is_to_receive_email_copy_of_invoice,
|
64
|
+
["IsToReceiveEmailCopyOfOrder", :is_to_receive_email_copy_of_order, proc { |v| v || false }, :required],
|
65
|
+
["IsToReceiveEmailCopyOfInvoice", :is_to_receive_email_copy_of_invoice, proc { |v| v || false }, :required]
|
67
66
|
]
|
68
67
|
end
|
69
68
|
end
|
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "economic/entity"
|
2
2
|
|
3
3
|
module Economic
|
4
|
-
|
5
4
|
# Represents a debtor entry in E-conomic.
|
6
5
|
#
|
7
6
|
# API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_IDebtorEntry.html
|
@@ -22,5 +21,4 @@ module Economic
|
|
22
21
|
:remainder,
|
23
22
|
:remainder_default_currency
|
24
23
|
end
|
25
|
-
|
26
24
|
end
|
data/lib/economic/endpoint.rb
CHANGED
@@ -8,6 +8,18 @@ class Economic::Endpoint
|
|
8
8
|
def_delegator "client.globals", :log_level, :log_level=
|
9
9
|
def_delegator "client.globals", :log, :log=
|
10
10
|
|
11
|
+
# Create a new Endpoint
|
12
|
+
#
|
13
|
+
# Economic::Session uses this internally
|
14
|
+
#
|
15
|
+
# ==== Attributes
|
16
|
+
#
|
17
|
+
# * +app_identifier+ - A string identifiying your application, as described in http://techtalk.e-conomic.com/e-conomic-soap-api-now-requires-you-to-specify-a-custom-x-economicappidentifier-header/
|
18
|
+
#
|
19
|
+
def initialize(app_identifier = nil)
|
20
|
+
@app_identifier = app_identifier
|
21
|
+
end
|
22
|
+
|
11
23
|
# Invokes soap_action on the API endpoint with the given data.
|
12
24
|
#
|
13
25
|
# Returns a Hash with the resulting response from the endpoint as a Hash.
|
@@ -30,12 +42,16 @@ class Economic::Endpoint
|
|
30
42
|
#
|
31
43
|
# Cached on class-level to avoid loading the big WSDL file more than once (can
|
32
44
|
# take several hundred megabytes of RAM after a while...)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
45
|
+
#
|
46
|
+
# If you need to refresh the cached client and return a newly built instance,
|
47
|
+
# set force_new_instance to true
|
48
|
+
def client(force_new_instance: false)
|
49
|
+
reset_client if force_new_instance
|
50
|
+
options = client_options
|
51
|
+
if @app_identifier
|
52
|
+
options[:headers] = {"X-EconomicAppIdentifier" => @app_identifier}
|
38
53
|
end
|
54
|
+
@@client ||= Savon.client(options)
|
39
55
|
end
|
40
56
|
|
41
57
|
# Returns the E-conomic API action name to call
|
@@ -50,7 +66,17 @@ class Economic::Endpoint
|
|
50
66
|
|
51
67
|
def class_name_without_modules(entity_class)
|
52
68
|
class_name = entity_class.to_s
|
53
|
-
class_name.split(
|
69
|
+
class_name.split("::").last
|
70
|
+
end
|
71
|
+
|
72
|
+
def client_options
|
73
|
+
{
|
74
|
+
:wsdl => File.expand_path(
|
75
|
+
File.join(File.dirname(__FILE__), "economic.wsdl")
|
76
|
+
),
|
77
|
+
:log => false,
|
78
|
+
:log_level => :info
|
79
|
+
}
|
54
80
|
end
|
55
81
|
|
56
82
|
def extract_result_from_response(response, soap_action)
|
@@ -76,4 +102,8 @@ class Economic::Endpoint
|
|
76
102
|
locals
|
77
103
|
)
|
78
104
|
end
|
105
|
+
|
106
|
+
def reset_client
|
107
|
+
@@client = nil
|
108
|
+
end
|
79
109
|
end
|
@@ -8,14 +8,14 @@ class Economic::Entity
|
|
8
8
|
|
9
9
|
def self.id_properties
|
10
10
|
{
|
11
|
-
:code =>
|
12
|
-
:id =>
|
13
|
-
:id1 =>
|
14
|
-
:id2 =>
|
15
|
-
:name =>
|
16
|
-
:number =>
|
17
|
-
:serial_number =>
|
18
|
-
:vat_code =>
|
11
|
+
:code => "Code",
|
12
|
+
:id => "Id",
|
13
|
+
:id1 => "Id1",
|
14
|
+
:id2 => "Id2",
|
15
|
+
:name => "Name",
|
16
|
+
:number => "Number",
|
17
|
+
:serial_number => "SerialNumber",
|
18
|
+
:vat_code => "VatCode"
|
19
19
|
}
|
20
20
|
end
|
21
21
|
|
@@ -23,7 +23,7 @@ class Economic::Entity
|
|
23
23
|
id_properties.keys
|
24
24
|
end
|
25
25
|
|
26
|
-
attr_accessor
|
26
|
+
attr_accessor(*supported_keys)
|
27
27
|
|
28
28
|
# Returns true if Handle hasn't been initialized with any values yet. This
|
29
29
|
# usually happens when the handle is constructed for an entity whose id
|
@@ -36,10 +36,10 @@ class Economic::Entity
|
|
36
36
|
verify_sanity_of_arguments!(hash)
|
37
37
|
hash = prepare_hash_argument(hash) unless hash.is_a?(self.class)
|
38
38
|
|
39
|
-
[:code, :name, :vat_code].each do |key|
|
39
|
+
[:code, :name, :vat_code, :number].each do |key|
|
40
40
|
instance_variable_set("@#{key}", hash[key]) if hash[key]
|
41
41
|
end
|
42
|
-
[:id, :id1, :id2, :
|
42
|
+
[:id, :id1, :id2, :serial_number].each do |key|
|
43
43
|
instance_variable_set("@#{key}", hash[key].to_i) if hash[key]
|
44
44
|
end
|
45
45
|
end
|
@@ -48,7 +48,7 @@ class Economic::Entity
|
|
48
48
|
only_keys = [only_keys].flatten
|
49
49
|
only_keys.each_with_object({}) do |key, hash|
|
50
50
|
property = id_properties[key]
|
51
|
-
value =
|
51
|
+
value = send(key)
|
52
52
|
next if value.blank?
|
53
53
|
hash[property] = value
|
54
54
|
end
|
@@ -59,44 +59,69 @@ class Economic::Entity
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def ==(other)
|
62
|
-
return true if
|
62
|
+
return true if object_id == other.object_id
|
63
63
|
return false if other.nil?
|
64
64
|
return false if empty? || (other.respond_to?(:empty?) && other.empty?)
|
65
65
|
return false unless other.respond_to?(:id) && other.respond_to?(:number)
|
66
|
-
|
66
|
+
id == other.id &&
|
67
|
+
number == other.number &&
|
68
|
+
id1 == other.id1 &&
|
69
|
+
id2 == other.id2 &&
|
70
|
+
name == other.name
|
67
71
|
end
|
68
72
|
|
69
73
|
private
|
70
74
|
|
75
|
+
def handleish?(object)
|
76
|
+
return false if object.nil?
|
77
|
+
return true if object.is_a?(self.class)
|
78
|
+
return true if object.is_a?(Hash)
|
79
|
+
false
|
80
|
+
end
|
81
|
+
|
71
82
|
def id_properties
|
72
83
|
self.class.id_properties
|
73
84
|
end
|
74
85
|
|
86
|
+
def verify_all_keys_are_known(hash)
|
87
|
+
if hash.respond_to?(:keys)
|
88
|
+
unknown_keys = hash.keys - id_properties.keys - id_properties.values
|
89
|
+
raise(
|
90
|
+
ArgumentError,
|
91
|
+
"Unknown keys in handle: #{unknown_keys.inspect}"
|
92
|
+
) unless unknown_keys.empty?
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
75
96
|
# Raises exceptions if hash doesn't contain values we can use to construct a
|
76
97
|
# new handle
|
77
98
|
def verify_sanity_of_arguments!(hash)
|
78
|
-
|
99
|
+
verify_usability_for_handle(hash)
|
100
|
+
verify_all_keys_are_known(hash)
|
101
|
+
end
|
79
102
|
|
80
|
-
|
81
|
-
|
82
|
-
end
|
103
|
+
def verify_usability_for_handle(hash)
|
104
|
+
return if handleish?(hash)
|
83
105
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
106
|
+
raise(
|
107
|
+
ArgumentError,
|
108
|
+
"Expected Hash or Economic::Entity::Handle - got #{hash.inspect}"
|
109
|
+
)
|
88
110
|
end
|
89
111
|
|
90
112
|
# Examples
|
91
113
|
#
|
92
|
-
# prepare_hash_argument(
|
93
|
-
#
|
94
|
-
#
|
95
|
-
# prepare_hash_argument('Id' => 12
|
114
|
+
# prepare_hash_argument(:id => 12)
|
115
|
+
# #=> {:id => 12}
|
116
|
+
#
|
117
|
+
# prepare_hash_argument('Id' => 12)
|
118
|
+
# #=> {:id => 12}
|
119
|
+
#
|
120
|
+
# prepare_hash_argument('Id' => 12, 'Number' => 13)
|
121
|
+
# #=> {:id => 12, :number => 13}
|
96
122
|
def prepare_hash_argument(hash)
|
97
|
-
hash
|
98
|
-
hash[:
|
99
|
-
hash[:number] ||= hash['Number']
|
123
|
+
hash[:id] ||= hash["Id"]
|
124
|
+
hash[:number] ||= hash["Number"]
|
100
125
|
hash
|
101
126
|
end
|
102
127
|
end
|
data/lib/economic/entity.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "economic/endpoint"
|
2
|
+
require "economic/entity/handle"
|
3
|
+
require "economic/entity/mapper"
|
4
4
|
|
5
5
|
module Economic
|
6
6
|
class Entity
|
@@ -33,7 +33,7 @@ module Economic
|
|
33
33
|
# Create a property getter that loads the full Entity from the API if
|
34
34
|
# necessary
|
35
35
|
def property_reader(property)
|
36
|
-
define_method
|
36
|
+
define_method property.to_s do
|
37
37
|
value = instance_variable_get("@#{property}")
|
38
38
|
if value.nil? && partial? && persisted?
|
39
39
|
instance_variable_get("@#{property}")
|
@@ -72,7 +72,7 @@ module Economic
|
|
72
72
|
|
73
73
|
# Returns the class used to instantiate a proxy for Entity
|
74
74
|
def proxy
|
75
|
-
class_name = name.split(
|
75
|
+
class_name = name.split("::").last
|
76
76
|
proxy_class_name = "#{class_name}Proxy"
|
77
77
|
Economic.const_get(proxy_class_name)
|
78
78
|
end
|
@@ -83,7 +83,7 @@ module Economic
|
|
83
83
|
# Entity.key #=> :entity
|
84
84
|
# CurrentInvoice.key #=> :current_invoice
|
85
85
|
def key
|
86
|
-
key =
|
86
|
+
key = name
|
87
87
|
key = Economic::Support::String.demodulize(key)
|
88
88
|
key = Economic::Support::String.underscore(key)
|
89
89
|
key.intern
|
@@ -91,7 +91,7 @@ module Economic
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def handle
|
94
|
-
@handle || Handle.build(
|
94
|
+
@handle || Handle.build(:number => @number, :id => @id)
|
95
95
|
end
|
96
96
|
|
97
97
|
def handle=(handle)
|
@@ -108,22 +108,23 @@ module Economic
|
|
108
108
|
# Updates Entity with its data from the API
|
109
109
|
def get_data
|
110
110
|
response = proxy.get_data(handle)
|
111
|
-
|
111
|
+
update_properties(response)
|
112
112
|
self.partial = false
|
113
113
|
self.persisted = true
|
114
114
|
end
|
115
115
|
|
116
|
+
# Get default Entity with its number from the API
|
117
|
+
def get
|
118
|
+
proxy.get
|
119
|
+
end
|
120
|
+
|
116
121
|
# Returns the number of Entity. This does not trigger a load from the API
|
117
122
|
# even if Entity is partial
|
118
|
-
|
119
|
-
@number
|
120
|
-
end
|
123
|
+
attr_reader :number
|
121
124
|
|
122
125
|
# Returns the id of Entity. This does not trigger a load from the API even
|
123
126
|
# if Entity is partial
|
124
|
-
|
125
|
-
@id
|
126
|
-
end
|
127
|
+
attr_reader :id
|
127
128
|
|
128
129
|
# Returns true if CurrentInvoiceLine has been persisted in e-conomic
|
129
130
|
def persisted?
|
@@ -144,8 +145,8 @@ module Economic
|
|
144
145
|
end
|
145
146
|
|
146
147
|
def inspect
|
147
|
-
props = self.class.properties.collect { |p| "#{p}=#{
|
148
|
-
"#<#{self.class}:#{
|
148
|
+
props = self.class.properties.collect { |p| "#{p}=#{send(p).inspect}" }
|
149
|
+
"#<#{self.class}:#{object_id} partial=#{partial?}, persisted=#{persisted?}, #{props.join(', ')}>"
|
149
150
|
end
|
150
151
|
|
151
152
|
# Persist the Entity to the API
|
@@ -156,7 +157,7 @@ module Economic
|
|
156
157
|
# Deletes entity permanently from E-conomic.
|
157
158
|
def destroy
|
158
159
|
handleKey = "#{Support::String.camel_back(class_name)}Handle"
|
159
|
-
response = request(:delete,
|
160
|
+
response = request(:delete, handleKey => handle.to_hash)
|
160
161
|
|
161
162
|
@persisted = false
|
162
163
|
@partial = true
|
@@ -168,15 +169,15 @@ module Economic
|
|
168
169
|
def update_properties(hash)
|
169
170
|
hash.each do |key, value|
|
170
171
|
setter_method = "#{key}="
|
171
|
-
if
|
172
|
-
|
172
|
+
if respond_to?(setter_method)
|
173
|
+
send(setter_method, value)
|
173
174
|
end
|
174
175
|
end
|
175
176
|
end
|
176
177
|
|
177
178
|
def ==(other)
|
178
179
|
return false if other.nil?
|
179
|
-
|
180
|
+
handle == other.handle && other.is_a?(self.class)
|
180
181
|
end
|
181
182
|
|
182
183
|
protected
|
@@ -190,9 +191,7 @@ module Economic
|
|
190
191
|
end
|
191
192
|
|
192
193
|
def create
|
193
|
-
response = request(:create_from_data,
|
194
|
-
'data' => build_soap_data
|
195
|
-
})
|
194
|
+
response = request(:create_from_data, "data" => build_soap_data)
|
196
195
|
|
197
196
|
if response
|
198
197
|
@number = response[:number]
|
@@ -204,7 +203,7 @@ module Economic
|
|
204
203
|
@persisted = true
|
205
204
|
@partial = false
|
206
205
|
|
207
|
-
|
206
|
+
response
|
208
207
|
end
|
209
208
|
|
210
209
|
def defaults
|
@@ -212,14 +211,12 @@ module Economic
|
|
212
211
|
end
|
213
212
|
|
214
213
|
def update
|
215
|
-
response = request(:update_from_data,
|
216
|
-
'data' => build_soap_data
|
217
|
-
})
|
214
|
+
response = request(:update_from_data, "data" => build_soap_data)
|
218
215
|
|
219
216
|
@persisted = true
|
220
217
|
@partial = false
|
221
218
|
|
222
|
-
|
219
|
+
response
|
223
220
|
end
|
224
221
|
|
225
222
|
# Returns Hash with the data structure to send to the API
|
@@ -245,7 +242,7 @@ module Economic
|
|
245
242
|
|
246
243
|
def initialize_defaults
|
247
244
|
defaults.each do |property_name, default_value|
|
248
|
-
|
245
|
+
send("#{property_name}=", default_value)
|
249
246
|
end
|
250
247
|
end
|
251
248
|
end
|
data/lib/economic/entry.rb
CHANGED
data/lib/economic/invoice.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "economic/entity"
|
2
2
|
|
3
3
|
module Economic
|
4
4
|
class Invoice < Entity
|
@@ -6,10 +6,10 @@ module Economic
|
|
6
6
|
:net_amount,
|
7
7
|
:vat_amount,
|
8
8
|
:gross_amount,
|
9
|
+
:date,
|
9
10
|
:due_date,
|
10
11
|
:debtor_handle,
|
11
12
|
:debtor_name,
|
12
|
-
:debtor_name,
|
13
13
|
:debtor_address,
|
14
14
|
:debtor_postal_code,
|
15
15
|
:debtor_city,
|
@@ -49,9 +49,18 @@ module Economic
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def remainder
|
52
|
-
request(:get_remainder,
|
53
|
-
|
54
|
-
|
52
|
+
@remainder ||= request(:get_remainder, "invoiceHandle" => handle.to_hash).to_f
|
53
|
+
end
|
54
|
+
|
55
|
+
def days_past_due
|
56
|
+
days = Date.today - due_date.to_date
|
57
|
+
days > 0 ? days : 0
|
58
|
+
end
|
59
|
+
|
60
|
+
# Returns true if the due date has expired, and there is a remainder
|
61
|
+
# left on the invoice
|
62
|
+
def past_due?
|
63
|
+
days_past_due > 0 && remainder > 0
|
55
64
|
end
|
56
65
|
|
57
66
|
# Returns the PDF version of Invoice as a String.
|
@@ -62,9 +71,7 @@ module Economic
|
|
62
71
|
# file << invoice.pdf
|
63
72
|
# end
|
64
73
|
def pdf
|
65
|
-
response = request(:get_pdf,
|
66
|
-
"invoiceHandle" => handle.to_hash
|
67
|
-
})
|
74
|
+
response = request(:get_pdf, "invoiceHandle" => handle.to_hash)
|
68
75
|
|
69
76
|
Base64.decode64(response)
|
70
77
|
end
|
data/lib/economic/order.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "economic/entity"
|
2
2
|
|
3
3
|
module Economic
|
4
4
|
class Order < Entity
|
@@ -56,9 +56,7 @@ module Economic
|
|
56
56
|
# file << invoice.pdf
|
57
57
|
# end
|
58
58
|
def pdf
|
59
|
-
response = request(:get_pdf,
|
60
|
-
"orderHandle" => handle.to_hash
|
61
|
-
})
|
59
|
+
response = request(:get_pdf, "orderHandle" => handle.to_hash)
|
62
60
|
|
63
61
|
Base64.decode64(response)
|
64
62
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "economic/entity"
|
2
|
+
|
3
|
+
module Economic
|
4
|
+
# Represents a product in E-conomic.
|
5
|
+
#
|
6
|
+
# API documentation: http://www.e-conomic.com/apidocs/Documentation/T_Economic_Api_IProduct.html
|
7
|
+
#
|
8
|
+
# Examples
|
9
|
+
#
|
10
|
+
# # Find a product:
|
11
|
+
# product = economic.products.find(1234)
|
12
|
+
#
|
13
|
+
# # Creating a product:
|
14
|
+
# product = economic.products.build
|
15
|
+
# product.number = 'ESC2014-LED-DISPLAY'
|
16
|
+
# product.product_group_handle = { :number => 1 }
|
17
|
+
# product.name = '100 meter LED display'
|
18
|
+
# product.sales_price = 999999
|
19
|
+
# product.cost_price = 100000
|
20
|
+
# product.recommended_price = 999999
|
21
|
+
# product.is_accessible = true
|
22
|
+
# product.volume = 1
|
23
|
+
# product.save
|
24
|
+
class Product < Entity
|
25
|
+
has_properties :number,
|
26
|
+
:product_group_handle,
|
27
|
+
:name,
|
28
|
+
:description,
|
29
|
+
:bar_code,
|
30
|
+
:sales_price,
|
31
|
+
:cost_price,
|
32
|
+
:recommended_price,
|
33
|
+
:unit_handle,
|
34
|
+
:is_accessible,
|
35
|
+
:volume,
|
36
|
+
:department_handle,
|
37
|
+
:distribution_key_handle,
|
38
|
+
:in_stock,
|
39
|
+
:on_order,
|
40
|
+
:ordered,
|
41
|
+
:available
|
42
|
+
|
43
|
+
def handle
|
44
|
+
@handle ||= Handle.new(:number => @number)
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
|
49
|
+
def fields
|
50
|
+
to_hash = proc { |handle| handle.to_hash }
|
51
|
+
[
|
52
|
+
["Handle", :handle, to_hash, :required],
|
53
|
+
["Number", :handle, proc { |h| h.number }, :required],
|
54
|
+
["ProductGroupHandle", :product_group_handle, to_hash],
|
55
|
+
["Name", :name, nil, :required],
|
56
|
+
["Description", :description, nil],
|
57
|
+
["BarCode", :bar_code, nil],
|
58
|
+
["SalesPrice", :sales_price, nil, :required],
|
59
|
+
["CostPrice", :cost_price, nil, :required],
|
60
|
+
["RecommendedPrice", :recommended_price, nil, :required],
|
61
|
+
["UnitHandle", :unit_handle, to_hash],
|
62
|
+
["IsAccessible", :is_accessible, nil, :required],
|
63
|
+
["Volume", :volume, nil, :required],
|
64
|
+
["DepartmentHandle", :department_handle, to_hash],
|
65
|
+
["DistributionKeyHandle", :distribution_key_handle, to_hash],
|
66
|
+
["InStock", :in_stock],
|
67
|
+
["OnOrder", :on_order],
|
68
|
+
["Ordered", :ordered],
|
69
|
+
["Available", :available]
|
70
|
+
]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -1,11 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "economic/proxies/entity_proxy"
|
2
2
|
|
3
3
|
module Economic
|
4
4
|
class AccountProxy < EntityProxy
|
5
5
|
def find_by_name(name)
|
6
|
-
response = request(
|
7
|
-
'name' => name
|
8
|
-
})
|
6
|
+
response = request("FindByName", "name" => name)
|
9
7
|
|
10
8
|
handle = response[:account_handle]
|
11
9
|
|