rconomic 0.5.2 → 0.6.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.
- 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
|
|