invoicexpress 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +0 -0
- data/README.md +322 -0
- data/Rakefile +19 -0
- data/invoicexpress.gemspec +26 -0
- data/lib/faraday/response/parse_xml.rb +23 -0
- data/lib/faraday/response/raise_invoicexpress_errors.rb +20 -0
- data/lib/invoicexpress.rb +26 -0
- data/lib/invoicexpress/authentication.rb +15 -0
- data/lib/invoicexpress/client.rb +56 -0
- data/lib/invoicexpress/client/cash_invoices.rb +110 -0
- data/lib/invoicexpress/client/charts.rb +57 -0
- data/lib/invoicexpress/client/clients.rb +215 -0
- data/lib/invoicexpress/client/credit_notes.rb +128 -0
- data/lib/invoicexpress/client/debit_notes.rb +129 -0
- data/lib/invoicexpress/client/invoices.rb +107 -0
- data/lib/invoicexpress/client/items.rb +82 -0
- data/lib/invoicexpress/client/purchase_orders.rb +126 -0
- data/lib/invoicexpress/client/schedules.rb +110 -0
- data/lib/invoicexpress/client/sequences.rb +71 -0
- data/lib/invoicexpress/client/simplified_invoices.rb +130 -0
- data/lib/invoicexpress/client/taxes.rb +82 -0
- data/lib/invoicexpress/client/users.rb +48 -0
- data/lib/invoicexpress/configuration.rb +51 -0
- data/lib/invoicexpress/connection.rb +40 -0
- data/lib/invoicexpress/error.rb +68 -0
- data/lib/invoicexpress/models.rb +29 -0
- data/lib/invoicexpress/models/chart.rb +41 -0
- data/lib/invoicexpress/models/client.rb +24 -0
- data/lib/invoicexpress/models/filter.rb +60 -0
- data/lib/invoicexpress/models/invoice.rb +235 -0
- data/lib/invoicexpress/models/purchase_order.rb +72 -0
- data/lib/invoicexpress/models/quarterly_result.rb +45 -0
- data/lib/invoicexpress/models/schedule.rb +87 -0
- data/lib/invoicexpress/models/sequence.rb +17 -0
- data/lib/invoicexpress/models/supplier.rb +17 -0
- data/lib/invoicexpress/models/top_client.rb +15 -0
- data/lib/invoicexpress/models/top_debtor.rb +14 -0
- data/lib/invoicexpress/models/user.rb +31 -0
- data/lib/invoicexpress/request.rb +63 -0
- data/lib/invoicexpress/version.rb +3 -0
- data/spec/fixtures/charts.invoicing.xml +21 -0
- data/spec/fixtures/charts.quarterly-results.xml +25 -0
- data/spec/fixtures/charts.top-clients.xml +10 -0
- data/spec/fixtures/charts.top-debtors.xml +10 -0
- data/spec/fixtures/charts.treasury.xml +49 -0
- data/spec/fixtures/clients.create.xml +6 -0
- data/spec/fixtures/clients.get.xml +21 -0
- data/spec/fixtures/clients.invoices.xml +11 -0
- data/spec/fixtures/clients.list.xml +18 -0
- data/spec/fixtures/clients.update.xml +1 -0
- data/spec/fixtures/credit_notes.create.xml +53 -0
- data/spec/fixtures/credit_notes.email_document.xml +9 -0
- data/spec/fixtures/credit_notes.list.xml +114 -0
- data/spec/fixtures/credit_notes.update_state.xml +7 -0
- data/spec/fixtures/invoices.create.xml +37 -0
- data/spec/fixtures/invoices.get.xml +50 -0
- data/spec/fixtures/invoices.list.xml +537 -0
- data/spec/fixtures/invoices.update_state.xml +7 -0
- data/spec/fixtures/ok.xml +0 -0
- data/spec/fixtures/po.create.xml +42 -0
- data/spec/fixtures/po.email_document.xml +0 -0
- data/spec/fixtures/po.get.xml +42 -0
- data/spec/fixtures/po.list.xml +44 -0
- data/spec/fixtures/po.update_state.xml +7 -0
- data/spec/fixtures/schedules.create.xml +48 -0
- data/spec/fixtures/schedules.get.xml +57 -0
- data/spec/fixtures/schedules.list.xml +40 -0
- data/spec/fixtures/sequences.create.xml +9 -0
- data/spec/fixtures/sequences.get.xml +10 -0
- data/spec/fixtures/sequences.list.xml +12 -0
- data/spec/fixtures/sequences.update.xml +10 -0
- data/spec/fixtures/simplified_invoices.create.xml +53 -0
- data/spec/fixtures/simplified_invoices.email_document.xml +9 -0
- data/spec/fixtures/simplified_invoices.get.xml +74 -0
- data/spec/fixtures/simplified_invoices.list.xml +114 -0
- data/spec/fixtures/simplified_invoices.update.xml +0 -0
- data/spec/fixtures/simplified_invoices.update_state.xml +7 -0
- data/spec/fixtures/taxes.create.xml +7 -0
- data/spec/fixtures/taxes.list.xml +18 -0
- data/spec/fixtures/taxes.update.xml +7 -0
- data/spec/fixtures/users.accounts.xml +12 -0
- data/spec/fixtures/users.change-account.xml +0 -0
- data/spec/fixtures/users.login.xml +11 -0
- data/spec/helper.rb +62 -0
- data/spec/invoicexpress/client/charts_spec.rb +69 -0
- data/spec/invoicexpress/client/clients_spec.rb +108 -0
- data/spec/invoicexpress/client/credit_notes_spec.rb +104 -0
- data/spec/invoicexpress/client/invoices_spec.rb +110 -0
- data/spec/invoicexpress/client/purchase_orders_spec.rb +116 -0
- data/spec/invoicexpress/client/schedules_spec.rb +111 -0
- data/spec/invoicexpress/client/sequences_spec.rb +68 -0
- data/spec/invoicexpress/client/simplified_invoices_spec.rb +116 -0
- data/spec/invoicexpress/client/taxes_spec.rb +70 -0
- data/spec/invoicexpress/client/users_spec.rb +40 -0
- data/spec/invoicexpress/client_spec.rb +24 -0
- data/spec/invoicexpress_spec.rb +19 -0
- metadata +279 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'happymapper'
|
2
|
+
|
3
|
+
module Invoicexpress
|
4
|
+
module Models
|
5
|
+
DATE_FORMAT = Proc.new { |value| value.strftime("%d/%m/%Y") unless value.nil? }
|
6
|
+
|
7
|
+
class BaseModel
|
8
|
+
def initialize(attributes = {})
|
9
|
+
super()
|
10
|
+
|
11
|
+
attributes.each { |k,v| self.send("#{k}=", v) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'invoicexpress/models/client'
|
18
|
+
require 'invoicexpress/models/invoice'
|
19
|
+
require 'invoicexpress/models/filter'
|
20
|
+
require 'invoicexpress/models/sequence'
|
21
|
+
require 'invoicexpress/models/user'
|
22
|
+
require 'invoicexpress/models/chart'
|
23
|
+
require 'invoicexpress/models/top_client'
|
24
|
+
require 'invoicexpress/models/top_debtor'
|
25
|
+
require 'invoicexpress/models/quarterly_result'
|
26
|
+
require 'invoicexpress/models/schedule'
|
27
|
+
require 'invoicexpress/models/purchase_order'
|
28
|
+
|
29
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Invoicexpress
|
2
|
+
module Models
|
3
|
+
class Value
|
4
|
+
include HappyMapper
|
5
|
+
tag "value"
|
6
|
+
content "value"
|
7
|
+
attribute :xid, Integer
|
8
|
+
end
|
9
|
+
|
10
|
+
class Series < BaseModel
|
11
|
+
include HappyMapper
|
12
|
+
|
13
|
+
tag 'series'
|
14
|
+
has_many :values, Value
|
15
|
+
end
|
16
|
+
|
17
|
+
class Graph < BaseModel
|
18
|
+
include HappyMapper
|
19
|
+
|
20
|
+
tag 'graph'
|
21
|
+
attribute :gid, String
|
22
|
+
attribute :title, String
|
23
|
+
has_many :values, Value
|
24
|
+
end
|
25
|
+
|
26
|
+
class Graphs < BaseModel
|
27
|
+
include HappyMapper
|
28
|
+
|
29
|
+
tag 'graphs'
|
30
|
+
has_many :graphs, Graph
|
31
|
+
end
|
32
|
+
|
33
|
+
class Chart < BaseModel
|
34
|
+
include HappyMapper
|
35
|
+
|
36
|
+
tag 'chart'
|
37
|
+
has_one :series, Series
|
38
|
+
has_many :graphs, Graph
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Invoicexpress
|
2
|
+
module Models
|
3
|
+
|
4
|
+
class Client < BaseModel
|
5
|
+
include HappyMapper
|
6
|
+
|
7
|
+
element :id, Integer
|
8
|
+
element :name, String
|
9
|
+
element :code, Integer
|
10
|
+
element :email, String
|
11
|
+
element :address, String
|
12
|
+
element :postal_code, String
|
13
|
+
element :fiscal_id, String
|
14
|
+
element :website, String
|
15
|
+
element :phone, String
|
16
|
+
element :fax, String
|
17
|
+
element :observations, String
|
18
|
+
element :send_options, Integer
|
19
|
+
element :balance, Float
|
20
|
+
element :country, String
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Invoicexpress
|
2
|
+
module Models
|
3
|
+
class FilterStatus < BaseModel
|
4
|
+
include HappyMapper
|
5
|
+
|
6
|
+
tag 'status'
|
7
|
+
has_many :options, String, :tag => 'option'
|
8
|
+
end
|
9
|
+
|
10
|
+
class FilterByType < BaseModel
|
11
|
+
include HappyMapper
|
12
|
+
|
13
|
+
tag 'by_type'
|
14
|
+
has_many :options, String, :tag => 'option'
|
15
|
+
end
|
16
|
+
|
17
|
+
class FilterArchived < BaseModel
|
18
|
+
include HappyMapper
|
19
|
+
|
20
|
+
tag 'archived'
|
21
|
+
has_many :options, String, :tag => 'option'
|
22
|
+
end
|
23
|
+
|
24
|
+
class Filter < BaseModel
|
25
|
+
include HappyMapper
|
26
|
+
|
27
|
+
tag 'filter'
|
28
|
+
element :status, FilterStatus
|
29
|
+
element :by_type, FilterByType
|
30
|
+
element :archived, FilterArchived
|
31
|
+
|
32
|
+
def initialize(args = {})
|
33
|
+
if args[:status] && args[:status].is_a?(Array)
|
34
|
+
o = FilterStatus.new
|
35
|
+
o.options = []
|
36
|
+
o.options = args[:status].map(&:to_s)
|
37
|
+
|
38
|
+
self.status = o
|
39
|
+
end
|
40
|
+
|
41
|
+
if args[:by_type] && args[:by_type].is_a?(Array)
|
42
|
+
o = FilterByType.new
|
43
|
+
o.options = []
|
44
|
+
o.options = args[:by_type].map(&:to_s)
|
45
|
+
|
46
|
+
self.by_type = o
|
47
|
+
end
|
48
|
+
|
49
|
+
if args[:archived] && args[:archived].is_a?(Array)
|
50
|
+
o = FilterArchived.new
|
51
|
+
o.options = []
|
52
|
+
o.options = args[:archived].map(&:to_s)
|
53
|
+
|
54
|
+
self.archived = o
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require 'invoicexpress/models/client'
|
2
|
+
|
3
|
+
module Invoicexpress
|
4
|
+
module Models
|
5
|
+
|
6
|
+
class Tax < BaseModel
|
7
|
+
include HappyMapper
|
8
|
+
|
9
|
+
tag 'tax'
|
10
|
+
element :id, Integer
|
11
|
+
element :name, String
|
12
|
+
element :value, Float
|
13
|
+
element :region, String
|
14
|
+
element :default_tax, Integer
|
15
|
+
end
|
16
|
+
|
17
|
+
class Item < BaseModel
|
18
|
+
include HappyMapper
|
19
|
+
|
20
|
+
tag 'item'
|
21
|
+
element :id, Integer
|
22
|
+
element :name, String
|
23
|
+
element :description, String
|
24
|
+
element :unit_price, Float
|
25
|
+
element :quantity, Float
|
26
|
+
element :unit, String
|
27
|
+
element :tax, Tax
|
28
|
+
element :discount, Float
|
29
|
+
end
|
30
|
+
|
31
|
+
class Items < BaseModel
|
32
|
+
include HappyMapper
|
33
|
+
|
34
|
+
tag 'items'
|
35
|
+
attribute :type, String, :on_save => Proc.new { |value|
|
36
|
+
"array"
|
37
|
+
}
|
38
|
+
has_many :items, Item
|
39
|
+
end
|
40
|
+
|
41
|
+
# Fields common to all invoice models, necessary for create/update
|
42
|
+
module BaseInvoice
|
43
|
+
def self.included(base)
|
44
|
+
base.class_eval do
|
45
|
+
include HappyMapper
|
46
|
+
element :id, Integer
|
47
|
+
element :date, Date, :on_save => DATE_FORMAT
|
48
|
+
element :due_date, Date, :on_save => DATE_FORMAT
|
49
|
+
element :reference, String
|
50
|
+
element :observations, String
|
51
|
+
element :retention, Float
|
52
|
+
element :tax_exemption, String
|
53
|
+
element :sequence_id, Integer
|
54
|
+
element :mb_reference, String
|
55
|
+
has_one :client, Client
|
56
|
+
has_many :items, Item, :on_save => Proc.new { |value|
|
57
|
+
Items.new(:items => value)
|
58
|
+
}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Fields only available with GET request
|
64
|
+
module ExtraInvoice
|
65
|
+
def self.included(base)
|
66
|
+
base.class_eval do
|
67
|
+
element :status, String
|
68
|
+
element :sequence_number, String
|
69
|
+
element :currency, String
|
70
|
+
element :sum, Float
|
71
|
+
element :discount, Float
|
72
|
+
element :before_taxes, Float
|
73
|
+
element :taxes, Float
|
74
|
+
element :total, Float
|
75
|
+
element :mb_reference, Integer
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def to_core()
|
80
|
+
fields={:date => self.date,
|
81
|
+
:due_date => self.due_date,
|
82
|
+
:reference=> self.reference,
|
83
|
+
:observations=> self.observations,
|
84
|
+
:retention=> self.retention,
|
85
|
+
:tax_exemption => self.tax_exemption,
|
86
|
+
:sequence_id=> self.sequence_id,
|
87
|
+
:client => self.client,
|
88
|
+
:items => self.items,
|
89
|
+
:mb_reference=> self.mb_reference}
|
90
|
+
case self.class.to_s
|
91
|
+
when "Invoicexpress::Models::SimplifiedInvoice"
|
92
|
+
invoice = Invoicexpress::Models::CoreSimplifiedInvoice.new(fields)
|
93
|
+
when "Invoicexpress::Models::CashInvoice"
|
94
|
+
invoice = Invoicexpress::Models::CoreCashInvoice.new(fields)
|
95
|
+
when "Invoicexpress::Models::CreditNote"
|
96
|
+
invoice = Invoicexpress::Models::CoreCreditNote.new(fields)
|
97
|
+
when "Invoicexpress::Models::DebitNote"
|
98
|
+
invoice = Invoicexpress::Models::CoreDebitNote.new(fields)
|
99
|
+
else
|
100
|
+
invoice = Invoicexpress::Models::CoreInvoice.new(fields)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# Note: we need all of these models because the API crashes when we send an object with the fields from the get request.
|
106
|
+
# example: do a get and then a update.
|
107
|
+
class CoreSimplifiedInvoice < BaseModel
|
108
|
+
include BaseInvoice
|
109
|
+
tag 'simplified_invoice'
|
110
|
+
end
|
111
|
+
|
112
|
+
class CoreInvoice < BaseModel
|
113
|
+
include BaseInvoice
|
114
|
+
tag 'invoice'
|
115
|
+
end
|
116
|
+
|
117
|
+
class CoreCashInvoice < BaseModel
|
118
|
+
include BaseInvoice
|
119
|
+
tag 'cash_invoice'
|
120
|
+
end
|
121
|
+
|
122
|
+
class CoreCreditNote < BaseModel
|
123
|
+
include BaseInvoice
|
124
|
+
tag 'credit_note'
|
125
|
+
end
|
126
|
+
|
127
|
+
class CoreDebitNote < BaseModel
|
128
|
+
include BaseInvoice
|
129
|
+
tag 'debit_note'
|
130
|
+
end
|
131
|
+
|
132
|
+
class SimplifiedInvoice < BaseModel
|
133
|
+
include BaseInvoice
|
134
|
+
include ExtraInvoice
|
135
|
+
tag 'simplified_invoice'
|
136
|
+
end
|
137
|
+
|
138
|
+
class Invoice < BaseModel
|
139
|
+
include BaseInvoice
|
140
|
+
include ExtraInvoice
|
141
|
+
tag 'invoice'
|
142
|
+
end
|
143
|
+
|
144
|
+
class CashInvoice < BaseModel
|
145
|
+
include BaseInvoice
|
146
|
+
include ExtraInvoice
|
147
|
+
tag 'cash_invoice'
|
148
|
+
end
|
149
|
+
|
150
|
+
class CreditNote < BaseModel
|
151
|
+
include BaseInvoice
|
152
|
+
include ExtraInvoice
|
153
|
+
tag 'credit_note'
|
154
|
+
end
|
155
|
+
|
156
|
+
class DebitNote < BaseModel
|
157
|
+
include BaseInvoice
|
158
|
+
include ExtraInvoice
|
159
|
+
tag 'debit_note'
|
160
|
+
end
|
161
|
+
|
162
|
+
class InvoiceResult
|
163
|
+
include HappyMapper
|
164
|
+
|
165
|
+
tag 'results'
|
166
|
+
element :current_page, Integer
|
167
|
+
element :entries, Integer
|
168
|
+
element :total_entries, Integer
|
169
|
+
end
|
170
|
+
|
171
|
+
class Invoices < BaseModel
|
172
|
+
include HappyMapper
|
173
|
+
|
174
|
+
tag 'invoices'
|
175
|
+
has_many :invoices, Invoice
|
176
|
+
element :current_page, Integer
|
177
|
+
element :total_pages, Integer
|
178
|
+
element :total_entries, Integer
|
179
|
+
element :per_page, Integer
|
180
|
+
end
|
181
|
+
|
182
|
+
class CashInvoices < BaseModel
|
183
|
+
include HappyMapper
|
184
|
+
|
185
|
+
tag 'cash_invoices'
|
186
|
+
has_one :results, InvoiceResult
|
187
|
+
has_many :cash_invoices, CashInvoice
|
188
|
+
end
|
189
|
+
|
190
|
+
class CreditNotes < BaseModel
|
191
|
+
include HappyMapper
|
192
|
+
|
193
|
+
tag 'credit_notes'
|
194
|
+
has_one :results, InvoiceResult
|
195
|
+
has_many :credit_notes, CreditNote
|
196
|
+
end
|
197
|
+
|
198
|
+
class ClientInvoices < BaseModel
|
199
|
+
include HappyMapper
|
200
|
+
|
201
|
+
tag 'invoices'
|
202
|
+
has_one :results, InvoiceResult
|
203
|
+
has_many :invoices, Invoice
|
204
|
+
end
|
205
|
+
|
206
|
+
class InvoiceState < BaseModel
|
207
|
+
include HappyMapper
|
208
|
+
|
209
|
+
tag 'invoice'
|
210
|
+
element :state, String
|
211
|
+
element :message, String
|
212
|
+
end
|
213
|
+
|
214
|
+
class MessageClient < BaseModel
|
215
|
+
include HappyMapper
|
216
|
+
|
217
|
+
tag 'client'
|
218
|
+
element :email, String
|
219
|
+
element :save, Integer
|
220
|
+
end
|
221
|
+
|
222
|
+
class Message < BaseModel
|
223
|
+
include HappyMapper
|
224
|
+
|
225
|
+
tag 'message'
|
226
|
+
has_one :client, MessageClient
|
227
|
+
element :cc, String
|
228
|
+
element :bcc, String
|
229
|
+
element :subject, String
|
230
|
+
element :body, String
|
231
|
+
end
|
232
|
+
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'invoicexpress/models/invoice'
|
2
|
+
require 'invoicexpress/models/supplier'
|
3
|
+
require 'invoicexpress/models/client'
|
4
|
+
|
5
|
+
module Invoicexpress
|
6
|
+
module Models
|
7
|
+
|
8
|
+
module BasePurchaseOrder
|
9
|
+
def self.included(base)
|
10
|
+
base.class_eval do
|
11
|
+
include HappyMapper
|
12
|
+
|
13
|
+
tag 'purchase_order'
|
14
|
+
element :id, Integer
|
15
|
+
element :date, Date, :on_save => DATE_FORMAT
|
16
|
+
element :due_date, Date, :on_save => DATE_FORMAT
|
17
|
+
element :loaded_at, Date, :on_save => DATE_FORMAT
|
18
|
+
element :observations, String
|
19
|
+
element :delivery_site, String
|
20
|
+
has_one :supplier, Supplier
|
21
|
+
has_one :client, Client
|
22
|
+
has_many :items, Item, :on_save => Proc.new { |value|
|
23
|
+
Items.new(:items => value)
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class CorePurchaseOrder < BaseModel
|
30
|
+
include BasePurchaseOrder
|
31
|
+
#tag 'purchase_order'
|
32
|
+
end
|
33
|
+
|
34
|
+
class PurchaseOrder < CorePurchaseOrder
|
35
|
+
include BasePurchaseOrder
|
36
|
+
#include HappyMapper
|
37
|
+
#tag 'purchase_order'
|
38
|
+
|
39
|
+
element :status, String
|
40
|
+
element :sequence_number, String
|
41
|
+
element :permalink, String
|
42
|
+
element :currency, String
|
43
|
+
|
44
|
+
|
45
|
+
element :sum, Float
|
46
|
+
element :discount, Float
|
47
|
+
element :before_taxes, Float
|
48
|
+
element :taxes, Float
|
49
|
+
element :total, Float
|
50
|
+
|
51
|
+
def to_core_purchase_order()
|
52
|
+
Invoicexpress::Models::CorePurchaseOrder.new(
|
53
|
+
:id=>self.id,
|
54
|
+
:date=>self.date,
|
55
|
+
:due_date=>self.due_date,
|
56
|
+
:loaded_at=>self.loaded_at,
|
57
|
+
:observations=>self.observations,
|
58
|
+
:delivery_site=>self.delivery_site,
|
59
|
+
:supplier=>self.supplier,
|
60
|
+
:client=>self.client,
|
61
|
+
:items=>self.items
|
62
|
+
)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class PurchaseOrders < BaseModel
|
67
|
+
include HappyMapper
|
68
|
+
tag 'purchase_orders'
|
69
|
+
has_many :purchase_orders, PurchaseOrder
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|