invoicing 0.2.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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]