treasurer 0.8.0 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 35303062ab1213c78219bc4cee48f130315b8622
4
- data.tar.gz: 3154086ac7c046ed468f065f0dd8157066335741
3
+ metadata.gz: 75e0d7fbb9f8e3d3e7257b32b95d02551c86d734
4
+ data.tar.gz: acfd855c6aba173967f3ac4ad2f5f834f6d72686
5
5
  SHA512:
6
- metadata.gz: '0709aac9aa7adfbd5f02e47df4ffa830b05f51e0f48e45ba9b26b3db90cdf593c2b80c220f8fe410783b7283916d084b95c8703491a0aff6572d77717957fa1f'
7
- data.tar.gz: 2ce89966f7b2b7cec7c9b3a47dcda0eeed7cfe6a4584ce7e77d213dd6144a52056c934147d81a4d55dde60b7d936c6c2cbb426fe6749b15e928789c17428d6e8
6
+ metadata.gz: d8bd30fa88d03684297b4cc00432d2ee64efcd130bdd0bc4efcf964275acc1cc6fccef878c7e711f6675bb16253eaa5044f4631a43f1dc0508c1cb682c7a478d
7
+ data.tar.gz: 65914ce5e0540c566aad1d9b8dab06fd8ce2e672789a8472ac70a9fc5dbd27da54c13b84b5631fc2e75278456e3724fb44e77870bee5bffda7981f4f95a66682
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.0
1
+ 0.9.0
@@ -96,7 +96,7 @@ class Treasurer::Reporter
96
96
  :Expense
97
97
  end
98
98
  end
99
- def red_line(date)
99
+ def red_line(date=@reporter.today)
100
100
  if Treasurer::LocalCustomisations.instance_methods.include? :red_line
101
101
  val = super(name, date)
102
102
  if rc = @reporter.report_currency and rc != @original_currency
@@ -121,6 +121,18 @@ class Treasurer::Reporter
121
121
  def has_balance?
122
122
  not @runs.find{|r| not r.has_balance?}
123
123
  end
124
+ def available(date = @reporter.today)
125
+ case type
126
+ when :Asset, :Equity
127
+ b = balance
128
+ b - red_line
129
+ when :Liability
130
+ b = balance
131
+ red_line - b
132
+ else
133
+ nil
134
+ end
135
+ end
124
136
  def balance(date = @reporter.today, options={})
125
137
  @balance_cache ||= {}
126
138
  if b = @balance_cache[[date,options]]
@@ -316,9 +328,19 @@ EOF
316
328
  kit.data[4].gp.with = "l lw 5 dt 2 lc rgb 'black' "
317
329
  kit.gp.key = ' bottom left '
318
330
  kit.gp.key = ' rmargin samplen 2'
331
+ kit.gp.decimalsign = 'locale "en_GB.UTF-8"'
332
+
333
+ #bal, avail = balance, available
334
+
335
+ if avail = available
336
+ kit.gp.label = [
337
+ %[ "Balance \\n#{balance}\\n\\nAvailable\\n#{avail}" at screen 0.95, screen 0.5 right],
338
+ ]
339
+ end
319
340
 
320
341
  #(p kit; STDIN.gets) if name == :LloydsCreditCard
321
342
  CodeRunner::Budget.kit_time_format_x(kit)
343
+ kit.gp.format.push %[y "%'.2f"]
322
344
  size = case type
323
345
  when :Equity
324
346
  "4.0in,4.0in"
@@ -327,8 +349,9 @@ EOF
327
349
  end
328
350
 
329
351
  fork do
330
- (kit).gnuplot_write("#{name_c_file}_balance.eps", size: size) #, latex: true)
331
- %x[epstopdf #{name_c_file}_balance.eps]
352
+ (kit).gnuplot_write("#{name_c_file}_balance2.eps", size: size) #, latex: true)
353
+ system %[ps2epsi #{name_c_file}_balance2.eps #{name_c_file}_balance.eps]
354
+ system %[epstopdf #{name_c_file}_balance.eps]
332
355
  end
333
356
  #%x[epstopdf #{name}_balance.eps]
334
357
  end
@@ -356,7 +379,7 @@ EOF
356
379
  def name
357
380
  :Equity
358
381
  end
359
- def red_line(date)
382
+ def red_line(date=@reporter.today)
360
383
  @accounts.map{|acc|
361
384
  case acc.type
362
385
  when :Asset
@@ -188,6 +188,7 @@ class Treasurer
188
188
  currency_list.each do |currency|
189
189
  report << discretionary_account_table(currency)
190
190
  end
191
+ report << available_balances_table
191
192
  report << account_balance_graphs
192
193
  report << expense_account_summary
193
194
  report << account_expenditure_graphs
@@ -200,7 +201,7 @@ class Treasurer
200
201
  report << footer
201
202
 
202
203
  File.open('report.tex', 'w'){|f| f.puts report}
203
- Process.wait
204
+ Process.waitall
204
205
  system "lualatex report.tex && lualatex report.tex"
205
206
  end
206
207
  def account_summaries
@@ -240,11 +241,10 @@ EOF
240
241
  end
241
242
  def expense_account_summary
242
243
  <<EOF
243
- \\section{Expense and Income Summary}
244
- \\subsection{Totals for #@days_before-day Budget Period}
245
- \\subsection{Expense}
244
+ \\section{Expense and Income Details}
245
+ \\subsection{Expense totals for #@days_before-day Budget Period}
246
246
  #{expense_pie_charts_by_currency('accountperiod_expense', @expense_accounts){|r| r.days_ago(@today) < @days_before}}
247
- \\subsection{Income}
247
+ \\subsection{Income totals for #@days_before-day Budget Period}
248
248
  #{expense_pie_charts_by_currency('accountperiod_income', @accounts.find_all{|acc| acc.type==:Income}){|r| r.days_ago(@today) < @days_before}}
249
249
  \\subsection{Expense Account Breakdown}
250
250
  #{@expense_accounts.find_all{|exaccount| exaccount.should_report?}.map{|exaccount|
@@ -343,13 +343,20 @@ EOF
343
343
  kit.gp.grid = "ytics mytics lw 2,lw 1"
344
344
  kit.xlabel = nil
345
345
  kit.ylabel = nil
346
+ kit.gp.decimalsign = 'locale "en_GB.UTF-8"'
347
+ kit.gp.format = [%["%'.2f"]]
346
348
  i = -1
347
349
  kit.gp.xtics = "(#{labels.map{|l| %["#{l}" #{i+=1}]}.join(', ')}) rotate by 90 right"
348
350
  pp ['kit222', kit, labels]
349
351
  fork do
350
352
 
351
353
  kit.gp.key = "off"
352
- kit.gnuplot_write("#{name}.eps", size: "#{[[labels.size.to_f/4.5, 4.5].min, 1.0].max}in,4.5in")
354
+ kit.gnuplot_write("#{name}2.eps", size: "#{[[labels.size.to_f/4.5, 4.5].min, 1.0].max}in,4.5in")
355
+ system %[ps2epsi #{name}2.eps #{name}.eps]
356
+ system %[epstopdf #{name}.eps]
357
+
358
+ end
359
+ fork do
353
360
  kit.gp.key = "tmargin"
354
361
  kit.gp.border = "unset"
355
362
  kit.gp.xtics = "unset"
@@ -363,13 +370,13 @@ EOF
363
370
  #kit.gp.style = "fill empty noborder"
364
371
  #kit.gp.yrange = "[-10:10]"
365
372
  kit.gnuplot_write("#{name}_key.eps", size: "4.0in,1.5in")
366
- %x[convert -density 500 #{name}_key.eps -resize 4000 -bordercolor white -border 20x20 -background white -flatten -trim +repage #{name}_key.pdf]
373
+ system %[convert -density 500 #{name}_key.eps -resize 4000 -bordercolor white -border 20x20 -background white -flatten -trim +repage #{name}_key.pdf]
367
374
  #%x[convert -density 500 #{name}.eps -resize 4000 -bordercolor white -border 20x20 -background white -flatten -trim +repage #{name}.pdf]
368
375
  end
369
376
 
370
377
  #"\\begin{center}\\includegraphics[width=3.0in]{#{name}.eps}\\vspace{1em}\\end{center}"
371
378
  #"\\begin{center}\\includegraphics[width=0.9\\textwidth]{#{name}.eps}\\vspace{1em}\\end{center}"
372
- "\\myfigurerot{#{name}.eps}{#{name}_key.pdf}{270}"
379
+ "\\myfigurerot{#{name}.pdf}{#{name}_key.pdf}{270}"
373
380
  end
374
381
  def get_in_limit_discretionary_account_factor(currency)
375
382
  @projected_account_factor = 1.0
@@ -421,17 +428,48 @@ EOF
421
428
  \\section{Discretionary Budget Summary (#{currency})}
422
429
  \\begin{tabulary}{0.9\\textwidth}{ R | r r r r }
423
430
  Budget & Average & Projection & Limit & Stable \\\\
424
- #{tls = [0.0, 0.0, 0.0, 0.0]
431
+ \\hline\\Tstrut
432
+ #{rows =
425
433
  discretionary_accounts.map{|account, info|
426
- #ep info
427
- "#{account.name_c} & #{(tls[0]+=account.average).to_tex} & #{(tls[1]+=account.projection).to_tex} & #{
428
- (tls[2]+=account.projection * @in_limit_discretionary_account_factors[currency]).to_tex} &
429
- #{(tls[3]+=account.projection * @stable_discretionary_account_factors[currency]).to_tex} \\\\"
430
- }.join("\n\n")
434
+ [
435
+ account.name_c,
436
+ account.average,
437
+ account.projection,
438
+ account.projection * @in_limit_discretionary_account_factors[currency],
439
+ account.projection * @stable_discretionary_account_factors[currency]
440
+ ]
441
+ }
442
+ tls = rows.transpose.slice(1..4).map{|vals| vals.sum}
443
+ rows.map{|dat|
444
+ "#{dat[0]} & #{dat[1].to_tex} & #{dat[2].to_tex} & #{dat[3].to_tex} & #{dat[4].to_tex} \\\\"
445
+ }.join("\n\n")
431
446
  }
432
- \\\\
433
- \\hline
447
+ #{if @report_currency
448
+ "
449
+ \\hline\\Tstrut
434
450
  Totals & #{tls.map{|v| v.to_tex}.join(" & ")}
451
+ "
452
+ end
453
+ }
454
+ \\end{tabulary}
455
+ EOF
456
+ end
457
+
458
+ # A table showing the available balance for each kind of account,
459
+ # being the amount that can be spent today.
460
+ def available_balances_table
461
+ <<EOF
462
+ \\section{Available Balances}
463
+ \\begin{tabulary}{0.9\\textwidth}{R | r r c}
464
+ Account & Balance & Available & Type\\\\
465
+ \\hline\\Tstrut
466
+ #{
467
+ [:Equity, :Asset, :Liability].map{|type|
468
+ @accounts.find_all{|acc| acc.type == type}.map{|acc|
469
+ [acc.name_c, acc.balance(@today).to_tex, acc.available(@today).to_tex, type.to_s].join(" & ")
470
+ }.join("\\\\ \n")
471
+ }.join("\\\\ \n\n")
472
+ }
435
473
  \\end{tabulary}
436
474
  EOF
437
475
  end
@@ -491,10 +529,13 @@ EOF
491
529
  end
492
530
  kit.title = "#{account.name_c} Expenditure with average (Total = #{kit.data[0].y.data.sum})"
493
531
  CodeRunner::Budget.kit_time_format_x(kit)
532
+ kit.gp.decimalsign = 'locale "en_GB.UTF-8"'
533
+ kit.gp.format.push %[y "%'.2f"]
494
534
  #kit.gnuplot
495
535
  #ep ['kit1122', account, kit]
496
536
  fork do
497
- kit.gnuplot_write("#{account.name_c_file}.eps", size: "4.0in,2.0in")
537
+ kit.gnuplot_write("#{account.name_c_file}2.eps", size: "4.0in,2.0in")
538
+ system "ps2epsi #{account.name_c_file}2.eps #{account.name_c_file}.eps"
498
539
  exec "epstopdf #{account.name_c_file}.eps"
499
540
  end
500
541
  #%x[ps2eps #{account}.ps]
@@ -612,7 +653,7 @@ EOF
612
653
  \\section{Recent Transactions}
613
654
  #{@accounts.find_all{|acc| not acc.type == :Equity}.sort_by{|acc| acc.external ? 0 : 1}.map{|acc|
614
655
  "\\subsection{#{acc.name_c}}
615
- \\tiny
656
+ \\transactionsize
616
657
  #{all = acc.runs.find_all{|r| r.days_ago(@today) < @days_before}
617
658
  case acc.type
618
659
  when :Expense, :Income
@@ -621,7 +662,7 @@ EOF
621
662
  all = all.sort_by{|r| [r.date, r.id]}.reverse
622
663
  end
623
664
  #ep ['acc', acc, 'ids', all.map{|r| r.id}, 'size', all.size]
624
- all.pieces((all.size.to_f/50.to_f).ceil).map{|piece|
665
+ all.pieces((all.size.to_f/60.to_f).ceil).map{|piece|
625
666
  "\\setlength{\\parindent}{0cm}\n\n\\begin{tabulary}{0.99\\textwidth}{ #{"c " * 3 + " l " + " r " * 3 + "l"}}
626
667
  #{piece.map{|r|
627
668
  (CodeRunner::Budget.rcp.component_results - [:sc] + [:sub_account]).map{|res|
@@ -650,7 +691,13 @@ EOF
650
691
  \\usepackage{graphicx}
651
692
  \\usepackage{multicol}
652
693
  \\usepackage{hyperref}
653
- \\usepackage{libertine}
694
+ %\\usepackage{libertine}
695
+ %\\usepackage{helvetica}
696
+ \\usepackage{fontspec}
697
+ \\setmainfont[
698
+ BoldFont={Linux Biolinum O Bold},
699
+ BoldItalicFont={Linux Biolinum O Bold},
700
+ ]{Linux Biolinum O}
654
701
  \\usepackage{xcolor,listings}
655
702
  \\usepackage{epstopdf}
656
703
  \\newcommand\\Tstrut{\\rule{0pt}{2.8ex}}
@@ -672,12 +719,13 @@ EOF
672
719
  \\end{center}\\vspace*{0em}
673
720
 
674
721
  }
722
+ \\newcommand{\\transactionsize}{\\scriptsize}
675
723
  \\lstset{%
676
724
  basicstyle=\\ttfamily\\color{black},
677
725
  identifierstyle = \\ttfamily\\color{purple},
678
726
  keywordstyle=\\ttfamily\\color{blue},
679
727
  stringstyle=\\color{orange}}
680
- \\usepackage[compact]{titlesec}
728
+ \\usepackage[bf,compact]{titlesec}
681
729
  %\\titlespacing{\\section}{0pt}{*0}{*0}
682
730
  %\\titlespacing{\\subsection}{0pt}{*0}{*2}
683
731
  %\\titlespacing{\\subsubsection}{0pt}{*0}{*0}
data/treasurer.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: treasurer 0.8.0 ruby lib
5
+ # stub: treasurer 0.9.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "treasurer".freeze
9
- s.version = "0.8.0"
9
+ s.version = "0.9.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Edmund Highcock".freeze]
14
- s.date = "2018-04-06"
14
+ s.date = "2018-04-09"
15
15
  s.description = "A simple command line tool for managing accounts and finances. Easily import internet banking spreadsheets and generate sophisticated reports and projections.".freeze
16
16
  s.email = "edmundhighcock@users.sourceforge.net".freeze
17
17
  s.executables = ["treasurer".freeze]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: treasurer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edmund Highcock
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-06 00:00:00.000000000 Z
11
+ date: 2018-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport