invoicing 0.2.1 → 1.0.0
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 +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: []
|