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.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +1 -0
  3. data/README.md +57 -0
  4. data/Rakefile +16 -37
  5. data/lib/invoicing.rb +20 -10
  6. data/lib/invoicing/cached_record.rb +9 -6
  7. data/lib/invoicing/class_info.rb +34 -34
  8. data/lib/invoicing/connection_adapter_ext.rb +4 -4
  9. data/lib/invoicing/countries/uk.rb +6 -6
  10. data/lib/invoicing/currency_value.rb +39 -32
  11. data/lib/invoicing/find_subclasses.rb +40 -15
  12. data/lib/invoicing/ledger_item.rb +166 -145
  13. data/lib/invoicing/ledger_item/pdf_generator.rb +108 -0
  14. data/lib/invoicing/ledger_item/render_html.rb +76 -73
  15. data/lib/invoicing/ledger_item/render_ubl.rb +37 -35
  16. data/lib/invoicing/line_item.rb +43 -38
  17. data/lib/invoicing/price.rb +1 -1
  18. data/lib/invoicing/tax_rate.rb +3 -6
  19. data/lib/invoicing/taxable.rb +37 -32
  20. data/lib/invoicing/time_dependent.rb +40 -40
  21. data/lib/invoicing/version.rb +4 -4
  22. data/lib/rails/generators/invoicing/invoicing_generator.rb +14 -0
  23. data/lib/rails/generators/invoicing/ledger_item/ledger_item_generator.rb +17 -0
  24. data/lib/rails/generators/invoicing/ledger_item/templates/migration.rb +25 -0
  25. data/lib/rails/generators/invoicing/ledger_item/templates/model.rb +5 -0
  26. data/lib/rails/generators/invoicing/line_item/line_item_generator.rb +17 -0
  27. data/lib/rails/generators/invoicing/line_item/templates/migration.rb +20 -0
  28. data/lib/rails/generators/invoicing/line_item/templates/model.rb +5 -0
  29. data/lib/rails/generators/invoicing/tax_rate/tax_rate_generator.rb +17 -0
  30. data/lib/rails/generators/invoicing/tax_rate/templates/migration.rb +14 -0
  31. data/lib/rails/generators/invoicing/tax_rate/templates/model.rb +3 -0
  32. metadata +110 -153
  33. data.tar.gz.sig +0 -1
  34. data/History.txt +0 -31
  35. data/Manifest.txt +0 -62
  36. data/PostInstall.txt +0 -10
  37. data/README.rdoc +0 -58
  38. data/script/console +0 -10
  39. data/script/destroy +0 -14
  40. data/script/generate +0 -14
  41. data/tasks/rcov.rake +0 -4
  42. data/test/cached_record_test.rb +0 -100
  43. data/test/class_info_test.rb +0 -253
  44. data/test/connection_adapter_ext_test.rb +0 -79
  45. data/test/currency_value_test.rb +0 -209
  46. data/test/find_subclasses_test.rb +0 -120
  47. data/test/fixtures/README +0 -7
  48. data/test/fixtures/cached_record.sql +0 -22
  49. data/test/fixtures/class_info.sql +0 -28
  50. data/test/fixtures/currency_value.sql +0 -29
  51. data/test/fixtures/find_subclasses.sql +0 -43
  52. data/test/fixtures/ledger_item.sql +0 -39
  53. data/test/fixtures/line_item.sql +0 -33
  54. data/test/fixtures/price.sql +0 -4
  55. data/test/fixtures/tax_rate.sql +0 -4
  56. data/test/fixtures/taxable.sql +0 -14
  57. data/test/fixtures/time_dependent.sql +0 -35
  58. data/test/ledger_item_test.rb +0 -444
  59. data/test/line_item_test.rb +0 -139
  60. data/test/models/README +0 -4
  61. data/test/models/test_subclass_in_another_file.rb +0 -3
  62. data/test/models/test_subclass_not_in_database.rb +0 -6
  63. data/test/price_test.rb +0 -9
  64. data/test/ref-output/creditnote3.html +0 -82
  65. data/test/ref-output/creditnote3.xml +0 -89
  66. data/test/ref-output/invoice1.html +0 -93
  67. data/test/ref-output/invoice1.xml +0 -111
  68. data/test/ref-output/invoice2.html +0 -86
  69. data/test/ref-output/invoice2.xml +0 -98
  70. data/test/ref-output/invoice_null.html +0 -36
  71. data/test/render_html_test.rb +0 -70
  72. data/test/render_ubl_test.rb +0 -44
  73. data/test/setup.rb +0 -37
  74. data/test/tax_rate_test.rb +0 -9
  75. data/test/taxable_test.rb +0 -180
  76. data/test/test_helper.rb +0 -72
  77. data/test/time_dependent_test.rb +0 -180
  78. metadata.gz.sig +0 -4
@@ -0,0 +1,108 @@
1
+ require 'prawn'
2
+
3
+ # This class is responsible for generating a pdf for an invoice. It assumes that
4
+ # you have installed pdf library called prawn. Just pass an invoice, and call
5
+ # render by passing the file.
6
+ #
7
+ # generator = Invoicing::LedgerItem::PdfGenerator.new(invoice)
8
+ # generator.render('/path/to/pdf-file/to/be/generated')
9
+ #
10
+ module Invoicing
11
+ module LedgerItem
12
+ class PdfGenerator
13
+ def initialize(invoice)
14
+ @invoice = invoice
15
+ end
16
+ attr_reader :invoice
17
+
18
+ def render(file)
19
+ Prawn::Document.generate(file) do |pdf|
20
+ render_headers(pdf)
21
+ render_details(pdf)
22
+ render_summary(pdf)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def render_headers(pdf)
29
+ pdf.table([ ['Invoice Receipt'] ], width: 540, cell_style: {padding: 0}) do
30
+ row(0..10).borders = []
31
+ cells.column(0).style(size: 20, font_style: :bold, valign: :center)
32
+ end
33
+ end
34
+
35
+ # Renders details about pdf. Shows recipient name, invoice date and id
36
+ def render_details(pdf)
37
+ pdf.move_down 10
38
+ pdf.stroke_horizontal_rule
39
+ pdf.move_down 15
40
+
41
+ billing_details =
42
+ pdf.make_table([ ['Billed to:'], [recipient_name] ],
43
+ width: 355, cell_style: {padding: 0}) do
44
+ row(0..10).style(size: 9, borders: [])
45
+ row(0).column(0).style(font_style: :bold)
46
+ end
47
+
48
+ invoice_date = invoice.created_at.strftime('%e %b %Y')
49
+ invoice_id = invoice.id.to_s
50
+ invoice_details =
51
+ pdf.make_table([ ['Invoice Date:', invoice_date], ['Invoice No:', invoice_id] ],
52
+ width: 185, cell_style: {padding: 5, border_width: 0.5}) do
53
+ row(0..10).style(size: 9)
54
+ row(0..10).column(0).style(font_style: :bold)
55
+ end
56
+
57
+ pdf.table([ [billing_details, invoice_details] ], cell_style: {padding: 0}) do
58
+ row(0..10).style(borders: [])
59
+ end
60
+ end
61
+
62
+ # Renders details of invoice in a tabular format. Renders each line item, and
63
+ # unit price, and total amount, along with tax. It also displays summary,
64
+ # ie total amount, and total price along with tax.
65
+ def render_summary(pdf)
66
+ pdf.move_down 25
67
+ pdf.text 'Invoice Summary', size: 12, style: :bold
68
+ pdf.stroke_horizontal_rule
69
+
70
+ table_details = [ ['Sl. no.', 'Description', 'Unit price', 'Total Price'] ]
71
+ invoice.line_items.each_with_index do |line_item, index|
72
+ net_amount = line_item.net_amount_formatted
73
+ table_details <<
74
+ [index + 1, line_item.description, '10', net_amount]
75
+ end
76
+ pdf.table(table_details, column_widths: [40, 380, 60, 60], header: true,
77
+ cell_style: {padding: 5, border_width: 0.5}) do
78
+ row(0).style(size: 10, font_style: :bold)
79
+ row(0..100).style(size: 9)
80
+
81
+ cells.columns(0).align = :right
82
+ cells.columns(2).align = :right
83
+ cells.columns(3).align = :right
84
+ row(0..100).borders = [:top, :bottom]
85
+ end
86
+
87
+ summary_details = [
88
+ ['Subtotal', invoice.net_amount_formatted],
89
+ ['Tax', invoice.tax_amount_formatted],
90
+ ['Total', invoice.total_amount_formatted]
91
+ ]
92
+ pdf.table(summary_details, column_widths: [480, 60], header: true,
93
+ cell_style: {padding: 5, border_width: 0.5}) do
94
+ row(0..100).style(size: 9, font_style: :bold)
95
+ row(0..100).borders = []
96
+ cells.columns(0..100).align = :right
97
+ end
98
+
99
+ pdf.move_down 25
100
+ pdf.stroke_horizontal_rule
101
+ end
102
+
103
+ def recipient_name
104
+ invoice.recipient.respond_to?(:name) ? invoice.recipient.name : ''
105
+ end
106
+ end
107
+ end
108
+ end
@@ -1,11 +1,14 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require "active_support/concern"
3
4
  require 'builder'
4
5
 
5
6
  module Invoicing
6
7
  module LedgerItem
7
8
  # Included into ActiveRecord model object when +acts_as_ledger_item+ is invoked.
8
9
  module RenderHTML
10
+ extend ActiveSupport::Concern
11
+
9
12
  # Shortcut for rendering an invoice or a credit note into a human-readable HTML format.
10
13
  # Can be called without any arguments, in which case a general-purpose representation is
11
14
  # produced. Can also be given options and a block for customising the output:
@@ -25,14 +28,14 @@ module Invoicing
25
28
  yield output_builder if block_given?
26
29
  output_builder.build
27
30
  end
28
-
29
-
31
+
32
+
30
33
  class HTMLOutputBuilder #:nodoc:
31
-
34
+
32
35
  HTML_ESCAPE = { '&' => '&amp;', '>' => '&gt;', '<' => '&lt;', '"' => '&quot;' }
33
-
36
+
34
37
  attr_reader :ledger_item, :current_line_item, :options, :custom_fragments, :factor
35
-
38
+
36
39
  def initialize(ledger_item, options)
37
40
  @ledger_item = ledger_item
38
41
  @options = default_options
@@ -41,7 +44,7 @@ module Invoicing
41
44
  total_amount = get(:total_amount)
42
45
  @factor = (total_amount && total_amount < BigDecimal('0')) ? BigDecimal('-1') : BigDecimal('1')
43
46
  end
44
-
47
+
45
48
  def default_options
46
49
  line_items = get(:line_items)
47
50
  {
@@ -58,7 +61,7 @@ module Invoicing
58
61
  def h(s)
59
62
  s.to_s.gsub(/[#{HTML_ESCAPE.keys.join}]/) { |char| HTML_ESCAPE[char] }
60
63
  end
61
-
64
+
62
65
  # foo { block } => call block when invoking fragment foo
63
66
  # foo "string" => return string when invoking fragment foo
64
67
  # invoke_foo => invoke fragment foo; if none set, delegate to default_foo
@@ -72,7 +75,7 @@ module Invoicing
72
75
  return send("default_#{method_id}", *args, &block)
73
76
  end
74
77
  end
75
-
78
+
76
79
  return super unless respond_to? "default_#{method_id}"
77
80
 
78
81
  if block_given? && args.empty?
@@ -83,22 +86,22 @@ module Invoicing
83
86
  raise ArgumentError, "#{method_id} expects exactly one value or block argument"
84
87
  end
85
88
  end
86
-
89
+
87
90
  # Returns the value of a (potentially renamed) method on the ledger item
88
91
  def get(method_id)
89
92
  ledger_item.send(:ledger_item_class_info).get(ledger_item, method_id)
90
93
  end
91
-
94
+
92
95
  # Returns the value of a (potentially renamed) method on a line item
93
96
  def line_get(method_id, line_item = current_line_item)
94
97
  line_item.send(:line_item_class_info).get(line_item, method_id)
95
98
  end
96
-
99
+
97
100
  # String for one level of indentation
98
101
  def indent
99
102
  ' '
100
103
  end
101
-
104
+
102
105
  # This is quite meta. :)
103
106
  #
104
107
  # params_hash(:sender_label, :sender_tax_number => :tax_number_label)
@@ -108,13 +111,13 @@ module Invoicing
108
111
  result = {}
109
112
  param_names.flatten!
110
113
  options = param_names.extract_options!
111
-
114
+
112
115
  param_names.each{|param| result[param.to_sym] = send("invoke_#{param}") }
113
-
116
+
114
117
  options.each_pair do |key, value|
115
118
  result[key.to_sym] = send("invoke_#{key}", params_hash(value))
116
119
  end
117
-
120
+
118
121
  result
119
122
  end
120
123
 
@@ -124,7 +127,7 @@ module Invoicing
124
127
  :sender_tax_number => :tax_number_label,
125
128
  :recipient_tax_number => :tax_number_label
126
129
  }]
127
-
130
+
128
131
  metadata_table_deps = [{
129
132
  :identifier => :identifier_label,
130
133
  :issue_date => [:date_format, :issue_date_label],
@@ -132,24 +135,24 @@ module Invoicing
132
135
  :period_end => [:date_format, :period_end_label],
133
136
  :due_date => [:date_format, :due_date_label]
134
137
  }]
135
-
138
+
136
139
  line_items_header_deps = [:line_tax_point_label, :line_quantity_label, :line_description_label,
137
140
  :line_net_amount_label, :line_tax_amount_label, :line_gross_amount_label]
138
-
141
+
139
142
  line_items_subtotal_deps = [:subtotal_label, :net_amount_label, :tax_amount_label,
140
143
  :gross_amount_label, {
141
144
  :net_amount => :net_amount_label,
142
145
  :tax_amount => :tax_amount_label,
143
146
  :total_amount => :gross_amount_label
144
147
  }]
145
-
148
+
146
149
  line_items_total_deps = [:total_label, :net_amount_label, :tax_amount_label,
147
150
  :gross_amount_label, {
148
151
  :net_amount => :net_amount_label,
149
152
  :tax_amount => :tax_amount_label,
150
153
  :total_amount => :gross_amount_label
151
154
  }]
152
-
155
+
153
156
  page_layout_deps = {
154
157
  :title_tag => :title,
155
158
  :addresses_table => addresses_table_deps,
@@ -161,107 +164,107 @@ module Invoicing
161
164
  :line_items_total => line_items_total_deps
162
165
  }]
163
166
  }
164
-
167
+
165
168
  invoke_page_layout(params_hash(page_layout_deps))
166
169
  end
167
-
170
+
168
171
  def default_date_format
169
172
  "%Y-%m-%d"
170
173
  end
171
-
174
+
172
175
  def default_invoice_label
173
176
  "Invoice"
174
177
  end
175
-
178
+
176
179
  def default_credit_note_label
177
180
  "Credit Note"
178
181
  end
179
-
182
+
180
183
  def default_recipient_label
181
184
  "Recipient"
182
185
  end
183
-
186
+
184
187
  def default_sender_label
185
188
  "Sender"
186
189
  end
187
-
190
+
188
191
  def default_tax_number_label
189
192
  "VAT number:<br />"
190
193
  end
191
-
194
+
192
195
  def default_identifier_label
193
196
  label = (factor == BigDecimal('-1')) ? invoke_credit_note_label : invoke_invoice_label
194
197
  "#{label} no.:"
195
198
  end
196
-
199
+
197
200
  def default_issue_date_label
198
201
  "Issue date:"
199
202
  end
200
-
203
+
201
204
  def default_period_start_label
202
205
  "Period from:"
203
206
  end
204
-
207
+
205
208
  def default_period_end_label
206
209
  "Period until:"
207
210
  end
208
-
211
+
209
212
  def default_due_date_label
210
213
  "Payment due:"
211
214
  end
212
-
215
+
213
216
  def default_line_tax_point_label
214
217
  "Tax point"
215
218
  end
216
-
219
+
217
220
  def default_line_quantity_label
218
221
  "Quantity"
219
222
  end
220
-
223
+
221
224
  def default_line_description_label
222
225
  "Description"
223
226
  end
224
-
227
+
225
228
  def default_line_net_amount_label
226
229
  "Net price"
227
230
  end
228
-
231
+
229
232
  def default_line_tax_amount_label
230
233
  "VAT"
231
234
  end
232
-
235
+
233
236
  def default_line_gross_amount_label
234
237
  "Gross price"
235
238
  end
236
-
239
+
237
240
  def default_subtotal_label
238
241
  "Subtotal"
239
242
  end
240
-
243
+
241
244
  def default_total_label
242
245
  "Total"
243
246
  end
244
-
247
+
245
248
  def default_net_amount_label
246
249
  "Net: "
247
250
  end
248
-
251
+
249
252
  def default_tax_amount_label
250
253
  "VAT: "
251
254
  end
252
-
255
+
253
256
  def default_gross_amount_label
254
257
  ""
255
258
  end
256
-
259
+
257
260
  def default_title
258
261
  (factor == BigDecimal('-1')) ? invoke_credit_note_label : invoke_invoice_label
259
262
  end
260
-
263
+
261
264
  def default_title_tag(params)
262
265
  "<h1 class=\"invoice\">#{params[:title]}</h1>\n"
263
266
  end
264
-
267
+
265
268
  def default_address(details)
266
269
  details = details.symbolize_keys
267
270
  html = "#{indent*3}<div class=\"fn org\">#{ h(details[:name]) }</div>\n"
@@ -274,25 +277,25 @@ module Invoicing
274
277
  html << "#{indent*4}<span class=\"country-name\">#{h(details[:country]) }</span>\n" unless details[:country].blank?
275
278
  html << "#{indent*3}</div>\n"
276
279
  end
277
-
280
+
278
281
  def default_sender_address
279
282
  invoke_address(get(:sender_details))
280
283
  end
281
-
284
+
282
285
  def default_recipient_address
283
286
  invoke_address(get(:recipient_details))
284
287
  end
285
-
288
+
286
289
  def default_sender_tax_number(params)
287
290
  sender_tax_number = get(:sender_details).symbolize_keys[:tax_number]
288
291
  "#{params[:tax_number_label]}<span class=\"tax-number\">#{h(sender_tax_number)}</span>"
289
292
  end
290
-
293
+
291
294
  def default_recipient_tax_number(params)
292
295
  recipient_tax_number = get(:recipient_details).symbolize_keys[:tax_number]
293
296
  "#{params[:tax_number_label]}<span class=\"tax-number\">#{h(recipient_tax_number)}</span>"
294
297
  end
295
-
298
+
296
299
  def default_addresses_table(params)
297
300
  html = "#{indent*0}<table class=\"invoice addresses\">\n"
298
301
  html << "#{indent*1}<tr>\n"
@@ -315,7 +318,7 @@ module Invoicing
315
318
  html << "#{indent*1}</tr>\n"
316
319
  html << "#{indent*0}</table>\n"
317
320
  end
318
-
321
+
319
322
  def default_metadata_item(params, key, value)
320
323
  label = params["#{key}_label".to_sym]
321
324
  html = "#{indent*1}<tr class=\"#{key.to_s.gsub(/_/, '-')}\">\n"
@@ -323,11 +326,11 @@ module Invoicing
323
326
  html << "#{indent*2}<td>#{h(value)}</td>\n"
324
327
  html << "#{indent*1}</tr>\n"
325
328
  end
326
-
329
+
327
330
  def default_identifier(params)
328
331
  invoke_metadata_item(params, :identifier, get(:identifier))
329
332
  end
330
-
333
+
331
334
  def default_issue_date(params)
332
335
  if issue_date = get(:issue_date)
333
336
  invoke_metadata_item(params, :issue_date, issue_date.strftime(params[:date_format]))
@@ -335,7 +338,7 @@ module Invoicing
335
338
  ""
336
339
  end
337
340
  end
338
-
341
+
339
342
  def default_period_start(params)
340
343
  if period_start = get(:period_start)
341
344
  invoke_metadata_item(params, :period_start, period_start.strftime(params[:date_format]))
@@ -343,7 +346,7 @@ module Invoicing
343
346
  ""
344
347
  end
345
348
  end
346
-
349
+
347
350
  def default_period_end(params)
348
351
  if period_end = get(:period_end)
349
352
  invoke_metadata_item(params, :period_end, period_end.strftime(params[:date_format]))
@@ -351,7 +354,7 @@ module Invoicing
351
354
  ""
352
355
  end
353
356
  end
354
-
357
+
355
358
  def default_due_date(params)
356
359
  if due_date = get(:due_date)
357
360
  invoke_metadata_item(params, :due_date, due_date.strftime(params[:date_format]))
@@ -364,15 +367,15 @@ module Invoicing
364
367
  "<table class=\"invoice metadata\">\n" + params[:identifier] + params[:issue_date] +
365
368
  params[:period_start] + params[:period_end] + params[:due_date] + "#{indent*0}</table>\n"
366
369
  end
367
-
370
+
368
371
  def default_description
369
372
  h(get(:description))
370
373
  end
371
-
374
+
372
375
  def default_description_tag(params)
373
376
  "<p class=\"invoice description\">#{params[:description]}</p>\n"
374
377
  end
375
-
378
+
376
379
  def default_line_items_header(params)
377
380
  html = "#{indent*1}<tr>\n"
378
381
  html << "#{indent*2}<th class=\"tax-point\">#{ params[:line_tax_point_label] }</th>\n" if options[:tax_point_column]
@@ -383,7 +386,7 @@ module Invoicing
383
386
  html << "#{indent*2}<th class=\"gross-amount\">#{params[:line_gross_amount_label]}</th>\n" if options[:gross_amount_column]
384
387
  html << "#{indent*1}</tr>\n"
385
388
  end
386
-
389
+
387
390
  def default_line_tax_point(params)
388
391
  if tax_point = line_get(:tax_point)
389
392
  h(tax_point.strftime(params[:date_format]))
@@ -391,15 +394,15 @@ module Invoicing
391
394
  ""
392
395
  end
393
396
  end
394
-
397
+
395
398
  def default_line_quantity(params)
396
399
  h(line_get(:quantity).to_s)
397
400
  end
398
-
401
+
399
402
  def default_line_description(params)
400
403
  h(line_get(:description))
401
404
  end
402
-
405
+
403
406
  def default_line_net_amount(params)
404
407
  if net_amount = line_get(:net_amount)
405
408
  h(current_line_item.format_currency_value(net_amount*factor))
@@ -407,7 +410,7 @@ module Invoicing
407
410
  "—"
408
411
  end
409
412
  end
410
-
413
+
411
414
  def default_line_tax_amount(params)
412
415
  if tax_amount = line_get(:tax_amount)
413
416
  h(current_line_item.format_currency_value(tax_amount*factor))
@@ -415,7 +418,7 @@ module Invoicing
415
418
  "—"
416
419
  end
417
420
  end
418
-
421
+
419
422
  def default_line_gross_amount(params)
420
423
  if gross_amount = line_get(:gross_amount)
421
424
  h(current_line_item.format_currency_value(gross_amount*factor))
@@ -423,7 +426,7 @@ module Invoicing
423
426
  "—"
424
427
  end
425
428
  end
426
-
429
+
427
430
  def default_net_amount(params)
428
431
  if net_amount = get(:net_amount)
429
432
  h(ledger_item.format_currency_value(net_amount*factor))
@@ -431,7 +434,7 @@ module Invoicing
431
434
  "—"
432
435
  end
433
436
  end
434
-
437
+
435
438
  def default_tax_amount(params)
436
439
  if tax_amount = get(:tax_amount)
437
440
  h(ledger_item.format_currency_value(tax_amount*factor))
@@ -439,7 +442,7 @@ module Invoicing
439
442
  "—"
440
443
  end
441
444
  end
442
-
445
+
443
446
  def default_total_amount(params)
444
447
  if total_amount = get(:total_amount)
445
448
  h(ledger_item.format_currency_value(total_amount*factor))
@@ -447,7 +450,7 @@ module Invoicing
447
450
  "—"
448
451
  end
449
452
  end
450
-
453
+
451
454
  def default_line_item(params)
452
455
  html = "#{indent*1}<tr>\n"
453
456
  html << "#{indent*2}<td class=\"tax-point\">#{ params[:line_tax_point] }</td>\n" if options[:tax_point_column]
@@ -472,7 +475,7 @@ module Invoicing
472
475
  ))
473
476
  end.join
474
477
  end
475
-
478
+
476
479
  def default_line_items_subtotal(params)
477
480
  colspan = 0
478
481
  colspan += 1 if options[:tax_point_column]
@@ -485,7 +488,7 @@ module Invoicing
485
488
  html << "#{indent*2}<td class=\"gross-amount\"></td>\n" if options[:gross_amount_column]
486
489
  html << "#{indent*1}</tr>\n"
487
490
  end
488
-
491
+
489
492
  def default_line_items_total(params)
490
493
  colspan = -1
491
494
  colspan += 1 if options[:tax_point_column]
@@ -506,7 +509,7 @@ module Invoicing
506
509
  html << params[:line_items_subtotal] if options[:subtotal]
507
510
  html << params[:line_items_total] + "</table>\n"
508
511
  end
509
-
512
+
510
513
  def default_page_layout(params)
511
514
  params[:title_tag] + params[:addresses_table] + params[:metadata_table] +
512
515
  params[:description_tag] + params[:line_items_table]