invoicing 0.2.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +1 -0
- data/README.md +57 -0
- data/Rakefile +16 -37
- data/lib/invoicing.rb +20 -10
- data/lib/invoicing/cached_record.rb +9 -6
- data/lib/invoicing/class_info.rb +34 -34
- data/lib/invoicing/connection_adapter_ext.rb +4 -4
- data/lib/invoicing/countries/uk.rb +6 -6
- data/lib/invoicing/currency_value.rb +39 -32
- data/lib/invoicing/find_subclasses.rb +40 -15
- data/lib/invoicing/ledger_item.rb +166 -145
- data/lib/invoicing/ledger_item/pdf_generator.rb +108 -0
- data/lib/invoicing/ledger_item/render_html.rb +76 -73
- data/lib/invoicing/ledger_item/render_ubl.rb +37 -35
- data/lib/invoicing/line_item.rb +43 -38
- data/lib/invoicing/price.rb +1 -1
- data/lib/invoicing/tax_rate.rb +3 -6
- data/lib/invoicing/taxable.rb +37 -32
- data/lib/invoicing/time_dependent.rb +40 -40
- data/lib/invoicing/version.rb +4 -4
- data/lib/rails/generators/invoicing/invoicing_generator.rb +14 -0
- data/lib/rails/generators/invoicing/ledger_item/ledger_item_generator.rb +17 -0
- data/lib/rails/generators/invoicing/ledger_item/templates/migration.rb +25 -0
- data/lib/rails/generators/invoicing/ledger_item/templates/model.rb +5 -0
- data/lib/rails/generators/invoicing/line_item/line_item_generator.rb +17 -0
- data/lib/rails/generators/invoicing/line_item/templates/migration.rb +20 -0
- data/lib/rails/generators/invoicing/line_item/templates/model.rb +5 -0
- data/lib/rails/generators/invoicing/tax_rate/tax_rate_generator.rb +17 -0
- data/lib/rails/generators/invoicing/tax_rate/templates/migration.rb +14 -0
- data/lib/rails/generators/invoicing/tax_rate/templates/model.rb +3 -0
- metadata +110 -153
- data.tar.gz.sig +0 -1
- data/History.txt +0 -31
- data/Manifest.txt +0 -62
- data/PostInstall.txt +0 -10
- data/README.rdoc +0 -58
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/tasks/rcov.rake +0 -4
- data/test/cached_record_test.rb +0 -100
- data/test/class_info_test.rb +0 -253
- data/test/connection_adapter_ext_test.rb +0 -79
- data/test/currency_value_test.rb +0 -209
- data/test/find_subclasses_test.rb +0 -120
- data/test/fixtures/README +0 -7
- data/test/fixtures/cached_record.sql +0 -22
- data/test/fixtures/class_info.sql +0 -28
- data/test/fixtures/currency_value.sql +0 -29
- data/test/fixtures/find_subclasses.sql +0 -43
- data/test/fixtures/ledger_item.sql +0 -39
- data/test/fixtures/line_item.sql +0 -33
- data/test/fixtures/price.sql +0 -4
- data/test/fixtures/tax_rate.sql +0 -4
- data/test/fixtures/taxable.sql +0 -14
- data/test/fixtures/time_dependent.sql +0 -35
- data/test/ledger_item_test.rb +0 -444
- data/test/line_item_test.rb +0 -139
- data/test/models/README +0 -4
- data/test/models/test_subclass_in_another_file.rb +0 -3
- data/test/models/test_subclass_not_in_database.rb +0 -6
- data/test/price_test.rb +0 -9
- data/test/ref-output/creditnote3.html +0 -82
- data/test/ref-output/creditnote3.xml +0 -89
- data/test/ref-output/invoice1.html +0 -93
- data/test/ref-output/invoice1.xml +0 -111
- data/test/ref-output/invoice2.html +0 -86
- data/test/ref-output/invoice2.xml +0 -98
- data/test/ref-output/invoice_null.html +0 -36
- data/test/render_html_test.rb +0 -70
- data/test/render_ubl_test.rb +0 -44
- data/test/setup.rb +0 -37
- data/test/tax_rate_test.rb +0 -9
- data/test/taxable_test.rb +0 -180
- data/test/test_helper.rb +0 -72
- data/test/time_dependent_test.rb +0 -180
- metadata.gz.sig +0 -4
@@ -1,3 +1,5 @@
|
|
1
|
+
require "active_support/concern"
|
2
|
+
|
1
3
|
module Invoicing
|
2
4
|
# == Time-dependent value objects
|
3
5
|
#
|
@@ -63,11 +65,11 @@ module Invoicing
|
|
63
65
|
# +----+-------+---------------+------------+---------------------+---------------------+----------------+
|
64
66
|
# | id | value | description | is_default | valid_from | valid_until | replaced_by_id |
|
65
67
|
# +----+-------+---------------+------------+---------------------+---------------------+----------------+
|
66
|
-
# | 1 | 0.175 | Standard rate | 1 | 1991-04-01 00:00:00 | 2008-12-01 00:00:00 | 4 |
|
68
|
+
# | 1 | 0.175 | Standard rate | 1 | 1991-04-01 00:00:00 | 2008-12-01 00:00:00 | 4 |
|
67
69
|
# | 2 | 0.05 | Reduced rate | 0 | 1991-04-01 00:00:00 | NULL | NULL |
|
68
70
|
# | 3 | 0.0 | Zero rate | 0 | 1991-04-01 00:00:00 | NULL | NULL |
|
69
|
-
# | 4 | 0.15 | Standard rate | 1 | 2008-12-01 00:00:00 | 2010-01-01 00:00:00 | 5 |
|
70
|
-
# | 5 | 0.175 | Standard rate | 1 | 2010-01-01 00:00:00 | NULL | NULL |
|
71
|
+
# | 4 | 0.15 | Standard rate | 1 | 2008-12-01 00:00:00 | 2010-01-01 00:00:00 | 5 |
|
72
|
+
# | 5 | 0.175 | Standard rate | 1 | 2010-01-01 00:00:00 | NULL | NULL |
|
71
73
|
# +----+-------+---------------+------------+---------------------+---------------------+----------------+
|
72
74
|
#
|
73
75
|
# Graphically, this may be illustrated as:
|
@@ -154,6 +156,7 @@ module Invoicing
|
|
154
156
|
# Apart from these requirements, a +TimeDependent+ object is a normal model object, and you may
|
155
157
|
# give it whatever extra metadata you want, and make references to it from any other model object.
|
156
158
|
module TimeDependent
|
159
|
+
extend ActiveSupport::Concern
|
157
160
|
|
158
161
|
module ActMethods
|
159
162
|
# Identifies the current model object as a +TimeDependent+ object, and creates all the
|
@@ -174,11 +177,11 @@ module Invoicing
|
|
174
177
|
# belongs_to :referral_program
|
175
178
|
# named_scope :for_referral_program, lambda { |p| { :conditions => { :referral_program_id => p.id } } }
|
176
179
|
# end
|
177
|
-
#
|
180
|
+
#
|
178
181
|
# reseller_program = ReferralProgram.find(1)
|
179
182
|
# current_commission = CommissionRate.for_referral_program(reseller_program).default_record_now
|
180
183
|
# puts "Earn #{current_commission.rate} per cent commission as a reseller..."
|
181
|
-
#
|
184
|
+
#
|
182
185
|
# changes = current_commission.changes_until(1.year.from_now)
|
183
186
|
# for next_commission in changes
|
184
187
|
# message = next_commission.nil? ? "Discontinued as of" : "Changing to #{next_commission.rate} per cent on"
|
@@ -187,17 +190,14 @@ module Invoicing
|
|
187
190
|
# end
|
188
191
|
#
|
189
192
|
def acts_as_time_dependent(*args)
|
190
|
-
# Activate CachedRecord first, because ClassInfo#initialize expects the cache to be ready
|
191
|
-
acts_as_cached_record(*args)
|
192
|
-
|
193
193
|
Invoicing::ClassInfo.acts_as(Invoicing::TimeDependent, self, args)
|
194
|
-
|
194
|
+
|
195
195
|
# Create replaced_by association if it doesn't exist yet
|
196
196
|
replaced_by_id = time_dependent_class_info.method(:replaced_by_id)
|
197
197
|
unless respond_to? :replaced_by
|
198
|
-
belongs_to :replaced_by, :class_name =>
|
198
|
+
belongs_to :replaced_by, :class_name => self, :foreign_key => replaced_by_id
|
199
199
|
end
|
200
|
-
|
200
|
+
|
201
201
|
# Create value_at and value_now method aliases
|
202
202
|
value_method = time_dependent_class_info.method(:value).to_s
|
203
203
|
if value_method != 'value'
|
@@ -213,7 +213,7 @@ module Invoicing
|
|
213
213
|
end # acts_as_time_dependent
|
214
214
|
end # module ActMethods
|
215
215
|
|
216
|
-
|
216
|
+
|
217
217
|
module ClassMethods
|
218
218
|
# Returns a list of records which are valid at some point during a particular date/time
|
219
219
|
# range. If there is a change of rate during this time interval, and one rate replaces
|
@@ -230,28 +230,28 @@ module Invoicing
|
|
230
230
|
# valid but will become valid within the next month, for example.
|
231
231
|
def valid_records_during(not_before, not_after)
|
232
232
|
info = time_dependent_class_info
|
233
|
-
|
233
|
+
|
234
234
|
# List of all records whose validity period intersects the selected period
|
235
|
-
valid_records =
|
235
|
+
valid_records = all.select do |record|
|
236
236
|
valid_from = info.get(record, :valid_from)
|
237
237
|
valid_until = info.get(record, :valid_until)
|
238
238
|
has_taken_effect = (valid_from < not_after) # N.B. less than
|
239
239
|
not_yet_expired = (valid_until == nil) || (valid_until > not_before)
|
240
240
|
has_taken_effect && not_yet_expired
|
241
241
|
end
|
242
|
-
|
242
|
+
|
243
243
|
# Select only those which do not have a predecessor which is also valid
|
244
244
|
valid_records.select do |record|
|
245
245
|
record.predecessors.empty? || (valid_records & record.predecessors).empty?
|
246
246
|
end
|
247
247
|
end
|
248
|
-
|
248
|
+
|
249
249
|
# Returns the list of all records which are valid at one particular point in time.
|
250
250
|
# If you need to consider a period of time rather than a point in time, use
|
251
251
|
# +valid_records_during+.
|
252
252
|
def valid_records_at(point_in_time)
|
253
253
|
info = time_dependent_class_info
|
254
|
-
|
254
|
+
all.select do |record|
|
255
255
|
valid_from = info.get(record, :valid_from)
|
256
256
|
valid_until = info.get(record, :valid_until)
|
257
257
|
has_taken_effect = (valid_from <= point_in_time) # N.B. less than or equals
|
@@ -259,7 +259,7 @@ module Invoicing
|
|
259
259
|
has_taken_effect && not_yet_expired
|
260
260
|
end
|
261
261
|
end
|
262
|
-
|
262
|
+
|
263
263
|
# Returns the default record which is valid at a particular point in time.
|
264
264
|
# If there is no record marked as default, nil is returned; if there are
|
265
265
|
# multiple records marked as default, results are undefined.
|
@@ -268,12 +268,12 @@ module Invoicing
|
|
268
268
|
info = time_dependent_class_info
|
269
269
|
valid_records_at(point_in_time).select{|record| info.get(record, :is_default)}.first
|
270
270
|
end
|
271
|
-
|
271
|
+
|
272
272
|
# Returns the default record which is valid at the current moment.
|
273
273
|
def default_record_now
|
274
274
|
default_record_at(Time.now)
|
275
275
|
end
|
276
|
-
|
276
|
+
|
277
277
|
# Finds the default record for a particular +point_in_time+ (using +default_record_at+),
|
278
278
|
# then returns the value of that record's +value+ column. If +value+ was renamed to
|
279
279
|
# +another_method_name+ (option to +acts_as_time_dependent+), then
|
@@ -281,7 +281,7 @@ module Invoicing
|
|
281
281
|
def default_value_at(point_in_time)
|
282
282
|
time_dependent_class_info.get(default_record_at(point_in_time), :value)
|
283
283
|
end
|
284
|
-
|
284
|
+
|
285
285
|
# Finds the current default record (like +default_record_now+),
|
286
286
|
# then returns the value of that record's +value+ column. If +value+ was renamed to
|
287
287
|
# +another_method_name+ (option to +acts_as_time_dependent+), then
|
@@ -289,7 +289,7 @@ module Invoicing
|
|
289
289
|
def default_value_now
|
290
290
|
default_value_at(Time.now)
|
291
291
|
end
|
292
|
-
|
292
|
+
|
293
293
|
end # module ClassMethods
|
294
294
|
|
295
295
|
# Returns a list of objects of the same type as this object, which refer to this object
|
@@ -298,7 +298,7 @@ module Invoicing
|
|
298
298
|
def predecessors
|
299
299
|
time_dependent_class_info.predecessors(self)
|
300
300
|
end
|
301
|
-
|
301
|
+
|
302
302
|
# Translates this record into its replacement for a given point in time, if necessary/possible.
|
303
303
|
#
|
304
304
|
# * If this record is still valid at the given date/time, this method just returns self.
|
@@ -311,7 +311,7 @@ module Invoicing
|
|
311
311
|
def record_at(point_in_time)
|
312
312
|
valid_from = time_dependent_class_info.get(self, :valid_from)
|
313
313
|
valid_until = time_dependent_class_info.get(self, :valid_until)
|
314
|
-
|
314
|
+
|
315
315
|
if valid_from > point_in_time
|
316
316
|
(predecessors.size == 1) ? predecessors[0].record_at(point_in_time) : nil
|
317
317
|
elsif valid_until.nil? || (valid_until > point_in_time)
|
@@ -322,13 +322,13 @@ module Invoicing
|
|
322
322
|
replaced_by.record_at(point_in_time)
|
323
323
|
end
|
324
324
|
end
|
325
|
-
|
325
|
+
|
326
326
|
# Returns self if this record is currently valid, otherwise its past or future replacement
|
327
327
|
# (see +record_at+). If there is no valid replacement, nil is returned.
|
328
328
|
def record_now
|
329
329
|
record_at Time.now
|
330
330
|
end
|
331
|
-
|
331
|
+
|
332
332
|
# Finds this record's replacement for a given point in time (see +record_at+), then returns
|
333
333
|
# the value in its +value+ column. If +value+ was renamed to +another_method_name+ (option to
|
334
334
|
# +acts_as_time_dependent+), then +another_method_name_at+ is defined as an alias for +value_at+.
|
@@ -342,7 +342,7 @@ module Invoicing
|
|
342
342
|
def value_now
|
343
343
|
value_at Time.now
|
344
344
|
end
|
345
|
-
|
345
|
+
|
346
346
|
# Examines the replacement chain from this record into the future, during the period
|
347
347
|
# starting with this record's +valid_from+ and ending at +point_in_time+.
|
348
348
|
# If this record stays valid until after +point_in_time+, an empty list is returned.
|
@@ -361,27 +361,27 @@ module Invoicing
|
|
361
361
|
end
|
362
362
|
changes
|
363
363
|
end
|
364
|
-
|
365
|
-
|
364
|
+
|
365
|
+
|
366
366
|
# Stores state in the ActiveRecord class object
|
367
367
|
class ClassInfo < Invoicing::ClassInfo::Base #:nodoc:
|
368
|
-
|
369
|
-
def initialize(model_class, previous_info, args)
|
370
|
-
super
|
368
|
+
def predecessors(record)
|
371
369
|
# @predecessors is a hash of an ID pointing to the list of all objects which have that ID
|
372
370
|
# as replaced_by_id value
|
373
|
-
@predecessors
|
374
|
-
|
371
|
+
@predecessors ||= fetch_predecessors
|
372
|
+
@predecessors[get(record, :id)] || []
|
373
|
+
end
|
374
|
+
|
375
|
+
def fetch_predecessors
|
376
|
+
_predecessors = {}
|
377
|
+
for record in model_class.all
|
375
378
|
id = get(record, :replaced_by_id)
|
376
379
|
unless id.nil?
|
377
|
-
|
378
|
-
|
380
|
+
_predecessors[id] ||= []
|
381
|
+
_predecessors[id] << record
|
379
382
|
end
|
380
383
|
end
|
381
|
-
|
382
|
-
|
383
|
-
def predecessors(record)
|
384
|
-
@predecessors[get(record, :id)] || []
|
384
|
+
_predecessors
|
385
385
|
end
|
386
386
|
end # class ClassInfo
|
387
387
|
end # module TimeDependent
|
data/lib/invoicing/version.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Invoicing
|
2
|
+
module Generators
|
3
|
+
class ModelsGenerator < Rails::Generators::Base
|
4
|
+
desc "Generates models for ledger and taxable items"
|
5
|
+
namespace "invoicing"
|
6
|
+
|
7
|
+
def create_models
|
8
|
+
invoke "invoicing:tax_rate", ["tax_rate"]
|
9
|
+
invoke "invoicing:ledger_item", ["ledger_item"]
|
10
|
+
invoke "invoicing:line_item", ["line_item"]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
|
3
|
+
module Invoicing
|
4
|
+
module Generators
|
5
|
+
class LedgerItemGenerator < ActiveRecord::Generators::Base
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
7
|
+
|
8
|
+
def copy_migrations
|
9
|
+
migration_template "migration.rb", "db/migrate/create_invoicing_ledger_items.rb"
|
10
|
+
end
|
11
|
+
|
12
|
+
def copy_models
|
13
|
+
template "model.rb", "app/models/invoicing_ledger_item.rb"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class CreateInvoicingLedgerItems < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :invoicing_ledger_items do |t|
|
4
|
+
t.references :sender
|
5
|
+
t.references :recipient
|
6
|
+
|
7
|
+
t.string :type
|
8
|
+
t.datetime :issue_date
|
9
|
+
t.string :currency, limit: 3, null: false
|
10
|
+
t.decimal :total_amount, precision: 20, scale: 4
|
11
|
+
t.decimal :tax_amount, precision: 20, scale: 4
|
12
|
+
t.string :status, limit: 20
|
13
|
+
|
14
|
+
# These are optional fields, can be specified via options.
|
15
|
+
t.string :identifier, limit: 50
|
16
|
+
t.string :description
|
17
|
+
t.datetime :period_start
|
18
|
+
t.datetime :period_end
|
19
|
+
t.string :uuid, limit: 40
|
20
|
+
t.datetime :due_date
|
21
|
+
|
22
|
+
t.timestamps
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
|
3
|
+
module Invoicing
|
4
|
+
module Generators
|
5
|
+
class LineItemGenerator < ActiveRecord::Generators::Base
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
7
|
+
|
8
|
+
def copy_migrations
|
9
|
+
migration_template "migration.rb", "db/migrate/create_invoicing_line_items.rb"
|
10
|
+
end
|
11
|
+
|
12
|
+
def copy_models
|
13
|
+
template "model.rb", "app/models/invoicing_line_item.rb"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class CreateInvoicingLineItems < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :invoicing_line_items do |t|
|
4
|
+
t.references :ledger_item
|
5
|
+
|
6
|
+
t.string :type
|
7
|
+
t.decimal :net_amount, precision: 20, scale: 4
|
8
|
+
t.decimal :tax_amount, precision: 20, scale: 4
|
9
|
+
|
10
|
+
# These are optional fields, can be specified via options.
|
11
|
+
t.string :description
|
12
|
+
t.string :uuid, limit: 40
|
13
|
+
t.datetime :tax_point
|
14
|
+
t.decimal :quantity, precision: 20, scale: 4
|
15
|
+
t.integer :creator_id
|
16
|
+
|
17
|
+
t.timestamps
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
|
3
|
+
module Invoicing
|
4
|
+
module Generators
|
5
|
+
class TaxRateGenerator < ActiveRecord::Generators::Base
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
7
|
+
|
8
|
+
def copy_migration_file
|
9
|
+
migration_template "migration.rb", "db/migrate/create_invoicing_tax_rates.rb"
|
10
|
+
end
|
11
|
+
|
12
|
+
def copy_model
|
13
|
+
template "model.rb", "app/models/invoicing_tax_rate.rb"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateInvoicingTaxRates < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :invoicing_tax_rates do |t|
|
4
|
+
t.string :description
|
5
|
+
t.decimal :rate, precision: 20, scale: 4
|
6
|
+
t.datetime :valid_from, null: false
|
7
|
+
t.datetime :valid_until
|
8
|
+
t.integer :replaced_by_id
|
9
|
+
t.boolean :is_default
|
10
|
+
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
metadata
CHANGED
@@ -1,95 +1,98 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: invoicing
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Martin Kleppmann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
BgoJkiaJk/IsZAEZFgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
18
|
-
AQDTglrdKabHepgLjgzM1Z52ABCZZ/xsBbn+4pE2jm7aGj2c0fZ+5Uhg0/MfyKsz
|
19
|
-
g3jEFjj0GeNFW7l1sHJYf8mTrdCyAuaymyB2LcLwPtte7/3daAWcs6wAJR8nm9xa
|
20
|
-
CzoeAFjCLcbhZazNBURMizj1z9eTArxhpfpNw4uSIExxNRoykeiFGZ4iq5Getj5x
|
21
|
-
B/JNTdxM7m2KLx+3YKp2LsV0NLL7hRp6zZ6KW1NTWt1mQ58SjDUiRhThfxPfVpCA
|
22
|
-
NI3O+ikDERJWo+nLMUNAZXiB6iMimgUNIUm462tbrumloEjQ/wJE6veGyCRS4jfq
|
23
|
-
Ldnuf6CKFRIxhb9QaN+cu0lLAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQD
|
24
|
-
AgSwMB0GA1UdDgQWBBRR5pYhCiPVxI3rYNDwFcCSqOUGOTANBgkqhkiG9w0BAQUF
|
25
|
-
AAOCAQEAnrM8+tf8f5y8icgcWErHTZZ6oInZxbH8DbAbJ9zIdD/u2o8agzykc/ub
|
26
|
-
Kza0RLJoINt0f1Bb6hzIja82EPeEEQKgR6BJAwPZlxZLGYBTyZeZRy3PJ8IjQ9Zk
|
27
|
-
Fl6OOjmxFfjgF0UGvFHPYUJaNtN8kPs2lyZYmmUrf7qF0n6nwShnVkYePUlvyW0i
|
28
|
-
kqloUNEB5PbHhEwmSTSYOseqm2l2rOAgN3aKVzNFWiMjzZn8OwYaETtD83yB9zlK
|
29
|
-
hqnkWqtTW1V1mEZRyNIx71QdrsaovPQhIKp0bMFUwntYXklVKqxYGHebwt//Gb++
|
30
|
-
jT4Qh3sYJbvqWGFAQcuOIf4spvpNiA==
|
31
|
-
-----END CERTIFICATE-----
|
32
|
-
|
33
|
-
date: 2009-08-26 00:00:00 +01:00
|
34
|
-
default_executable:
|
35
|
-
dependencies:
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: activerecord
|
38
|
-
type: :runtime
|
39
|
-
version_requirement:
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
requirements:
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
42
17
|
- - ">="
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
version: 2.
|
45
|
-
version:
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: builder
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.2.13
|
48
20
|
type: :runtime
|
49
|
-
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.2.13
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sqlite3
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: flexmock
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
52
45
|
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
version:
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: newgem
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
58
48
|
type: :development
|
59
|
-
|
60
|
-
version_requirements: !ruby/object:Gem::Requirement
|
61
|
-
requirements:
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: uuid
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
62
73
|
- - ">="
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version:
|
65
|
-
version:
|
66
|
-
- !ruby/object:Gem::Dependency
|
67
|
-
name: hoe
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
68
76
|
type: :development
|
69
|
-
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
72
80
|
- - ">="
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version:
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: |
|
84
|
+
This is a framework for generating and displaying invoices (ideal for commercial
|
85
|
+
Rails apps). It allows for flexible business logic; provides tools for tax
|
86
|
+
handling, commission calculation etc. It aims to be both developer-friendly
|
87
|
+
and accountant-friendly.
|
88
|
+
email:
|
89
|
+
- "@martinkl"
|
79
90
|
executables: []
|
80
|
-
|
81
91
|
extensions: []
|
82
|
-
|
83
|
-
|
84
|
-
- History.txt
|
85
|
-
- Manifest.txt
|
86
|
-
- PostInstall.txt
|
87
|
-
files:
|
88
|
-
- History.txt
|
92
|
+
extra_rdoc_files: []
|
93
|
+
files:
|
89
94
|
- LICENSE
|
90
|
-
-
|
91
|
-
- PostInstall.txt
|
92
|
-
- README.rdoc
|
95
|
+
- README.md
|
93
96
|
- Rakefile
|
94
97
|
- lib/invoicing.rb
|
95
98
|
- lib/invoicing/cached_record.rb
|
@@ -99,6 +102,7 @@ files:
|
|
99
102
|
- lib/invoicing/currency_value.rb
|
100
103
|
- lib/invoicing/find_subclasses.rb
|
101
104
|
- lib/invoicing/ledger_item.rb
|
105
|
+
- lib/invoicing/ledger_item/pdf_generator.rb
|
102
106
|
- lib/invoicing/ledger_item/render_html.rb
|
103
107
|
- lib/invoicing/ledger_item/render_ubl.rb
|
104
108
|
- lib/invoicing/line_item.rb
|
@@ -107,84 +111,37 @@ files:
|
|
107
111
|
- lib/invoicing/taxable.rb
|
108
112
|
- lib/invoicing/time_dependent.rb
|
109
113
|
- lib/invoicing/version.rb
|
110
|
-
-
|
111
|
-
-
|
112
|
-
-
|
113
|
-
-
|
114
|
-
-
|
115
|
-
-
|
116
|
-
-
|
117
|
-
-
|
118
|
-
-
|
119
|
-
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
- test/fixtures/price.sql
|
127
|
-
- test/fixtures/tax_rate.sql
|
128
|
-
- test/fixtures/taxable.sql
|
129
|
-
- test/fixtures/time_dependent.sql
|
130
|
-
- test/ledger_item_test.rb
|
131
|
-
- test/line_item_test.rb
|
132
|
-
- test/models/README
|
133
|
-
- test/models/test_subclass_in_another_file.rb
|
134
|
-
- test/models/test_subclass_not_in_database.rb
|
135
|
-
- test/price_test.rb
|
136
|
-
- test/ref-output/creditnote3.html
|
137
|
-
- test/ref-output/creditnote3.xml
|
138
|
-
- test/ref-output/invoice1.html
|
139
|
-
- test/ref-output/invoice1.xml
|
140
|
-
- test/ref-output/invoice2.html
|
141
|
-
- test/ref-output/invoice2.xml
|
142
|
-
- test/ref-output/invoice_null.html
|
143
|
-
- test/render_html_test.rb
|
144
|
-
- test/render_ubl_test.rb
|
145
|
-
- test/setup.rb
|
146
|
-
- test/tax_rate_test.rb
|
147
|
-
- test/taxable_test.rb
|
148
|
-
- test/test_helper.rb
|
149
|
-
- test/time_dependent_test.rb
|
150
|
-
has_rdoc: true
|
151
|
-
homepage:
|
152
|
-
post_install_message: PostInstall.txt
|
153
|
-
rdoc_options:
|
154
|
-
- --main
|
155
|
-
- README.txt
|
156
|
-
require_paths:
|
114
|
+
- lib/rails/generators/invoicing/invoicing_generator.rb
|
115
|
+
- lib/rails/generators/invoicing/ledger_item/ledger_item_generator.rb
|
116
|
+
- lib/rails/generators/invoicing/ledger_item/templates/migration.rb
|
117
|
+
- lib/rails/generators/invoicing/ledger_item/templates/model.rb
|
118
|
+
- lib/rails/generators/invoicing/line_item/line_item_generator.rb
|
119
|
+
- lib/rails/generators/invoicing/line_item/templates/migration.rb
|
120
|
+
- lib/rails/generators/invoicing/line_item/templates/model.rb
|
121
|
+
- lib/rails/generators/invoicing/tax_rate/tax_rate_generator.rb
|
122
|
+
- lib/rails/generators/invoicing/tax_rate/templates/migration.rb
|
123
|
+
- lib/rails/generators/invoicing/tax_rate/templates/model.rb
|
124
|
+
homepage: http://ept.github.com/invoicing
|
125
|
+
licenses: []
|
126
|
+
metadata: {}
|
127
|
+
post_install_message:
|
128
|
+
rdoc_options: []
|
129
|
+
require_paths:
|
157
130
|
- lib
|
158
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
159
|
-
requirements:
|
131
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
160
133
|
- - ">="
|
161
|
-
- !ruby/object:Gem::Version
|
162
|
-
version:
|
163
|
-
|
164
|
-
|
165
|
-
requirements:
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
166
138
|
- - ">="
|
167
|
-
- !ruby/object:Gem::Version
|
168
|
-
version:
|
169
|
-
version:
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
170
141
|
requirements: []
|
171
|
-
|
172
|
-
|
173
|
-
rubygems_version: 1.3.1
|
142
|
+
rubyforge_project:
|
143
|
+
rubygems_version: 2.2.0.rc.1
|
174
144
|
signing_key:
|
175
|
-
specification_version:
|
176
|
-
summary:
|
177
|
-
test_files:
|
178
|
-
- test/cached_record_test.rb
|
179
|
-
- test/class_info_test.rb
|
180
|
-
- test/connection_adapter_ext_test.rb
|
181
|
-
- test/currency_value_test.rb
|
182
|
-
- test/find_subclasses_test.rb
|
183
|
-
- test/ledger_item_test.rb
|
184
|
-
- test/line_item_test.rb
|
185
|
-
- test/price_test.rb
|
186
|
-
- test/render_html_test.rb
|
187
|
-
- test/render_ubl_test.rb
|
188
|
-
- test/tax_rate_test.rb
|
189
|
-
- test/taxable_test.rb
|
190
|
-
- test/time_dependent_test.rb
|
145
|
+
specification_version: 4
|
146
|
+
summary: Ruby Invoicing Framework
|
147
|
+
test_files: []
|