treasurer 0.7.0 → 0.8.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: d2048cb90864a5b22bc6bb26e1d226040caeb731
4
- data.tar.gz: 340e5a5daf1026576358fc596ce9894566fac808
3
+ metadata.gz: 35303062ab1213c78219bc4cee48f130315b8622
4
+ data.tar.gz: 3154086ac7c046ed468f065f0dd8157066335741
5
5
  SHA512:
6
- metadata.gz: c0ac2576887308f53d2e3f72f3e73ece698785c4798d0ae2d8a14a1f114670eb7b44f18462742cab5b7b97c634a20ce71a7cc600d4f816d47d75859e44c1b511
7
- data.tar.gz: cc2da7e7611fc6cf38502565a2b3721e64c45084627e2adb6bb7df043060af09f377a314e24683591284820aaac63eef9d611f018a676c4006db755d927f608f
6
+ metadata.gz: '0709aac9aa7adfbd5f02e47df4ffa830b05f51e0f48e45ba9b26b3db90cdf593c2b80c220f8fe410783b7283916d084b95c8703491a0aff6572d77717957fa1f'
7
+ data.tar.gz: 2ce89966f7b2b7cec7c9b3a47dcda0eeed7cfe6a4584ce7e77d213dd6144a52056c934147d81a4d55dde60b7d936c6c2cbb426fe6749b15e928789c17428d6e8
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.8.0
@@ -99,8 +99,9 @@ class Treasurer::Reporter
99
99
  def red_line(date)
100
100
  if Treasurer::LocalCustomisations.instance_methods.include? :red_line
101
101
  val = super(name, date)
102
- if rc = @report_currency
102
+ if rc = @reporter.report_currency and rc != @original_currency
103
103
  er = EXCHANGE_RATES[[@original_currency,rc]]
104
+ #p ['AAAAAAA', name, @original_currency, er, val, rc]
104
105
  val *= er
105
106
  end
106
107
  val
@@ -120,10 +121,15 @@ class Treasurer::Reporter
120
121
  def has_balance?
121
122
  not @runs.find{|r| not r.has_balance?}
122
123
  end
123
- def balance(date = @reporter.today)
124
+ def balance(date = @reporter.today, options={})
125
+ @balance_cache ||= {}
126
+ if b = @balance_cache[[date,options]]
127
+ return b
128
+ end
124
129
  date_i = date.to_datetime.to_time.to_i
125
130
  #if !date
126
131
  #@runs.sort_by{|r| r.date}[-1].balance
132
+ balance = nil
127
133
  if @external or not has_balance?
128
134
  #p ['name is ', name, type]
129
135
  #
@@ -140,8 +146,13 @@ class Treasurer::Reporter
140
146
  else
141
147
  #p ['name33 is ', name, type, @runs.size, @currency]
142
148
  nearest_time = @runs.map{|r| (r.date_i - date_i).to_f.abs}.sort[0]
143
- @runs.find_all{|r| (r.date_i - date_i).to_f.abs == nearest_time}.sort_by{|r| r.id}[-1].balance
149
+ balance = @runs.find_all{|r| (r.date_i - date_i).to_f.abs == nearest_time}.sort_by{|r| r.id}[-1].balance
150
+ end
151
+ if options[:original_currency] and @original_currency and @original_currency!=currency
152
+ balance = balance*EXCHANGE_RATES[[currency, @original_currency]]
144
153
  end
154
+ @balance_cache[[date,options]]=balance
155
+ balance
145
156
  end
146
157
  def deposited(today, days_before, &block)
147
158
  p ['name223344 is ', name_c, today, days_before]
@@ -284,7 +295,7 @@ EOF
284
295
  #exit
285
296
  @reporter.projected_account_factor = nil
286
297
  kit += ( kit4 + kit5 + kit2)
287
- kit.yrange = [(m = kit.data.map{|dk| dk.y.data.min}.min; m-m.abs*0.1), (m=kit.data.map{|dk| dk.y.data.max}.max; m+m.abs*0.1)]
298
+ #kit.yrange = [(m = kit.data.map{|dk| dk.y.data.min}.min; m-m.abs*0.1), (m=kit.data.map{|dk| dk.y.data.max}.max; m+m.abs*0.1)]
288
299
  #kit += (kit2)
289
300
  kit = kit3 + kit
290
301
  kit.title = "Balance for #{name_c}"
@@ -317,9 +328,9 @@ EOF
317
328
 
318
329
  fork do
319
330
  (kit).gnuplot_write("#{name_c_file}_balance.eps", size: size) #, latex: true)
320
- %x[epspdf -b #{name_c_file}_balance.eps]
331
+ %x[epstopdf #{name_c_file}_balance.eps]
321
332
  end
322
- #%x[epspdf #{name}_balance.eps]
333
+ #%x[epstopdf #{name}_balance.eps]
323
334
  end
324
335
  # A string to include the balance graph in the document
325
336
  def balance_graph_string
@@ -355,7 +366,7 @@ EOF
355
366
  else
356
367
  0.0
357
368
  end
358
- }.sum
369
+ }.sum + sum_of_assets
359
370
  end
360
371
  def balance(date=@reporter.today)
361
372
  @accounts.map{|acc|
@@ -28,7 +28,7 @@ module Analysis
28
28
  #ep ['account', account.name_c]
29
29
  counter = 0
30
30
  if not account.info[:period]
31
- start_dates.push date
31
+ start_dates.push (account.info[:start]||@start_date)
32
32
  end_dates.push date
33
33
  account_items.push items
34
34
  expenditures.push (items.map{|r| (r.deposit - r.withdrawal) * (account.info[:external] ? -1 : 1)}+[0]).sum
@@ -200,6 +200,7 @@ class Treasurer
200
200
  report << footer
201
201
 
202
202
  File.open('report.tex', 'w'){|f| f.puts report}
203
+ Process.wait
203
204
  system "lualatex report.tex && lualatex report.tex"
204
205
  end
205
206
  def account_summaries
@@ -239,14 +240,24 @@ EOF
239
240
  end
240
241
  def expense_account_summary
241
242
  <<EOF
242
- \\section{Expense Account Summary}
243
+ \\section{Expense and Income Summary}
243
244
  \\subsection{Totals for #@days_before-day Budget Period}
244
- #{expense_pie_charts_by_currency('accountperiod', @expense_accounts){|r| r.days_ago(@today) < @days_before}}
245
+ \\subsection{Expense}
246
+ #{expense_pie_charts_by_currency('accountperiod_expense', @expense_accounts){|r| r.days_ago(@today) < @days_before}}
247
+ \\subsection{Income}
248
+ #{expense_pie_charts_by_currency('accountperiod_income', @accounts.find_all{|acc| acc.type==:Income}){|r| r.days_ago(@today) < @days_before}}
245
249
  \\subsection{Expense Account Breakdown}
246
250
  #{@expense_accounts.find_all{|exaccount| exaccount.should_report?}.map{|exaccount|
247
251
  account = exaccount.report_account
248
252
  "
249
- \\subsection{#{account.name_c}}
253
+ \\subsubsection{#{account.name_c}}
254
+ #{expense_pie_chart(account.name_c_file + 'breakdown', account.sub_accounts, account){|r|r.days_ago(@today) < @days_before }}"
255
+ }.join("\n\n")}
256
+ \\subsection{Income Account Breakdown}
257
+ #{@accounts.find_all{|inaccount| inaccount.type==:Income and inaccount.should_report?}.map{|inaccount|
258
+ account = inaccount.report_account
259
+ "
260
+ \\subsubsection{#{account.name_c}}
250
261
  #{expense_pie_chart(account.name_c_file + 'breakdown', account.sub_accounts, account){|r|r.days_ago(@today) < @days_before }}"
251
262
  }.join("\n\n")}
252
263
  EOF
@@ -284,21 +295,33 @@ EOF
284
295
  start_dates = start_dates.reverse
285
296
  pp ['DATES', start_dates, end_dates, subacc.name]
286
297
  return "No expenditure in account period." if end_dates.size==0
298
+ #keylabels = []
287
299
  k = (
288
300
  end_dates.size.times.map do |i|
289
- exps = accounts.map{|acc| acc.deposited(end_dates[i], end_dates[i] - start_dates[i], &block)}
290
- kt = GraphKit.quick_create([labels.size.times.to_a.map{|l| l.to_f + i.to_f/end_dates.size.to_f}, exps])
301
+ exps = []
302
+ if subacc.type==:Expense
303
+ exps = accounts.map{|acc| acc.deposited(end_dates[i], end_dates[i] - start_dates[i], &block)}
304
+ else
305
+ exps = accounts.map{|acc| acc.withdrawn(end_dates[i], end_dates[i] - start_dates[i], &block) -
306
+ acc.deposited(end_dates[i], end_dates[i] - start_dates[i], &block)
307
+ }
308
+ end
309
+ kt = GraphKit.quick_create([labels.size.times.to_a.map{|l| l.to_f + i.to_f/(end_dates.size+1).to_f}, exps])
291
310
  kt.data[0].gp.title = "Ending #{end_dates[i].strftime("#{end_dates[i].mday.ordinalize} %B")}; total = #{exps.sum}"
292
- kt.gp.key = "tmargin"
311
+ kt.gp.key = "rmargin"
312
+ #keylabels.push "'Ending #{end_dates[i].strftime("#{end_dates[i].mday.ordinalize} %B")}; total = #{exps.sum}'"
313
+ #kt.gp.key = "off rotate by 90"
293
314
  kt
294
315
  end
295
316
  ).sum
296
317
  k
297
318
  else
298
- exps = accounts.map{|acc| acc.deposited(@today, 50000, &block)}
319
+ exps = accounts.map{|acc| acc.type==:Expense ? acc.deposited(@today, 50000, &block) - acc.withdrawn(@today, 50000, &block): acc.withdrawn(@today, 50000, &block) - acc.deposited(@today, 50000, &block)}
299
320
  labels, exps = [labels, exps].transpose.find_all{|l, e| e != 0.0}.transpose
300
321
  return "No expenditure in account period." if not labels #<F8> labels.size==0
301
- GraphKit.quick_create([labels.size.times.to_a, exps])
322
+ k = GraphKit.quick_create([labels.size.times.to_a, exps])
323
+ k.data[0].gp.title = "Cumulative over budget period. Total = #{exps.sum}"
324
+ k
302
325
  end
303
326
 
304
327
 
@@ -315,20 +338,38 @@ EOF
315
338
  kit.gp.yrange = "[#{[kit.data[0].y.data.min,0].min}:]"
316
339
  #kit.gp.xrange = "[-1:#{labels.size+1}]"
317
340
  kit.gp.xrange = "[-1:1]" if labels.size==1
318
- kit.gp.grid = "ytics"
341
+ kit.gp.mytics = "5"
342
+ kit.gp.ytics = "autofreq rotate by 45"
343
+ kit.gp.grid = "ytics mytics lw 2,lw 1"
319
344
  kit.xlabel = nil
320
345
  kit.ylabel = nil
321
346
  i = -1
322
- kit.gp.xtics = "(#{labels.map{|l| %["#{l}" #{i+=1}]}.join(', ')}) rotate by 315"
347
+ kit.gp.xtics = "(#{labels.map{|l| %["#{l}" #{i+=1}]}.join(', ')}) rotate by 90 right"
323
348
  pp ['kit222', kit, labels]
324
349
  fork do
325
- kit.gnuplot_write("#{name}.eps", size: "4.0in,2.0in")
326
- %x[epspdf #{name}.eps]
350
+
351
+ 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")
353
+ kit.gp.key = "tmargin"
354
+ kit.gp.border = "unset"
355
+ kit.gp.xtics = "unset"
356
+ kit.gp.ytics = "unset"
357
+ kit.gp.title = "unset"
358
+ kit.gp.xlabel = "unset"
359
+ kit.gp.ylabel = "unset"
360
+ #kit.gp.xrange = "[-100:-10]"
361
+ kit.gp.boxwidth = "#{0.0/kit.data.size} absolute"
362
+ kit.gp.object = " rect from screen 0, screen 0 to screen 1, graph 1 front fc rgb 'white' fillstyle solid noborder"
363
+ #kit.gp.style = "fill empty noborder"
364
+ #kit.gp.yrange = "[-10:10]"
365
+ 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]
367
+ #%x[convert -density 500 #{name}.eps -resize 4000 -bordercolor white -border 20x20 -background white -flatten -trim +repage #{name}.pdf]
327
368
  end
328
369
 
329
370
  #"\\begin{center}\\includegraphics[width=3.0in]{#{name}.eps}\\vspace{1em}\\end{center}"
330
371
  #"\\begin{center}\\includegraphics[width=0.9\\textwidth]{#{name}.eps}\\vspace{1em}\\end{center}"
331
- "\\myfigure{#{name}.pdf}"
372
+ "\\myfigurerot{#{name}.eps}{#{name}_key.pdf}{270}"
332
373
  end
333
374
  def get_in_limit_discretionary_account_factor(currency)
334
375
  @projected_account_factor = 1.0
@@ -380,13 +421,17 @@ EOF
380
421
  \\section{Discretionary Budget Summary (#{currency})}
381
422
  \\begin{tabulary}{0.9\\textwidth}{ R | r r r r }
382
423
  Budget & Average & Projection & Limit & Stable \\\\
383
- #{discretionary_accounts.map{|account, info|
424
+ #{tls = [0.0, 0.0, 0.0, 0.0]
425
+ discretionary_accounts.map{|account, info|
384
426
  #ep info
385
- "#{account.name_c} & #{account.average} & #{account.projection} & #{
386
- (account.projection * @in_limit_discretionary_account_factors[currency]).round(2)} &
387
- #{(account.projection * @stable_discretionary_account_factors[currency]).round(2)} \\\\"
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} \\\\"
388
430
  }.join("\n\n")
389
431
  }
432
+ \\\\
433
+ \\hline
434
+ Totals & #{tls.map{|v| v.to_tex}.join(" & ")}
390
435
  \\end{tabulary}
391
436
  EOF
392
437
  end
@@ -450,7 +495,7 @@ EOF
450
495
  #ep ['kit1122', account, kit]
451
496
  fork do
452
497
  kit.gnuplot_write("#{account.name_c_file}.eps", size: "4.0in,2.0in")
453
- exec "epspdf #{account.name_c_file}.eps"
498
+ exec "epstopdf #{account.name_c_file}.eps"
454
499
  end
455
500
  #%x[ps2eps #{account}.ps]
456
501
  #"\\begin{center}\\includegraphics[width=3.0in]{#{account}.eps}\\vspace{1em}\\end{center}"
@@ -597,9 +642,9 @@ EOF
597
642
 
598
643
  def header
599
644
  <<EOF
600
- \\documentclass[a5paper]{article}
601
- %\\usepackage[scale=0.9]{geometry}
602
- \\usepackage[left=1cm,top=1cm,right=1cm,nohead,nofoot]{geometry}
645
+ \\documentclass[a5paper, 10pt]{article}
646
+ %\\usepackage[scale=0.92]{geometry}
647
+ \\usepackage[left=0.9cm,top=0.9cm,right=0.9cm,bottom=0.5cm,nohead,includefoot]{geometry}
603
648
  %\\usepackage[cm]{fullpage}
604
649
  \\usepackage{tabulary}
605
650
  \\usepackage{graphicx}
@@ -607,10 +652,22 @@ EOF
607
652
  \\usepackage{hyperref}
608
653
  \\usepackage{libertine}
609
654
  \\usepackage{xcolor,listings}
655
+ \\usepackage{epstopdf}
610
656
  \\newcommand\\Tstrut{\\rule{0pt}{2.8ex}}
657
+ \\newcommand\\myfigurerot[3]{\\vspace*{1em}\\begin{center}
658
+
659
+ \\begin{minipage}{\\textwidth}
660
+ \\includegraphics[clip,height=0.90\\textwidth,angle=#3]{#1}
661
+
662
+ \\hfill
663
+ \\includegraphics[width=0.5\\textwidth]{#2}
664
+ \\end{minipage}
665
+ \\end{center}\\vspace*{0em}
666
+
667
+ }
611
668
  \\newcommand\\myfigure[1]{\\vspace*{1em}\\begin{center}
612
669
 
613
- \\includegraphics[width=0.99\\textwidth]{#1}
670
+ \\includegraphics[clip,width=0.90\\textwidth]{#1}
614
671
 
615
672
  \\end{center}\\vspace*{0em}
616
673
 
@@ -621,16 +678,16 @@ identifierstyle = \\ttfamily\\color{purple},
621
678
  keywordstyle=\\ttfamily\\color{blue},
622
679
  stringstyle=\\color{orange}}
623
680
  \\usepackage[compact]{titlesec}
624
- \\titlespacing{\\section}{0pt}{*0}{*0}
625
- \\titlespacing{\\subsection}{0pt}{*0}{*2}
626
- \\titlespacing{\\subsubsection}{0pt}{*0}{*0}
627
- \\setlength{\\parskip}{0pt}
628
- \\setlength{\\parsep}{0pt}
629
- \\setlength{\\headsep}{0pt}
630
- \\setlength{\\topskip}{0pt}
631
- \\setlength{\\topmargin}{0pt}
632
- \\setlength{\\topsep}{0pt}
633
- \\setlength{\\partopsep}{0pt}
681
+ %\\titlespacing{\\section}{0pt}{*0}{*0}
682
+ %\\titlespacing{\\subsection}{0pt}{*0}{*2}
683
+ %\\titlespacing{\\subsubsection}{0pt}{*0}{*0}
684
+ %\\setlength{\\parskip}{0pt}
685
+ %\\setlength{\\parsep}{0pt}
686
+ %\\setlength{\\headsep}{0pt}
687
+ %\\setlength{\\topskip}{0pt}
688
+ %\\setlength{\\topmargin}{0pt}
689
+ %\\setlength{\\topsep}{0pt}
690
+ %\\setlength{\\partopsep}{0pt}
634
691
  \\begin{document}
635
692
  \\title{Budget Report from #{@start_date.strftime("%A #{@start_date.day.ordinalize} of %B %Y")} to #{@today.strftime("%A #{@today.day.ordinalize} of %B %Y")}}
636
693
  \\author{With projections to #{@end_date.strftime("%A #{@end_date.day.ordinalize} of %B %Y")}}
@@ -2,11 +2,11 @@
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.7.0 ruby lib
5
+ # stub: treasurer 0.8.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "treasurer".freeze
9
- s.version = "0.7.0"
9
+ s.version = "0.8.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]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: treasurer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edmund Highcock