rconomic 0.5.1 → 0.5.2
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/.travis.yml +1 -0
- data/LICENSE +6 -4
- data/README.md +19 -8
- data/Rakefile +9 -1
- data/lib/economic/account.rb +6 -6
- data/lib/economic/cash_book.rb +6 -6
- data/lib/economic/creditor.rb +26 -27
- data/lib/economic/current_invoice.rb +26 -1
- data/lib/economic/current_invoice_line.rb +17 -21
- data/lib/economic/debtor.rb +16 -5
- data/lib/economic/economic.wsdl +28493 -23200
- data/lib/economic/endpoint.rb +8 -1
- data/lib/economic/entity/handle.rb +2 -1
- data/lib/economic/invoice.rb +1 -0
- data/lib/economic/order.rb +66 -0
- data/lib/economic/proxies/actions/find_by_number.rb +1 -1
- data/lib/economic/proxies/actions/find_by_telephone_and_fax_number.rb +18 -0
- data/lib/economic/proxies/debtor_proxy.rb +63 -0
- data/lib/economic/proxies/entity_proxy.rb +0 -1
- data/lib/economic/proxies/order_proxy.rb +18 -0
- data/lib/economic/session.rb +37 -12
- data/lib/rconomic.rb +2 -0
- data/lib/rconomic/version.rb +1 -1
- data/rconomic.gemspec +1 -1
- data/spec/economic/account_spec.rb +34 -0
- data/spec/economic/cash_book_spec.rb +28 -0
- data/spec/economic/creditor_spec.rb +19 -0
- data/spec/economic/current_invoice_line_spec.rb +21 -0
- data/spec/economic/debtor_spec.rb +33 -8
- data/spec/economic/endpoint_spec.rb +18 -0
- data/spec/economic/entity/handle_spec.rb +2 -2
- data/spec/economic/order_spec.rb +80 -0
- data/spec/economic/proxies/debtor_contact_proxy_spec.rb +1 -1
- data/spec/economic/proxies/debtor_proxy_spec.rb +69 -0
- data/spec/economic/proxies/order_proxy_spec.rb +67 -0
- data/spec/economic/session_spec.rb +99 -11
- data/spec/fixtures/cash_book_update_from_data/success.xml +14 -0
- data/spec/fixtures/connect_with_token/success.xml +8 -0
- data/spec/fixtures/creditor_create_from_data/success.xml +49 -0
- data/spec/fixtures/current_invoice_line_create_from_data/success.xml +42 -0
- data/spec/fixtures/debtor_find_by_telephone_and_fax_number/found.xml +12 -0
- data/spec/fixtures/debtor_find_by_telephone_and_fax_number/not_found.xml +7 -0
- data/spec/fixtures/debtor_get_debtor_contacts/multiple.xml +15 -0
- data/spec/fixtures/debtor_get_debtor_contacts/none.xml +9 -0
- data/spec/fixtures/debtor_get_invoices/success.xml +15 -0
- data/spec/fixtures/debtor_get_orders/success.xml +12 -0
- data/spec/fixtures/order_find_by_date_interval/many.xml +15 -0
- data/spec/fixtures/order_find_by_date_interval/none.xml +9 -0
- data/spec/fixtures/order_find_by_date_interval/single.xml +12 -0
- data/spec/fixtures/order_get_data/success.xml +75 -0
- data/spec/fixtures/order_get_data_array/multiple.xml +145 -0
- data/spec/fixtures/order_get_data_array/single.xml +77 -0
- data/spec/fixtures/order_get_pdf/success.xml +8 -0
- metadata +28 -4
data/lib/economic/endpoint.rb
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
#
|
3
3
|
# This is where all knowledge of SOAP actions and requests exists.
|
4
4
|
class Economic::Endpoint
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
def_delegator "client.globals", :logger, :logger=
|
8
|
+
def_delegator "client.globals", :log_level, :log_level=
|
9
|
+
def_delegator "client.globals", :log, :log=
|
5
10
|
|
6
11
|
# Invokes soap_action on the API endpoint with the given data.
|
7
12
|
#
|
@@ -27,7 +32,9 @@ class Economic::Endpoint
|
|
27
32
|
# take several hundred megabytes of RAM after a while...)
|
28
33
|
def client
|
29
34
|
@@client ||= Savon.client do
|
30
|
-
wsdl
|
35
|
+
wsdl File.expand_path(File.join(File.dirname(__FILE__), "economic.wsdl"))
|
36
|
+
log false
|
37
|
+
log_level :info
|
31
38
|
end
|
32
39
|
end
|
33
40
|
|
@@ -12,6 +12,7 @@ class Economic::Entity
|
|
12
12
|
:id => 'Id',
|
13
13
|
:id1 => 'Id1',
|
14
14
|
:id2 => 'Id2',
|
15
|
+
:name => 'Name',
|
15
16
|
:number => 'Number',
|
16
17
|
:serial_number => 'SerialNumber',
|
17
18
|
:vat_code => 'VatCode'
|
@@ -35,7 +36,7 @@ class Economic::Entity
|
|
35
36
|
verify_sanity_of_arguments!(hash)
|
36
37
|
hash = prepare_hash_argument(hash) unless hash.is_a?(self.class)
|
37
38
|
|
38
|
-
[:code, :vat_code].each do |key|
|
39
|
+
[:code, :name, :vat_code].each do |key|
|
39
40
|
instance_variable_set("@#{key}", hash[key]) if hash[key]
|
40
41
|
end
|
41
42
|
[:id, :id1, :id2, :number, :serial_number].each do |key|
|
data/lib/economic/invoice.rb
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'economic/entity'
|
2
|
+
|
3
|
+
module Economic
|
4
|
+
class Order < Entity
|
5
|
+
has_properties :number,
|
6
|
+
:net_amount,
|
7
|
+
:vat_amount,
|
8
|
+
:gross_amount,
|
9
|
+
:due_date,
|
10
|
+
:debtor_handle,
|
11
|
+
:debtor_name,
|
12
|
+
:debtor_name,
|
13
|
+
:debtor_address,
|
14
|
+
:debtor_postal_code,
|
15
|
+
:debtor_city,
|
16
|
+
:debtor_country,
|
17
|
+
:debtor_ean,
|
18
|
+
:attention_handle,
|
19
|
+
:heading
|
20
|
+
|
21
|
+
def attention
|
22
|
+
return nil if attention_handle.nil?
|
23
|
+
@attention ||= session.contacts.find(attention_handle)
|
24
|
+
end
|
25
|
+
|
26
|
+
def attention=(contact)
|
27
|
+
self.attention_handle = contact.handle
|
28
|
+
@attention = contact
|
29
|
+
end
|
30
|
+
|
31
|
+
def attention_handle=(handle)
|
32
|
+
@attention = nil unless handle == @attention_handle
|
33
|
+
@attention_handle = handle
|
34
|
+
end
|
35
|
+
|
36
|
+
def debtor
|
37
|
+
return nil if debtor_handle.nil?
|
38
|
+
@debtor ||= session.debtors.find(debtor_handle)
|
39
|
+
end
|
40
|
+
|
41
|
+
def debtor=(debtor)
|
42
|
+
self.debtor_handle = debtor.handle
|
43
|
+
@debtor = debtor
|
44
|
+
end
|
45
|
+
|
46
|
+
def debtor_handle=(handle)
|
47
|
+
@debtor = nil unless handle == @debtor_handle
|
48
|
+
@debtor_handle = handle
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns the PDF version of Invoice as a String.
|
52
|
+
#
|
53
|
+
# To get it as a file you can do:
|
54
|
+
#
|
55
|
+
# File.open("invoice.pdf", 'wb') do |file|
|
56
|
+
# file << invoice.pdf
|
57
|
+
# end
|
58
|
+
def pdf
|
59
|
+
response = request(:get_pdf, {
|
60
|
+
"orderHandle" => handle.to_hash
|
61
|
+
})
|
62
|
+
|
63
|
+
Base64.decode64(response)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module FindByTelephoneAndFaxNumber
|
2
|
+
# Returns handle for debtor with phone or fax number.
|
3
|
+
def find_by_telephone_and_fax_number(number)
|
4
|
+
response = request('FindByTelephoneAndFaxNumber', {
|
5
|
+
'telephoneAndFaxNumber' => number
|
6
|
+
})
|
7
|
+
if response == {}
|
8
|
+
nil
|
9
|
+
else
|
10
|
+
entity = build
|
11
|
+
entity.partial = true
|
12
|
+
entity.persisted = true
|
13
|
+
entity.handle = response[:debtor_handle]
|
14
|
+
entity.number = response[:debtor_handle][:number].to_i
|
15
|
+
entity
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -2,16 +2,79 @@ require 'economic/proxies/entity_proxy'
|
|
2
2
|
require 'economic/proxies/actions/find_by_ci_number'
|
3
3
|
require 'economic/proxies/actions/find_by_handle_with_number'
|
4
4
|
require 'economic/proxies/actions/find_by_number'
|
5
|
+
require 'economic/proxies/actions/find_by_telephone_and_fax_number'
|
5
6
|
|
6
7
|
module Economic
|
7
8
|
class DebtorProxy < EntityProxy
|
8
9
|
include FindByCiNumber
|
9
10
|
include FindByHandleWithNumber
|
10
11
|
include FindByNumber
|
12
|
+
include FindByTelephoneAndFaxNumber
|
11
13
|
|
12
14
|
# Returns the next available debtor number
|
13
15
|
def next_available_number
|
14
16
|
request :get_next_available_number
|
15
17
|
end
|
18
|
+
|
19
|
+
def get_debtor_contacts(debtor_handle)
|
20
|
+
response = request :get_debtor_contacts, {
|
21
|
+
'debtorHandle' => { 'Number' => debtor_handle.number }
|
22
|
+
}
|
23
|
+
if response.empty?
|
24
|
+
nil
|
25
|
+
else
|
26
|
+
entities = []
|
27
|
+
[response[:debtor_contact_handle]].flatten.each do |handle|
|
28
|
+
entity = Economic::DebtorContact.new(:session => session)
|
29
|
+
entity.partial = true
|
30
|
+
entity.persisted = true
|
31
|
+
entity.handle = handle
|
32
|
+
entity.number = handle[:number].to_i
|
33
|
+
entities << entity
|
34
|
+
end
|
35
|
+
entities
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def get_invoices(debtor_handle)
|
40
|
+
response = request :get_invoices, {
|
41
|
+
'debtorHandle' => { 'Number' => debtor_handle.number }
|
42
|
+
}
|
43
|
+
if response.empty?
|
44
|
+
nil
|
45
|
+
else
|
46
|
+
entities = []
|
47
|
+
[response[:invoice_handle]].flatten.each do |handle|
|
48
|
+
entity = Economic::Invoice.new(:session => session)
|
49
|
+
entity.partial = true
|
50
|
+
entity.persisted = true
|
51
|
+
entity.handle = handle
|
52
|
+
entity.number = handle[:number].to_i
|
53
|
+
entities << entity
|
54
|
+
end
|
55
|
+
entities
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Returns handle for orders for debtor.
|
60
|
+
def get_orders(debtor_handle)
|
61
|
+
response = request :get_orders, {
|
62
|
+
'debtorHandle' => { 'Number' => debtor_handle.number }
|
63
|
+
}
|
64
|
+
if response.empty?
|
65
|
+
nil
|
66
|
+
else
|
67
|
+
entities = []
|
68
|
+
[response[:order_handle]].flatten.each do |handle|
|
69
|
+
entity = Economic::Order.new(:session => session)
|
70
|
+
entity.partial = true
|
71
|
+
entity.persisted = true
|
72
|
+
entity.handle = handle
|
73
|
+
entity.number = handle[:id].to_i
|
74
|
+
entities << entity
|
75
|
+
end
|
76
|
+
entities
|
77
|
+
end
|
78
|
+
end
|
16
79
|
end
|
17
80
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'economic/proxies/entity_proxy'
|
2
|
+
require 'economic/proxies/actions/find_by_date_interval'
|
3
|
+
require 'economic/proxies/actions/find_by_handle_with_number'
|
4
|
+
|
5
|
+
module Economic
|
6
|
+
class OrderProxy < EntityProxy
|
7
|
+
include FindByDateInterval
|
8
|
+
include FindByHandleWithNumber
|
9
|
+
|
10
|
+
def find(handle)
|
11
|
+
if handle.is_a?(Hash)
|
12
|
+
super handle
|
13
|
+
else
|
14
|
+
super({:id => handle})
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/economic/session.rb
CHANGED
@@ -1,26 +1,54 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
module Economic
|
2
4
|
# The Economic::Session contains details and behaviors for a current
|
3
5
|
# connection to the API endpoint.
|
4
6
|
class Session
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
def_delegators :endpoint, :logger=, :log_level=, :log=
|
10
|
+
|
5
11
|
attr_accessor :agreement_number, :user_name, :password
|
6
12
|
attr_reader :authentication_token
|
7
13
|
|
8
|
-
def initialize(agreement_number, user_name, password)
|
14
|
+
def initialize(agreement_number = nil, user_name = nil, password = nil)
|
9
15
|
self.agreement_number = agreement_number
|
10
16
|
self.user_name = user_name
|
11
17
|
self.password = password
|
18
|
+
yield endpoint if block_given?
|
12
19
|
end
|
13
20
|
|
14
|
-
|
15
|
-
|
21
|
+
def connect_with_token(private_app_id, access_id)
|
22
|
+
endpoint.call(
|
23
|
+
:connect_with_token,
|
24
|
+
{
|
25
|
+
:token => access_id,
|
26
|
+
:appToken => private_app_id
|
27
|
+
}
|
28
|
+
) do |response|
|
29
|
+
store_authentication_token(response)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def connect_with_credentials(agreement_number, user_name, password)
|
16
34
|
endpoint.call(
|
17
35
|
:connect,
|
18
|
-
|
36
|
+
{
|
37
|
+
:agreementNumber => agreement_number,
|
38
|
+
:userName => user_name,
|
39
|
+
:password => password
|
40
|
+
}
|
19
41
|
) do |response|
|
20
42
|
store_authentication_token(response)
|
21
43
|
end
|
22
44
|
end
|
23
45
|
|
46
|
+
# Authenticates with E-conomic using credentials
|
47
|
+
# Assumes ::new was called with credentials as arguments.
|
48
|
+
def connect
|
49
|
+
connect_with_credentials(self.agreement_number, self.user_name, self.password)
|
50
|
+
end
|
51
|
+
|
24
52
|
# Provides access to the DebtorContacts
|
25
53
|
def contacts
|
26
54
|
@contacts ||= DebtorContactProxy.new(self)
|
@@ -37,6 +65,11 @@ module Economic
|
|
37
65
|
@invoices ||= InvoiceProxy.new(self)
|
38
66
|
end
|
39
67
|
|
68
|
+
# Provides access to the orders
|
69
|
+
def orders
|
70
|
+
@orders ||= OrderProxy.new(self)
|
71
|
+
end
|
72
|
+
|
40
73
|
# Provides access to the debtors
|
41
74
|
def debtors
|
42
75
|
@debtors ||= DebtorProxy.new(self)
|
@@ -88,14 +121,6 @@ module Economic
|
|
88
121
|
|
89
122
|
private
|
90
123
|
|
91
|
-
def authentication_details
|
92
|
-
{
|
93
|
-
:agreementNumber => self.agreement_number,
|
94
|
-
:userName => self.user_name,
|
95
|
-
:password => self.password
|
96
|
-
}
|
97
|
-
end
|
98
|
-
|
99
124
|
def store_authentication_token(response)
|
100
125
|
@authentication_token = response.http.cookies
|
101
126
|
end
|
data/lib/rconomic.rb
CHANGED
@@ -12,6 +12,7 @@ require 'economic/creditor_contact'
|
|
12
12
|
require 'economic/current_invoice'
|
13
13
|
require 'economic/current_invoice_line'
|
14
14
|
require 'economic/invoice'
|
15
|
+
require 'economic/order'
|
15
16
|
require 'economic/cash_book'
|
16
17
|
require 'economic/cash_book_entry'
|
17
18
|
require 'economic/account'
|
@@ -26,6 +27,7 @@ require 'economic/proxies/debtor_contact_proxy'
|
|
26
27
|
require 'economic/proxies/creditor_proxy'
|
27
28
|
require 'economic/proxies/creditor_contact_proxy'
|
28
29
|
require 'economic/proxies/invoice_proxy'
|
30
|
+
require 'economic/proxies/order_proxy'
|
29
31
|
require 'economic/proxies/cash_book_proxy'
|
30
32
|
require 'economic/proxies/cash_book_entry_proxy'
|
31
33
|
require 'economic/proxies/account_proxy'
|
data/lib/rconomic/version.rb
CHANGED
data/rconomic.gemspec
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
|
3
|
+
describe Economic::Account do
|
4
|
+
let(:session) { make_session }
|
5
|
+
subject { Economic::Account.new(:session => session) }
|
6
|
+
|
7
|
+
it "inherits from Economic::Entity" do
|
8
|
+
expect(Economic::Account.ancestors).to include(Economic::Entity)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#save" do
|
12
|
+
it 'should save it' do
|
13
|
+
stub_request('Account_CreateFromData', nil, :success)
|
14
|
+
subject.save
|
15
|
+
end
|
16
|
+
|
17
|
+
it "builds and sends data to API" do
|
18
|
+
subject.handle = {"Name" => "Bob"}
|
19
|
+
subject.name = "Bob"
|
20
|
+
subject.number = 42
|
21
|
+
mock_request(
|
22
|
+
:account_create_from_data, {
|
23
|
+
"data" => {
|
24
|
+
"Handle" => {"Name" => "Bob"},
|
25
|
+
"Name" => "Bob",
|
26
|
+
"Number" => 42
|
27
|
+
}
|
28
|
+
},
|
29
|
+
:success
|
30
|
+
)
|
31
|
+
subject.save
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -31,4 +31,32 @@ describe Economic::CashBook do
|
|
31
31
|
expect(subject.book).to eq(832)
|
32
32
|
end
|
33
33
|
end
|
34
|
+
|
35
|
+
describe "#save" do
|
36
|
+
before :each do
|
37
|
+
subject.persisted = true
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should save it' do
|
41
|
+
stub_request('CashBook_UpdateFromData', nil, :success)
|
42
|
+
subject.save
|
43
|
+
end
|
44
|
+
|
45
|
+
it "builds and sends data to API" do
|
46
|
+
subject.handle = {"Number" => 42}
|
47
|
+
subject.name = "Bob"
|
48
|
+
subject.number = 42
|
49
|
+
mock_request(
|
50
|
+
:cash_book_update_from_data, {
|
51
|
+
"data" => {
|
52
|
+
"Handle" => {"Number" => 42},
|
53
|
+
"Name" => "Bob",
|
54
|
+
"Number" => 42
|
55
|
+
}
|
56
|
+
},
|
57
|
+
:success
|
58
|
+
)
|
59
|
+
subject.save
|
60
|
+
end
|
61
|
+
end
|
34
62
|
end
|
@@ -49,4 +49,23 @@ describe Economic::Creditor do
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
describe "#save" do
|
53
|
+
it 'should save it' do
|
54
|
+
stub_request('Creditor_CreateFromData', nil, :success)
|
55
|
+
subject.save
|
56
|
+
end
|
57
|
+
|
58
|
+
it "builds and sends data to API" do
|
59
|
+
mock_request(
|
60
|
+
:creditor_create_from_data, {
|
61
|
+
"data" => {
|
62
|
+
"Handle" => {},
|
63
|
+
"Number" => nil
|
64
|
+
}
|
65
|
+
},
|
66
|
+
:success
|
67
|
+
)
|
68
|
+
subject.save
|
69
|
+
end
|
70
|
+
end
|
52
71
|
end
|