treasurer 0.7.0 → 0.8.0

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