rock_books 0.6.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -10
  3. data/RELEASE_NOTES.md +57 -10
  4. data/assets/fonts/JetBrainsMono-Medium.ttf +0 -0
  5. data/lib/rock_books/cmd_line/command_line_interface.rb +15 -24
  6. data/lib/rock_books/cmd_line/main.rb +1 -9
  7. data/lib/rock_books/documents/book_set.rb +5 -2
  8. data/lib/rock_books/documents/chart_of_accounts.rb +29 -12
  9. data/lib/rock_books/documents/journal.rb +3 -8
  10. data/lib/rock_books/documents/journal_entry.rb +7 -2
  11. data/lib/rock_books/documents/journal_entry_builder.rb +4 -0
  12. data/lib/rock_books/helpers/book_set_loader.rb +3 -3
  13. data/lib/rock_books/reports/balance_sheet.rb +9 -43
  14. data/lib/rock_books/reports/book_set_reporter.rb +138 -106
  15. data/lib/rock_books/reports/data/bs_is_data.rb +61 -0
  16. data/lib/rock_books/reports/data/bs_is_section_data.rb +30 -0
  17. data/lib/rock_books/reports/data/journal_data.rb +38 -0
  18. data/lib/rock_books/reports/data/multidoc_txn_by_account_data.rb +40 -0
  19. data/lib/rock_books/reports/data/multidoc_txn_report_data.rb +39 -0
  20. data/lib/rock_books/reports/data/receipts_report_data.rb +47 -0
  21. data/lib/rock_books/reports/data/tx_one_account_data.rb +37 -0
  22. data/lib/rock_books/reports/helpers/erb_helper.rb +21 -0
  23. data/lib/rock_books/reports/helpers/receipts_hyperlink_converter.rb +59 -0
  24. data/lib/rock_books/reports/helpers/text_report_helper.rb +144 -0
  25. data/lib/rock_books/reports/income_statement.rb +9 -47
  26. data/lib/rock_books/reports/index_html_page.rb +27 -0
  27. data/lib/rock_books/reports/journal_report.rb +82 -0
  28. data/lib/rock_books/reports/multidoc_txn_by_account_report.rb +32 -0
  29. data/lib/rock_books/reports/multidoc_txn_report.rb +25 -0
  30. data/lib/rock_books/reports/receipts_report.rb +6 -55
  31. data/lib/rock_books/reports/templates/html/index.html.erb +158 -0
  32. data/lib/rock_books/reports/templates/html/report_page.html.erb +25 -0
  33. data/lib/rock_books/reports/templates/text/_receipt_section.txt.erb +17 -0
  34. data/lib/rock_books/reports/templates/text/_totals.txt.erb +8 -0
  35. data/lib/rock_books/reports/templates/text/balance_sheet.txt.erb +23 -0
  36. data/lib/rock_books/reports/templates/text/income_statement.txt.erb +23 -0
  37. data/lib/rock_books/reports/templates/text/journal.txt.erb +23 -0
  38. data/lib/rock_books/reports/templates/text/multidoc_txn_by_account_report.txt.erb +31 -0
  39. data/lib/rock_books/reports/templates/text/multidoc_txn_report.txt.erb +25 -0
  40. data/lib/rock_books/reports/templates/text/receipts_report.txt.erb +16 -0
  41. data/lib/rock_books/reports/templates/text/tx_one_account.txt.erb +21 -0
  42. data/lib/rock_books/reports/tx_one_account.rb +10 -45
  43. data/lib/rock_books/types/account.rb +13 -1
  44. data/lib/rock_books/types/account_type.rb +18 -7
  45. data/lib/rock_books/version.rb +2 -1
  46. data/manual.md +13 -16
  47. data/rock_books.gemspec +2 -0
  48. metadata +57 -10
  49. data/lib/rock_books/helpers/html_helper.rb +0 -29
  50. data/lib/rock_books/reports/index.html.erb +0 -156
  51. data/lib/rock_books/reports/multidoc_transaction_report.rb +0 -66
  52. data/lib/rock_books/reports/receipts.html.erb +0 -54
  53. data/lib/rock_books/reports/reporter.rb +0 -118
  54. data/lib/rock_books/reports/transaction_report.rb +0 -105
  55. data/lib/rock_books/reports/tx_by_account.rb +0 -82
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 81be281ee187aa03b43808391235de30c85e05b7983e243a5df887ec6eb12b2b
4
- data.tar.gz: 9069620c1ad95d22e35358caa4ed473899c7a897ad741f679047def6b6fee1e7
3
+ metadata.gz: 974a379630080a4b8ec174d0b79fe46ce629f0c0fab0c6e147e3b1e4cd472c3f
4
+ data.tar.gz: 289a1cccf88c3ab27fccac9bfd98c9b4e88f4d14d791d92ebcf52dfd6d7509ee
5
5
  SHA512:
6
- metadata.gz: e67e7be616f654e5ed67e7f32836b03f56cdfc18821a7d0ee50570aadbb5cb65d0f288d0c4def2999ce2f32b150490e93aa0a6107a1995297b69d178e4ab9de9
7
- data.tar.gz: 38819a0cfa909e3171705f11d3151bc2d128d0b946d6a31ff3cb1e6a7278e60670cb820c2fceb8e66be9891891a91dcd317079050675c1b2678b099d26b76676
6
+ metadata.gz: 57489817b4cae0dd70db00ee4fc10f8fc432ebb1a6ed01a93b6c1f646b681ae5eb456d171c5a7fe2d981bada1771da33eccba7ed08cebceee57925c5c1bb7560
7
+ data.tar.gz: 2f530db52499773bae28f24f6ee4cf0a243056b6e8df9a83723826b132b4cecc558451bcf357840946e437e6e22740aa4b7d417789df84ec3bbba6050917fe57
data/README.md CHANGED
@@ -33,10 +33,8 @@ To simplify its implementation, RockBooks assumes some conventions:
33
33
 
34
34
  #### Supported Operating Systems
35
35
 
36
- At this time, RockBooks is supported only on Mac OS and Linux. (It's really the external tools that is the issue, not the Ruby code.) It should probably work with Windows Subsystem for Linux (WSL) but it hasn't been tested. If you're unsuccessful trying to use RockBooks with WSL, give me as much information as possible and I'll try to resolve the issue.
36
+ At this time, RockBooks is tested only on Mac OS and Linux. However, it will probably work fine on Windows.
37
37
 
38
- If you get an error message saying that an external command is missing, install that command using your system's package manager (e.g. `sudo apt install txt2html`). For `wkhtmltopdf` on Linux, see [https://wkhtmltopdf.org/](https://wkhtmltopdf.org/).
39
-
40
38
  #### Text Files as Input
41
39
 
42
40
  Instead of a web interface, data input is done in plain text files. This isn't as fancy but has the following advantages:
@@ -49,17 +47,17 @@ Instead of a web interface, data input is done in plain text files. This isn't a
49
47
 
50
48
  * Users can use their favorite text editors.
51
49
 
52
- * All data entry can be done without moving the hands away from the keyboard.
50
+ * All data entry can be done without moving the hands away from the keyboard (assuming the editor software supports it, as does `vim`).
53
51
 
54
52
 
55
53
  #### The Accounting Period
56
54
 
57
- There is no handling of end of year closings or the like; the entire set of data in the input files is considered included in the reporting period when generating the reports. Therefore, the best approach is to create a new data set for each year. The chart of accounts and journal files can be copied and modified as necessary.
55
+ There is no handling of end of year closings or the like; the entire set of data in the input files is considered included in the reporting period when generating the reports. Therefore, the best approach is to create a new data set for each year. The chart of accounts and journal files can be copied from the previous year and modified as necessary.
58
56
 
59
57
  #### RockBooks Help Text
60
58
 
61
59
  ```
62
- Command Line Switches: [rock-books version 0.2.1 at https://github.com/keithrbennett/rock_books]
60
+ Command Line Switches: [rock-books version 0.10.0 at https://github.com/keithrbennett/rock_books]
63
61
 
64
62
  -i input directory specification, default: './rockbooks-inputs'
65
63
  -o output (reports) directory specification, default: './rockbooks-reports'
@@ -68,14 +66,13 @@ Command Line Switches: [rock-books version 0.2.1 at https://g
68
66
 
69
67
  Commands:
70
68
 
71
- rec[eipts] - receipts: a/:a all, m/:m missing, e/:e existing
69
+ rec[eipts] - receipts: a/:a all, m/:m missing, e/:e existing, u/:u unused
72
70
  rep[orts] - return an OpenStruct containing all reports (interactive shell mode only)
73
- d[isplay_reports] - display all reports on stdout
74
71
  w[rite_reports] - write all reports to the output directory (see -o option)
75
72
  c[hart_of_accounts] - chart of accounts
76
73
  h[elp] - prints this help
77
74
  jo[urnals] - list of the journals' short names
78
- proj[ect_page] - open the RockBooks Github project page in a browser
75
+ proj[ect_page] - prints the RockBooks Github project page URL
79
76
  rel[oad_data] - reload data from input files
80
77
  q[uit] - exits this program (interactive shell mode only) (see also 'x')
81
78
  x[it] - exits this program (interactive shell mode only) (see also 'q')
@@ -90,7 +87,8 @@ When in interactive shell mode:
90
87
 
91
88
  ## What RockBooks Is Not
92
89
 
93
- As a product written by a single developer in his spare time, RockBooks lacks some conveniences of traditional accounting software programs, such as:
90
+ As a product written by a single developer in his spare time,
91
+ RockBooks lacks many conveniences of traditional accounting software programs, such as:
94
92
 
95
93
  * Import of data from financial institutions
96
94
  * On the fly data validation
@@ -1,3 +1,50 @@
1
+ ### v0.10.0
2
+
3
+ * Add invoice hyperlinks to generated HTML.
4
+ * Improve documentation.
5
+ * Add progress bar to report generation.
6
+ * Change 'proj[ect]' command to print the project home page URL, rather than call `open` on it. This makes the command useful in more cases and removes environment dependency.
7
+ * Remove interactive 'display reports' option. It's not that useful and easy enough to write all reports to disk and selectively view them.
8
+ * Fix rep[orts] interactive option.
9
+ * Fix and refactor handling of receipt data on command line.
10
+ * Add styling to report HTML pages, mostly for centering the reports, increasing the font size, and providing a faint blue background.
11
+
12
+
13
+ ### v0.9.0
14
+
15
+ * Center generated index.html's content.
16
+ * Improve report headings.
17
+ * Fix index.html hyperlinks to resource (receipts, invoices, statements, worksheets) directories.
18
+ * Fix cases where split journal entries were not included in the journal report.
19
+
20
+
21
+ ### v0.8.0
22
+
23
+ * Add metadata to PDF and HTML reports
24
+ * Add report generation timestamp and accounting period to all reports.
25
+ * Refactoring and cleanup.
26
+
27
+
28
+ ### v0.7.1
29
+
30
+ * Refactor report helpers.
31
+ * Improve/reduce text output during reporting.
32
+ * Add title to HTML reports.
33
+ * Minor fixes.
34
+
35
+
36
+ ### v0.7.0
37
+
38
+ * Dependencies on external commands in Linux and Mac OS for generating PDF and HTML files has been eliminated,
39
+ using the prawn gem for PDF and simple ERB templating for HTML.
40
+ * Massive refactoring of reports to separate data generation from presentation.
41
+ * Reports are now computed and then written one at a time. Previously they were all computed, then all written.
42
+ * ERB is now used for generating text reports.
43
+ * Fix receipt hyperlinks in HTML output.
44
+ * Improve some error output.
45
+ * Various minor improvements and bug fixes.
46
+
47
+
1
48
  ### v0.6.1
2
49
 
3
50
  * Linux PDF generation fixed by using wkhtmltopdf instead of cupsfilter.
@@ -11,7 +58,7 @@
11
58
  * Add receipt hyperlinks to HTML output.
12
59
 
13
60
 
14
- ## v0.4.0
61
+ ### v0.4.0
15
62
 
16
63
  * Sort unused receipts alphanumerically.
17
64
  * Add 'x' receipts option for reporting both missing and unused receipts.
@@ -19,7 +66,7 @@
19
66
  * Improve Receipts report.
20
67
 
21
68
 
22
- ## v0.3.0
69
+ ### v0.3.0
23
70
 
24
71
  * Added ability to report unused receipts.
25
72
  * Errors now include more context information.
@@ -27,12 +74,12 @@
27
74
  * Change license from MIT to Apache 2.
28
75
 
29
76
 
30
- ## v0.2.1
77
+ ### v0.2.1
31
78
 
32
79
  * Add help text to readme.
33
80
 
34
81
 
35
- ## v0.2.0
82
+ ### v0.2.0
36
83
 
37
84
  * Add instruction manual, modify readme.
38
85
  * Overhaul generated index.html.
@@ -40,18 +87,18 @@
40
87
  * Add validation of transaction dates to ensure within configured date range.
41
88
  * Make report hash / OpenStruct keys consistently symbols.
42
89
 
43
- ## v0.1.6
90
+ ### v0.1.6
44
91
 
45
92
  * Fixed PDF output; PDF files were corrupt because cupsfilter starting sending
46
93
  output to stderr at some point.
47
94
 
48
95
 
49
- ## v0.1.4, v0.1.5
96
+ ### v0.1.4, v0.1.5
50
97
 
51
98
  * Intermediate unsatisfactory fixes, these versions were published but yanked.
52
99
 
53
100
 
54
- ## v0.1.3
101
+ ### v0.1.3
55
102
 
56
103
  * Report output now goes to separate txt, html, and pdf subdirectories.
57
104
  * Add vendor.yml to exclude generated report files from language reporting.
@@ -66,17 +113,17 @@ output to stderr at some point.
66
113
  * Add 'from_string' methods to Journal and ChartOfAccounts.
67
114
 
68
115
 
69
- ## v0.1.2
116
+ ### v0.1.2
70
117
 
71
118
  * Improve error message when the needed directories do not exist.
72
119
 
73
120
 
74
- ## v0.1.1
121
+ ### v0.1.1
75
122
 
76
123
  * Fix startup error.
77
124
 
78
125
 
79
- ## v0.1.0
126
+ ### v0.1.0
80
127
 
81
128
  * First release.
82
129
 
@@ -4,7 +4,8 @@ require 'ostruct'
4
4
 
5
5
  require_relative '../../rock_books'
6
6
  require_relative '../version'
7
- require_relative '../reports/reporter'
7
+ require_relative '../reports/data/receipts_report_data'
8
+ require_relative '../reports/helpers/text_report_helper'
8
9
  require_relative '../helpers/book_set_loader'
9
10
 
10
11
  module RockBooks
@@ -51,12 +52,11 @@ Commands:
51
52
 
52
53
  rec[eipts] - receipts: a/:a all, m/:m missing, e/:e existing, u/:u unused
53
54
  rep[orts] - return an OpenStruct containing all reports (interactive shell mode only)
54
- d[isplay_reports] - display all reports on stdout
55
55
  w[rite_reports] - write all reports to the output directory (see -o option)
56
56
  c[hart_of_accounts] - chart of accounts
57
57
  h[elp] - prints this help
58
58
  jo[urnals] - list of the journals' short names
59
- proj[ect_page] - open the RockBooks Github project page in a browser
59
+ proj[ect_page] - prints the RockBooks Github project page URL
60
60
  rel[oad_data] - reload data from input files
61
61
  q[uit] - exits this program (interactive shell mode only) (see also 'x')
62
62
  x[it] - exits this program (interactive shell mode only) (see also 'q')
@@ -105,7 +105,7 @@ When in interactive shell mode:
105
105
  end
106
106
  end
107
107
 
108
- validate_receipts_dir = -> do
108
+ validate_receipt_dir = -> do
109
109
  File.directory?(options.receipt_dir) ? nil : \
110
110
  "Receipts directory '#{options.receipt_dir}' does not exist. "
111
111
  end
@@ -114,7 +114,7 @@ When in interactive shell mode:
114
114
  output << validate_input_dir.()
115
115
  output << validate_output_dir.()
116
116
  if run_options.do_receipts
117
- output << validate_receipts_dir.()
117
+ output << validate_receipt_dir.()
118
118
  end
119
119
 
120
120
  output.compact!
@@ -281,7 +281,7 @@ When in interactive shell mode:
281
281
  # All reports as Ruby objects; only makes sense in shell mode.
282
282
  def cmd_rep
283
283
  unless run_options.interactive_mode
284
- raise Error.new("Option 'all_reports' is only available in shell mode. Try 'display_reports' or 'write_reports'.")
284
+ raise Error.new("Option 'all_reports' is only available in shell mode. Try 'write_reports'.")
285
285
  end
286
286
 
287
287
  os = OpenStruct.new(book_set.all_reports($filter))
@@ -297,18 +297,8 @@ When in interactive shell mode:
297
297
  end
298
298
 
299
299
 
300
- def cmd_d
301
- book_set.all_reports($filter).each do |short_name, report_text|
302
- puts "#{short_name}:\n\n"
303
- puts report_text
304
- puts "\n\n\n"
305
- end
306
- nil
307
- end
308
-
309
-
310
300
  def cmd_proj
311
- `open https://github.com/keithrbennett/rock_books`
301
+ puts 'https://github.com/keithrbennett/rock_books'
312
302
  end
313
303
 
314
304
 
@@ -317,7 +307,9 @@ When in interactive shell mode:
317
307
  raise Error.new("Receipt processing was requested but has been disabled with --no-receipts.")
318
308
  end
319
309
 
320
- missing, existing, unused = book_set.missing_existing_unused_receipts
310
+ data = ReceiptsReportData.new(all_entries, run_options.receipt_dir).fetch
311
+
312
+ missing, existing, unused = data[:missing], data[:existing], data[:unused]
321
313
 
322
314
  print_missing = -> { puts "\n\nMissing Receipts:"; ap missing }
323
315
  print_existing = -> { puts "\n\nExisting Receipts:"; ap existing }
@@ -326,11 +318,11 @@ When in interactive shell mode:
326
318
  case options.first.to_s
327
319
  when 'a' # all
328
320
  if run_options.interactive_mode
329
- { missing: missing, existing: existing, unused: unused }
321
+ data
330
322
  else
331
- print_missing.()
332
- print_existing.()
333
- print_unused.()
323
+ print_missing.()
324
+ print_existing.()
325
+ print_unused.()
334
326
  end
335
327
 
336
328
  when 'm'
@@ -358,7 +350,7 @@ When in interactive shell mode:
358
350
  end
359
351
 
360
352
  def cmd_w
361
- BookSetReporter.new(book_set, run_options.output_dir, $filter).call
353
+ BookSetReporter.new(book_set, run_options.output_dir, $filter).generate
362
354
  nil
363
355
  end
364
356
 
@@ -372,7 +364,6 @@ When in interactive shell mode:
372
364
  @commands_ ||= [
373
365
  Command.new('rec', 'receipts', -> (*options) { cmd_rec(options) }),
374
366
  Command.new('rep', 'reports', -> (*_options) { cmd_rep }),
375
- Command.new('d', 'display_reports', -> (*_options) { cmd_d }),
376
367
  Command.new('w', 'write_reports', -> (*_options) { cmd_w }),
377
368
  Command.new('c', 'chart_of_accounts', -> (*_options) { cmd_c }),
378
369
  Command.new('jo', 'journals', -> (*_options) { cmd_j }),
@@ -1,4 +1,4 @@
1
- require 'awesome_print'
1
+ require 'amazing_print'
2
2
  require 'optparse'
3
3
  require 'pry'
4
4
  require 'shellwords'
@@ -67,10 +67,6 @@ class Main
67
67
  options.verbose_mode = v
68
68
  end
69
69
 
70
- parser.on('-y', '--[no-]say', 'Say error messages.') do |v|
71
- options.say = v
72
- end
73
-
74
70
  parser.on('', '--[no-]receipts', 'Include report on existing and missing receipts.') do |v|
75
71
  options.do_receipts = v
76
72
  end
@@ -101,10 +97,6 @@ class Main
101
97
 
102
98
  HEREDOC
103
99
 
104
- if run_options.say
105
- `say #{error}`
106
- end
107
-
108
100
  exit(-1)
109
101
  binding.pry
110
102
  raise error
@@ -1,10 +1,9 @@
1
- require 'awesome_print'
1
+ require 'amazing_print'
2
2
  require 'os'
3
3
 
4
4
  require_relative 'chart_of_accounts'
5
5
  require_relative 'journal'
6
6
  require_relative '../filters/journal_entry_filters' # for shell mode
7
- require_relative '../helpers/html_helper'
8
7
  require_relative '../helpers/parse_helper'
9
8
  require_relative '../reports/book_set_reporter'
10
9
 
@@ -39,6 +38,10 @@ module RockBooks
39
38
  @all_entries ||= Journal.entries_in_documents(journals)
40
39
  end
41
40
 
41
+
42
+ def all_reports(filter = nil)
43
+ BookSetReporter.new(self, nil, filter).get_all_report_data
44
+ end
42
45
  end
43
46
  end
44
47
 
@@ -1,3 +1,4 @@
1
+ require 'stringio'
1
2
  require_relative '../types/account'
2
3
  require_relative '../types/account_type'
3
4
  require_relative '../errors/error'
@@ -10,8 +11,8 @@ class ChartOfAccounts
10
11
  REQUIRED_FIELDS.each { |field| attr_reader(field) }
11
12
 
12
13
 
13
- def self.from_file(file)
14
- self.new(File.readlines(file).map(&:chomp))
14
+ def self.from_file(filespec)
15
+ self.new(File.readlines(filespec).map(&:chomp), filespec)
15
16
  end
16
17
 
17
18
 
@@ -20,11 +21,16 @@ class ChartOfAccounts
20
21
  end
21
22
 
22
23
 
23
- def initialize(input_lines)
24
+ def initialize(input_lines, filespec = nil)
25
+ @filespec = filespec
24
26
  @accounts = []
25
- input_lines.each { |line| parse_line(line) }
27
+ parse_lines(input_lines)
26
28
  # TODO: Add validation for required fields.
29
+ check_for_missing_fields
30
+ end
31
+
27
32
 
33
+ def check_for_missing_fields
28
34
  missing_fields = REQUIRED_FIELDS.select do |field|
29
35
  instance_variable_get("@#{field}").nil?
30
36
  end
@@ -35,6 +41,19 @@ class ChartOfAccounts
35
41
  end
36
42
 
37
43
 
44
+ def parse_lines(input_lines)
45
+ input_lines.each_with_index do |line, line_num|
46
+ begin
47
+ parse_line(line)
48
+ rescue => e
49
+ file_message_fragment = (@filespec ? " in file '#{@filespec}'" : '')
50
+ puts "Error parsing chart of accounts#{file_message_fragment}. Bad line is line ##{line_num}, text is:\n#{line}\n\n"
51
+ raise
52
+ end
53
+ end
54
+ end
55
+
56
+
38
57
  def parse_date(date_string)
39
58
  # TODO: Add better handling for this error.
40
59
  # begin
@@ -69,16 +88,14 @@ class ChartOfAccounts
69
88
  rest = matcher[2]
70
89
 
71
90
  matcher = rest.match(/^(\S+)\s+(.*)$/)
91
+
72
92
  account_type_token = matcher[1]
73
- account_type = AccountType.to_type(account_type_token).symbol
93
+ account_type = AccountType.letter_to_type(account_type_token)
74
94
 
75
95
  name = matcher[2]
76
96
 
77
- accounts << Account.new(code, account_type, name)
97
+ accounts << Account.new(code, account_type.symbol, name)
78
98
  end
79
- rescue => e
80
- puts "Error parsing chart of accounts. Line text is:\n#{line}\n\n"
81
- raise
82
99
  end
83
100
 
84
101
  end
@@ -105,7 +122,7 @@ class ChartOfAccounts
105
122
 
106
123
 
107
124
  def report_string
108
- result = ''
125
+ result = StringIO.new
109
126
 
110
127
  if title
111
128
  result << title << "\n\n"
@@ -113,9 +130,9 @@ class ChartOfAccounts
113
130
 
114
131
  code_width = @accounts.inject(0) { |width, a| width = [width, a.code.length].max }
115
132
  format_string = "%-#{code_width}s %-10.10s %s\n"
116
- accounts.each { |a| result << (format_string % [a.code, a.type.to_s, a.name]) }
133
+ accounts.each { |a| result << sprintf(format_string, a.code, a.type.to_s, a.name) }
117
134
 
118
- result
135
+ result.string
119
136
  end
120
137
 
121
138