rock_books 0.4.0 → 0.7.1
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 +4 -4
- data/README.md +4 -2
- data/RELEASE_NOTES.md +33 -0
- data/assets/fonts/JetBrainsMono-Medium.ttf +0 -0
- data/lib/rock_books/cmd_line/command_line_interface.rb +6 -6
- data/lib/rock_books/cmd_line/main.rb +1 -9
- data/lib/rock_books/documents/book_set.rb +4 -136
- data/lib/rock_books/documents/chart_of_accounts.rb +29 -12
- data/lib/rock_books/documents/journal.rb +2 -6
- data/lib/rock_books/documents/journal_entry.rb +7 -2
- data/lib/rock_books/documents/journal_entry_builder.rb +4 -0
- data/lib/rock_books/helpers/book_set_loader.rb +3 -3
- data/lib/rock_books/reports/balance_sheet.rb +9 -43
- data/lib/rock_books/reports/book_set_reporter.rb +207 -0
- data/lib/rock_books/reports/data/bs_is_data.rb +61 -0
- data/lib/rock_books/reports/data/bs_is_section_data.rb +28 -0
- data/lib/rock_books/reports/data/journal_data.rb +37 -0
- data/lib/rock_books/reports/data/multidoc_txn_by_account_data.rb +40 -0
- data/lib/rock_books/reports/data/multidoc_txn_report_data.rb +39 -0
- data/lib/rock_books/reports/data/receipts_report_data.rb +47 -0
- data/lib/rock_books/reports/data/tx_one_account_data.rb +37 -0
- data/lib/rock_books/reports/helpers/erb_helper.rb +21 -0
- data/lib/rock_books/reports/helpers/html_report_helper.rb +35 -0
- data/lib/rock_books/reports/helpers/text_report_helper.rb +134 -0
- data/lib/rock_books/reports/income_statement.rb +9 -47
- data/lib/rock_books/reports/journal_report.rb +72 -0
- data/lib/rock_books/reports/multidoc_txn_by_account_report.rb +32 -0
- data/lib/rock_books/reports/multidoc_txn_report.rb +25 -0
- data/lib/rock_books/reports/receipts_report.rb +6 -55
- data/lib/rock_books/reports/templates/html/index.html.erb +141 -0
- data/lib/rock_books/reports/templates/html/report_page.html.erb +12 -0
- data/lib/rock_books/reports/templates/text/_receipt_section.txt.erb +17 -0
- data/lib/rock_books/reports/templates/text/_totals.txt.erb +8 -0
- data/lib/rock_books/reports/templates/text/balance_sheet.txt.erb +21 -0
- data/lib/rock_books/reports/templates/text/income_statement.txt.erb +21 -0
- data/lib/rock_books/reports/templates/text/journal.txt.erb +20 -0
- data/lib/rock_books/reports/templates/text/multidoc_txn_by_account_report.txt.erb +28 -0
- data/lib/rock_books/reports/templates/text/multidoc_txn_report.txt.erb +22 -0
- data/lib/rock_books/reports/templates/text/receipts_report.txt.erb +13 -0
- data/lib/rock_books/reports/templates/text/tx_one_account.txt.erb +18 -0
- data/lib/rock_books/reports/tx_one_account.rb +10 -45
- data/lib/rock_books/types/account.rb +13 -1
- data/lib/rock_books/types/account_type.rb +18 -7
- data/lib/rock_books/version.rb +1 -1
- data/rock_books.gemspec +5 -3
- metadata +64 -16
- data/lib/rock_books/documents/index.html.erb +0 -156
- data/lib/rock_books/documents/receipts.html.erb +0 -54
- data/lib/rock_books/reports/multidoc_transaction_report.rb +0 -66
- data/lib/rock_books/reports/reporter.rb +0 -118
- data/lib/rock_books/reports/transaction_report.rb +0 -105
- data/lib/rock_books/reports/tx_by_account.rb +0 -82
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative '../documents/chart_of_accounts'
|
2
|
+
require_relative 'helpers/erb_helper'
|
3
|
+
require_relative 'helpers/text_report_helper'
|
4
|
+
require_relative 'report_context'
|
5
|
+
require_relative 'data/multidoc_txn_by_account_data'
|
6
|
+
|
7
|
+
module RockBooks
|
8
|
+
|
9
|
+
class MultidocTransactionByAccountReport
|
10
|
+
|
11
|
+
include TextReportHelper
|
12
|
+
include ErbHelper
|
13
|
+
|
14
|
+
attr_reader :context, :data
|
15
|
+
|
16
|
+
|
17
|
+
def initialize(data, report_context)
|
18
|
+
@data = data
|
19
|
+
@context = report_context
|
20
|
+
end
|
21
|
+
|
22
|
+
def account_total_line(account_code, account_total)
|
23
|
+
account_name = context.chart_of_accounts.name_for_code(account_code)
|
24
|
+
sprintf("%.2f Total for account: %s - %s", account_total, account_code, account_name)
|
25
|
+
end
|
26
|
+
|
27
|
+
def generate
|
28
|
+
presentation_context = template_presentation_context.merge({ fn_account_total_line: method(:account_total_line) })
|
29
|
+
ErbHelper.render_hashes('text/multidoc_txn_by_account_report.txt.erb', data, presentation_context)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'data/multidoc_txn_report_data'
|
2
|
+
require_relative '../documents/journal'
|
3
|
+
require_relative 'helpers/erb_helper'
|
4
|
+
require_relative 'helpers/text_report_helper'
|
5
|
+
require_relative 'report_context'
|
6
|
+
|
7
|
+
module RockBooks
|
8
|
+
|
9
|
+
class MultidocTransactionReport
|
10
|
+
|
11
|
+
include TextReportHelper
|
12
|
+
include ErbHelper
|
13
|
+
|
14
|
+
attr_reader :context, :data
|
15
|
+
|
16
|
+
def initialize(report_data, report_context)
|
17
|
+
@data = report_data
|
18
|
+
@context = report_context
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate
|
22
|
+
ErbHelper.render_hashes('text/multidoc_txn_report.txt.erb', data, template_presentation_context)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -4,67 +4,18 @@ require_relative 'report_context'
|
|
4
4
|
module RockBooks
|
5
5
|
class ReceiptsReport
|
6
6
|
|
7
|
-
include
|
7
|
+
include TextReportHelper
|
8
8
|
|
9
|
-
attr_reader :context, :
|
9
|
+
attr_reader :context, :data
|
10
10
|
|
11
|
-
|
12
|
-
def initialize(report_context, missing, existing, unused)
|
11
|
+
def initialize(report_context, data)
|
13
12
|
@context = report_context
|
14
|
-
@
|
15
|
-
@existing = existing
|
16
|
-
@unused = unused
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
def generate_header
|
21
|
-
lines = [banner_line]
|
22
|
-
lines << center(context.entity || 'Unspecified Entity')
|
23
|
-
lines << "#{center("Receipts Report")}"
|
24
|
-
lines << banner_line
|
25
|
-
lines.join("\n")
|
26
|
-
end
|
27
|
-
|
28
|
-
|
29
|
-
def receipt_info_line(info)
|
30
|
-
"%-16.16s %s\n" % [info[:journal], info[:receipt]]
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
def column_headings
|
35
|
-
format_string = "%-16.16s %s\n"
|
36
|
-
(format_string % ['Journal', 'Receipt Filespec']) << (format_string % %w(------- ----------------)) << "\n"
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
|
-
def report_one_section(name, list)
|
41
|
-
output = ''
|
42
|
-
output << "\n\n\n#{name} Receipts:\n\n" << column_headings
|
43
|
-
if list.empty?
|
44
|
-
output << "[None]\n\n\n"
|
45
|
-
else
|
46
|
-
list.each { |receipt| output << receipt_info_line(receipt) }
|
47
|
-
end
|
48
|
-
output
|
13
|
+
@data = data
|
49
14
|
end
|
50
15
|
|
51
16
|
|
52
|
-
def
|
53
|
-
|
54
|
-
output << report_one_section('Missing', missing)
|
55
|
-
|
56
|
-
output << "\n\n\nUnused Receipts:\n\n"
|
57
|
-
if unused.empty?
|
58
|
-
output << "[None]\n\n\n"
|
59
|
-
else
|
60
|
-
unused.each { |filespec| output << filespec << "\n" }
|
61
|
-
end
|
62
|
-
|
63
|
-
output << report_one_section('Existing', existing)
|
64
|
-
output
|
17
|
+
def generate
|
18
|
+
ErbHelper.render_hashes('text/receipts_report.txt.erb', data, template_presentation_context)
|
65
19
|
end
|
66
|
-
|
67
|
-
alias_method :to_s, :generate_report
|
68
|
-
alias_method :call, :generate_report
|
69
20
|
end
|
70
21
|
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
|
5
|
+
<meta charset="utf-8">
|
6
|
+
|
7
|
+
<!--Bootstrap:-->
|
8
|
+
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
|
9
|
+
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
10
|
+
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
|
11
|
+
|
12
|
+
<style>
|
13
|
+
body {
|
14
|
+
padding: 36px;
|
15
|
+
background-color: #88c1f7;
|
16
|
+
color: #01182d;
|
17
|
+
}
|
18
|
+
|
19
|
+
h2 {
|
20
|
+
margin-top: 32px;
|
21
|
+
margin-bottom: 12px;
|
22
|
+
}
|
23
|
+
|
24
|
+
.this_page_style {
|
25
|
+
background-color: #88c1f7;
|
26
|
+
color: #01182d;
|
27
|
+
border: 0px;
|
28
|
+
}
|
29
|
+
</style>
|
30
|
+
</head>
|
31
|
+
|
32
|
+
<body>
|
33
|
+
|
34
|
+
<h1><%= chart_of_accounts.entity %></h1>
|
35
|
+
<p class="muted">Reports Generated at <%= DateTime.now.strftime('%Y-%m-%d %H:%M:%S') %> by RockBooks version <%=RockBooks::VERSION %></p>
|
36
|
+
|
37
|
+
<h2>Financial Statements</h2>
|
38
|
+
<div id="financial-statements">
|
39
|
+
<a href='balance_sheet.html' class="btn btn-primary">Balance Sheet</a>
|
40
|
+
<a href='income_statement.html' class="btn btn-primary">Income Statement</a>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
|
44
|
+
<h2>Supporting Documents</h2>
|
45
|
+
<div id="supporting-documents" style="display: inline ">
|
46
|
+
<%
|
47
|
+
subdir_link = ->(name, caption) do
|
48
|
+
dir_name = File.expand_path(File.join(Dir.pwd, name))
|
49
|
+
if Dir.exist?(dir_name)
|
50
|
+
%Q{<a href=#{dir_name} class="btn btn-primary">#{caption}</a>}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
%>
|
54
|
+
<%= subdir_link.('invoices', 'Invoices') %>
|
55
|
+
<%= subdir_link.('receipts', 'Receipts') %>
|
56
|
+
<%= subdir_link.('statements', 'Statements') %>
|
57
|
+
<%= subdir_link.('worksheets', 'Worksheets') %>
|
58
|
+
</div>
|
59
|
+
|
60
|
+
|
61
|
+
<h2>All Transactions Reports</h2>
|
62
|
+
<div id="all-transactions">
|
63
|
+
<a href="all_txns_by_acct.html" class="btn btn-primary">By Account</a>
|
64
|
+
<a href="all_txns_by_amount.html" class="btn btn-primary">By Amount</a>
|
65
|
+
<a href="all_txns_by_date.html" class="btn btn-primary">By Date</a>
|
66
|
+
</div>
|
67
|
+
|
68
|
+
<% collapsible_heading = ->(caption, href) do %Q{
|
69
|
+
<br /><br />
|
70
|
+
<div class="collapsible-heading">
|
71
|
+
<div class="container-fluid">
|
72
|
+
<div class="row">
|
73
|
+
|
74
|
+
<div class="col-sm2" style="margin-right: 12px;">
|
75
|
+
<a class="btn btn-primary" data-toggle="collapse" href="#{href}" role="button" aria-expanded="false" aria-controls="collapseExample">
|
76
|
+
+/-
|
77
|
+
</a>
|
78
|
+
</div>
|
79
|
+
|
80
|
+
<div class="col-sm10">
|
81
|
+
<h2 style="margin: 0px;">#{caption}</h2>
|
82
|
+
</div>
|
83
|
+
</div>
|
84
|
+
</div>
|
85
|
+
</div>
|
86
|
+
} end %>
|
87
|
+
|
88
|
+
<%= collapsible_heading.('Journal Reports', '#journal-reports') %>
|
89
|
+
|
90
|
+
<div class="collapse" id="journal-reports">
|
91
|
+
<div class="card card-body this_page_style">
|
92
|
+
<ul>
|
93
|
+
<% journals.each do |journal|
|
94
|
+
filespec = journal.short_name + '.html' %>
|
95
|
+
<li><a href="<%= filespec %>" class="this_page_style"><%= journal.title %></a></li>
|
96
|
+
<% end %>
|
97
|
+
</ul>
|
98
|
+
</div>
|
99
|
+
</div>
|
100
|
+
|
101
|
+
<%= collapsible_heading.('Individual Accounts', '#individual-accounts') %>
|
102
|
+
|
103
|
+
<div class="collapse" id="individual-accounts">
|
104
|
+
<div class="card card-body this_page_style">
|
105
|
+
<ul>
|
106
|
+
<%
|
107
|
+
chart_of_accounts.accounts.each do |account|
|
108
|
+
filespec = File.join('single-account', "acct_#{account.code}.html")
|
109
|
+
caption = "#{account.name} (#{account.code})"
|
110
|
+
%>
|
111
|
+
<li><a href="<%= filespec %>" class="this_page_style"><%= caption %></a></li>
|
112
|
+
<% end %>
|
113
|
+
</ul>
|
114
|
+
</div>
|
115
|
+
</div>
|
116
|
+
|
117
|
+
<%= collapsible_heading.('Other', '#other') %>
|
118
|
+
|
119
|
+
<div class="collapse" id="other">
|
120
|
+
<div class="card card-body this_page_style">
|
121
|
+
<ul>
|
122
|
+
<% if run_options.do_receipts %>
|
123
|
+
<li><a href="receipts.html" class="this_page_style">Missing and Existing Receipts</a></li>
|
124
|
+
<% end %>
|
125
|
+
</ul>
|
126
|
+
</div>
|
127
|
+
</div>
|
128
|
+
|
129
|
+
<%= collapsible_heading.('Reports in PDF and Text Formats', '#other-formats') %>
|
130
|
+
|
131
|
+
<div class="collapse" id="other-formats">
|
132
|
+
<div class="card card-body this_page_style">
|
133
|
+
<ul>
|
134
|
+
<li><a href="../pdf" class="this_page_style">PDF Format</a></li>
|
135
|
+
<li><a href="../txt" class="this_page_style">Text Format</a></li>
|
136
|
+
</ul>
|
137
|
+
</div>
|
138
|
+
</div>
|
139
|
+
|
140
|
+
</body>
|
141
|
+
</html>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<% receipt_info_line = ->(info) { sprintf("%-16.16s %s", info[:journal], info[:receipt]) } -%>
|
2
|
+
<% format_heading_line = ->(str1, str2) { sprintf("%-16.16s %s", str1, str2) } -%>
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
<%= name %> Receipts:
|
7
|
+
|
8
|
+
<%= format_heading_line.('Journal', 'Receipt Filespec') %>
|
9
|
+
<%= format_heading_line.('-------', '----------------') %>
|
10
|
+
|
11
|
+
<% if list.empty? -%>
|
12
|
+
[None]
|
13
|
+
<% else -%>
|
14
|
+
<% list.each do |receipt| -%>
|
15
|
+
<%= receipt_info_line.(receipt) %>
|
16
|
+
<% end -%>
|
17
|
+
<% end -%>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%= banner_line %>
|
2
|
+
<%= fn_center.(entity || 'Unspecified Entity') %>
|
3
|
+
<%= fn_center.("Balance Sheet for Period Ending #{end_date}") %>
|
4
|
+
<%= banner_line %>
|
5
|
+
|
6
|
+
<% %i(asset liability equity).each do |section_type| -%>
|
7
|
+
<%= fn_section_heading.(section_type) %>
|
8
|
+
|
9
|
+
<% section_data = sections[section_type] -%>
|
10
|
+
<% section_data[:acct_totals].each do |code, amount| -%>
|
11
|
+
<%= line_item_format_string % [amount, code, fn_acct_name.(code)] %>
|
12
|
+
<% end -%>
|
13
|
+
------------
|
14
|
+
<%= sprintf(line_item_format_string, section_data[:total], '', '') %>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
|
18
|
+
Assets - (Liabilities + Equity)
|
19
|
+
|
20
|
+
<%= fn_total_with_ok_or_discrepancy.(grand_total) %>
|
21
|
+
============
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%= banner_line %>
|
2
|
+
<%= fn_center.(entity || 'Unspecified Entity') %>
|
3
|
+
<%= fn_center.("Income Statement -- #{start_date} to #{end_date}") %>
|
4
|
+
<%= banner_line %>
|
5
|
+
|
6
|
+
<% %i(income expense).each do |section_type| -%>
|
7
|
+
<%= fn_section_heading.(section_type) %>
|
8
|
+
|
9
|
+
<% section_data = sections[section_type] -%>
|
10
|
+
<% section_data[:acct_totals].each do |code, amount| -%>
|
11
|
+
<%= line_item_format_string % [amount, code, fn_acct_name.(code)] %>
|
12
|
+
<% end -%>
|
13
|
+
------------
|
14
|
+
<%= sprintf(line_item_format_string, section_data[:total], '', '') %>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
|
18
|
+
Net Income
|
19
|
+
|
20
|
+
<%= sprintf(line_item_format_string, net_income, '', '') %>
|
21
|
+
============
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%= banner_line %>
|
2
|
+
<%= fn_center.(entity || 'Unspecified Entity') %>
|
3
|
+
<%= fn_center.(title) %>
|
4
|
+
<% if code && name -%>
|
5
|
+
<%= fn_center.("Account: #{name} (#{code})") %>
|
6
|
+
<% end -%>
|
7
|
+
<% if short_name -%>
|
8
|
+
<%= fn_center.("Journal Short Name: #{short_name}") %>
|
9
|
+
<% end -%>
|
10
|
+
<%= fn_center.("#{start_date} to #{end_date}"
|
11
|
+
) %>
|
12
|
+
<%= banner_line %>
|
13
|
+
|
14
|
+
|
15
|
+
<% entries.each do |entry| -%>
|
16
|
+
<%= fn_format_entry.(entry) %>
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<%= fn_erb_render_binding.('text/_totals.txt.erb', binding) %>
|
20
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<%= banner_line %>
|
2
|
+
<%= fn_center.(entity || 'Unspecified Entity') %>
|
3
|
+
<%= fn_center.('Multi Document Transaction Report by Account') %>
|
4
|
+
|
5
|
+
<%= fn_center.('Source Documents') %>
|
6
|
+
|
7
|
+
<% journals.each do |journal| -%>
|
8
|
+
<% short_name = sprintf(short_name_format_string, journal.short_name) -%>
|
9
|
+
<%= fn_center.("#{short_name} -- #{journal.title}") %>
|
10
|
+
<% end -%>
|
11
|
+
<%= banner_line %>
|
12
|
+
|
13
|
+
<% acct_sections.each do |acct| %>
|
14
|
+
|
15
|
+
|
16
|
+
<%= banner_line %>
|
17
|
+
<% total_string = "%.2f" % acct[:total] -%>
|
18
|
+
<%= fn_center.("Total: #{total_string} -- #{fn_account_code_name_type_string_for_code.(acct[:code])}") %>
|
19
|
+
<%= banner_line %>
|
20
|
+
|
21
|
+
<% acct[:entries].each do |entry| -%>
|
22
|
+
<%= fn_format_multidoc_entry.(entry) %>
|
23
|
+
<% end %>
|
24
|
+
<%= fn_account_total_line.(acct[:code], acct[:total]) %>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
|
28
|
+
<%= fn_erb_render_binding.('text/_totals.txt.erb', binding) %>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%= banner_line %>
|
2
|
+
<%= fn_center.(entity || 'Unspecified Entity') %>
|
3
|
+
<%= fn_center.('Multi Document Transaction Report') %>
|
4
|
+
|
5
|
+
<%= fn_center.('Source Documents') %>
|
6
|
+
|
7
|
+
<% journals.each do |journal| -%>
|
8
|
+
<% short_name = sprintf(short_name_format_string, journal.short_name) -%>
|
9
|
+
<%= fn_center.("#{short_name} -- #{journal.title}") %>
|
10
|
+
<% end -%>
|
11
|
+
<%= banner_line %>
|
12
|
+
|
13
|
+
|
14
|
+
Date Document Amount Account
|
15
|
+
---- -------- ------ -------
|
16
|
+
|
17
|
+
<% entries.each do |entry| -%>
|
18
|
+
<%= fn_format_multidoc_entry.(entry) %>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
|
22
|
+
<%= fn_erb_render_binding.('text/_totals.txt.erb', binding) %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<% create_section = ->(name, list) do
|
2
|
+
fn_erb_render_hashes.('text/_receipt_section.txt.erb', { name: name, list: list }, {})
|
3
|
+
end -%>
|
4
|
+
<%= banner_line %>
|
5
|
+
<%= fn_center.(entity || 'Unspecified Entity') %>
|
6
|
+
<%= fn_center.('Receipts Report') %>
|
7
|
+
<%= banner_line %>
|
8
|
+
|
9
|
+
<% # Unlike existing and missing, which arrays of hashes with keys :receipt and :journal, unused is an array of receipt filespecs %>
|
10
|
+
|
11
|
+
<%= create_section.('Missing', missing) %>
|
12
|
+
<%= create_section.('Unused', unused.map { |receipt| { receipt: receipt, journal: nil } }) %>
|
13
|
+
<%= create_section.('Existing', existing) %>
|