invoicexpress 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/CHANGELOG.md +0 -0
  2. data/README.md +322 -0
  3. data/Rakefile +19 -0
  4. data/invoicexpress.gemspec +26 -0
  5. data/lib/faraday/response/parse_xml.rb +23 -0
  6. data/lib/faraday/response/raise_invoicexpress_errors.rb +20 -0
  7. data/lib/invoicexpress.rb +26 -0
  8. data/lib/invoicexpress/authentication.rb +15 -0
  9. data/lib/invoicexpress/client.rb +56 -0
  10. data/lib/invoicexpress/client/cash_invoices.rb +110 -0
  11. data/lib/invoicexpress/client/charts.rb +57 -0
  12. data/lib/invoicexpress/client/clients.rb +215 -0
  13. data/lib/invoicexpress/client/credit_notes.rb +128 -0
  14. data/lib/invoicexpress/client/debit_notes.rb +129 -0
  15. data/lib/invoicexpress/client/invoices.rb +107 -0
  16. data/lib/invoicexpress/client/items.rb +82 -0
  17. data/lib/invoicexpress/client/purchase_orders.rb +126 -0
  18. data/lib/invoicexpress/client/schedules.rb +110 -0
  19. data/lib/invoicexpress/client/sequences.rb +71 -0
  20. data/lib/invoicexpress/client/simplified_invoices.rb +130 -0
  21. data/lib/invoicexpress/client/taxes.rb +82 -0
  22. data/lib/invoicexpress/client/users.rb +48 -0
  23. data/lib/invoicexpress/configuration.rb +51 -0
  24. data/lib/invoicexpress/connection.rb +40 -0
  25. data/lib/invoicexpress/error.rb +68 -0
  26. data/lib/invoicexpress/models.rb +29 -0
  27. data/lib/invoicexpress/models/chart.rb +41 -0
  28. data/lib/invoicexpress/models/client.rb +24 -0
  29. data/lib/invoicexpress/models/filter.rb +60 -0
  30. data/lib/invoicexpress/models/invoice.rb +235 -0
  31. data/lib/invoicexpress/models/purchase_order.rb +72 -0
  32. data/lib/invoicexpress/models/quarterly_result.rb +45 -0
  33. data/lib/invoicexpress/models/schedule.rb +87 -0
  34. data/lib/invoicexpress/models/sequence.rb +17 -0
  35. data/lib/invoicexpress/models/supplier.rb +17 -0
  36. data/lib/invoicexpress/models/top_client.rb +15 -0
  37. data/lib/invoicexpress/models/top_debtor.rb +14 -0
  38. data/lib/invoicexpress/models/user.rb +31 -0
  39. data/lib/invoicexpress/request.rb +63 -0
  40. data/lib/invoicexpress/version.rb +3 -0
  41. data/spec/fixtures/charts.invoicing.xml +21 -0
  42. data/spec/fixtures/charts.quarterly-results.xml +25 -0
  43. data/spec/fixtures/charts.top-clients.xml +10 -0
  44. data/spec/fixtures/charts.top-debtors.xml +10 -0
  45. data/spec/fixtures/charts.treasury.xml +49 -0
  46. data/spec/fixtures/clients.create.xml +6 -0
  47. data/spec/fixtures/clients.get.xml +21 -0
  48. data/spec/fixtures/clients.invoices.xml +11 -0
  49. data/spec/fixtures/clients.list.xml +18 -0
  50. data/spec/fixtures/clients.update.xml +1 -0
  51. data/spec/fixtures/credit_notes.create.xml +53 -0
  52. data/spec/fixtures/credit_notes.email_document.xml +9 -0
  53. data/spec/fixtures/credit_notes.list.xml +114 -0
  54. data/spec/fixtures/credit_notes.update_state.xml +7 -0
  55. data/spec/fixtures/invoices.create.xml +37 -0
  56. data/spec/fixtures/invoices.get.xml +50 -0
  57. data/spec/fixtures/invoices.list.xml +537 -0
  58. data/spec/fixtures/invoices.update_state.xml +7 -0
  59. data/spec/fixtures/ok.xml +0 -0
  60. data/spec/fixtures/po.create.xml +42 -0
  61. data/spec/fixtures/po.email_document.xml +0 -0
  62. data/spec/fixtures/po.get.xml +42 -0
  63. data/spec/fixtures/po.list.xml +44 -0
  64. data/spec/fixtures/po.update_state.xml +7 -0
  65. data/spec/fixtures/schedules.create.xml +48 -0
  66. data/spec/fixtures/schedules.get.xml +57 -0
  67. data/spec/fixtures/schedules.list.xml +40 -0
  68. data/spec/fixtures/sequences.create.xml +9 -0
  69. data/spec/fixtures/sequences.get.xml +10 -0
  70. data/spec/fixtures/sequences.list.xml +12 -0
  71. data/spec/fixtures/sequences.update.xml +10 -0
  72. data/spec/fixtures/simplified_invoices.create.xml +53 -0
  73. data/spec/fixtures/simplified_invoices.email_document.xml +9 -0
  74. data/spec/fixtures/simplified_invoices.get.xml +74 -0
  75. data/spec/fixtures/simplified_invoices.list.xml +114 -0
  76. data/spec/fixtures/simplified_invoices.update.xml +0 -0
  77. data/spec/fixtures/simplified_invoices.update_state.xml +7 -0
  78. data/spec/fixtures/taxes.create.xml +7 -0
  79. data/spec/fixtures/taxes.list.xml +18 -0
  80. data/spec/fixtures/taxes.update.xml +7 -0
  81. data/spec/fixtures/users.accounts.xml +12 -0
  82. data/spec/fixtures/users.change-account.xml +0 -0
  83. data/spec/fixtures/users.login.xml +11 -0
  84. data/spec/helper.rb +62 -0
  85. data/spec/invoicexpress/client/charts_spec.rb +69 -0
  86. data/spec/invoicexpress/client/clients_spec.rb +108 -0
  87. data/spec/invoicexpress/client/credit_notes_spec.rb +104 -0
  88. data/spec/invoicexpress/client/invoices_spec.rb +110 -0
  89. data/spec/invoicexpress/client/purchase_orders_spec.rb +116 -0
  90. data/spec/invoicexpress/client/schedules_spec.rb +111 -0
  91. data/spec/invoicexpress/client/sequences_spec.rb +68 -0
  92. data/spec/invoicexpress/client/simplified_invoices_spec.rb +116 -0
  93. data/spec/invoicexpress/client/taxes_spec.rb +70 -0
  94. data/spec/invoicexpress/client/users_spec.rb +40 -0
  95. data/spec/invoicexpress/client_spec.rb +24 -0
  96. data/spec/invoicexpress_spec.rb +19 -0
  97. 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