rconomic 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|