cashflow 0.0.2 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +6 -4
- data/db/.gitkeep +0 -0
- data/lib/cashflow/cli.rb +15 -4
- data/lib/cashflow/report.rb +25 -9
- data/lib/cashflow/version.rb +1 -1
- metadata +2 -2
- data/db/cashflow.db +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 107cc67b642f951260cc80eac4ee26dc91019d8c
|
4
|
+
data.tar.gz: 456365241263c8ef910fe7fe05cea8a7e79bcaf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16c878c53075f8ea22e660b2ac6db3b8069a057d78ff2574d02fa3e24090d256c28afa56440fad16db4c4571a3d59a53800b33b62ec81e2e734669b3a7258aa0
|
7
|
+
data.tar.gz: d1921429cf9a762ea6ac6b43442167a0416fd51c8b355ea0362a77a0486a5fdeb43a441354085ce61604b82b60e40936c118bc38714d2c35f03c0d29f46c7df6
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -3,7 +3,7 @@ Cashflow
|
|
3
3
|
|
4
4
|
**Compare your latest income & expenses to your average.**
|
5
5
|
|
6
|
-
|
6
|
+
_Cashflow_ is a simple command-line application written in Ruby using [Thor](https://github.com/wycats/thor). It's purpose is simple: to analyse your bank transactions (collecting only the _date_ and _amount_) in order to build an average if your income and expenses over the last few months and compare these with the income and expenses for the current month.
|
7
7
|
|
8
8
|
Only transactions up to the current day of the month are included, so the app gives you good insight into your financial position at this exact point in the month - extremely useful when you have regular monthly transactions such as rent and salary.
|
9
9
|
|
@@ -12,20 +12,22 @@ By default, only transactions from 4 months prior are factored into the calculat
|
|
12
12
|
Usage
|
13
13
|
-----
|
14
14
|
|
15
|
-
Basic useage is simple
|
15
|
+
Install via rubygems: `gem install cashflow`. Basic useage is simple. You load a set of transactions (in `ofx` format), then print a report.
|
16
16
|
|
17
17
|
![Useage screenshot](https://raw.github.com/6twenty/cashflow/master/screenshot.png)
|
18
18
|
|
19
|
+
Note that _Cashflow_ doesn't care about your net position; it only cares about the comparison to your averages. This means that, as in the example above, even if your net position is negative (ie, you've spent more than you've earned), _Cashflow_ will still report a positive outcome provided you have made an improvement on your average.
|
20
|
+
|
19
21
|
Commands
|
20
22
|
--------
|
21
23
|
|
22
24
|
```
|
23
25
|
cashflow help # Show this help message
|
24
|
-
cashflow help
|
26
|
+
cashflow help COMMAND # Describe available commands or one specific command
|
25
27
|
cashflow load PATH # Loads the OFX file at the specified PATH
|
26
28
|
cashflow report # Analyses the stored transactions and prints a comparison report
|
27
29
|
cashflow flush # Flushes the database, removing all stored transactions
|
28
30
|
cashflow version # Prints the current version number
|
29
31
|
```
|
30
32
|
|
31
|
-
|
33
|
+
`cashflow report` takes optional parameters. You can specify the date range for the transactions to compare against by passing `-s` or `--span` followed by a number repensenting the number of months to use. You can also specify the target day of the month to filter transactions against by passing `-d` or `--day` followed by a number representing the desired day of the month.
|
data/db/.gitkeep
ADDED
File without changes
|
data/lib/cashflow/cli.rb
CHANGED
@@ -16,18 +16,29 @@ module Cashflow
|
|
16
16
|
# Option to factor only up to the day of the month.
|
17
17
|
desc "report", "Analyses the stored transactions and prints a comparison report"
|
18
18
|
option :span, :type => :numeric, :aliases => "-s", :default => 4
|
19
|
+
option :day, :type => :numeric, :aliases => "-d"
|
19
20
|
def report
|
21
|
+
# Normalize the options.
|
22
|
+
months_span = options[:span]
|
23
|
+
if options[:day] && options[:day] <= Date.today.day && options[:day] > 0
|
24
|
+
day_of_month = options[:day]
|
25
|
+
elsif options[:day] && options[:day] <= 0
|
26
|
+
day_of_month = 1
|
27
|
+
else
|
28
|
+
day_of_month = Date.today.day
|
29
|
+
end
|
30
|
+
|
20
31
|
# Build report.
|
21
|
-
report = Report.new(
|
22
|
-
report.build_report
|
32
|
+
report = Report.new(months_span, day_of_month)
|
33
|
+
report.build_report!
|
23
34
|
|
24
35
|
# Define columns widths.
|
25
36
|
cols = "%-11s %-11s %-11s %-11s\n"
|
26
37
|
|
27
38
|
# Intro.
|
28
39
|
say("\n")
|
29
|
-
say("Using transactions up to and including the #{
|
30
|
-
say("Transactions begin #{report.
|
40
|
+
say("Using transactions up to and including the #{report.end_date.day.ordinalize} of the month")
|
41
|
+
say("Transactions begin #{report.start_date.strftime('%B')} #{report.start_date.day.ordinalize}, #{report.start_date.strftime('%Y')}")
|
31
42
|
say("\n")
|
32
43
|
|
33
44
|
# Table header.
|
data/lib/cashflow/report.rb
CHANGED
@@ -7,22 +7,34 @@ module Cashflow
|
|
7
7
|
attr_accessor *TYPES.map { |type| :"#{type}_current_sum" }
|
8
8
|
attr_accessor *TYPES.map { |type| :"#{type}_average" }
|
9
9
|
attr_accessor *TYPES.map { |type| :"#{type}_diff" }
|
10
|
-
attr_accessor :
|
10
|
+
attr_accessor :start_date, :end_date
|
11
11
|
|
12
|
-
def initialize(
|
13
|
-
date
|
14
|
-
|
12
|
+
def initialize(months_span, day_of_month)
|
13
|
+
# Set the initial start date to the first of the month,
|
14
|
+
# however many months ago.
|
15
|
+
date = Date.today << months_span
|
16
|
+
date = Date.new(date.year, date.month, 1)
|
17
|
+
# Get the earliest transaction date since the start date (inclusive).
|
18
|
+
date = Transaction.all(date).first.date
|
19
|
+
# If the earliest transaction took place AFTER the target
|
20
|
+
# day of the month, then move to the following month.
|
21
|
+
date = date >> 1 if date.day > day_of_month
|
22
|
+
# Whatever the final date is, ensure it starts at the beginning of the month.
|
23
|
+
@start_date = Date.new(date.year, date.month, 1)
|
24
|
+
|
25
|
+
# Set the end date.
|
26
|
+
@end_date = Date.new(Date.today.year, Date.today.month, day_of_month)
|
15
27
|
end
|
16
28
|
|
17
29
|
def debits
|
18
|
-
@debits ||= Transaction.merged(Transaction.debits(
|
30
|
+
@debits ||= Transaction.merged(Transaction.debits(start_date))
|
19
31
|
end
|
20
32
|
|
21
33
|
def credits
|
22
|
-
@credits ||= Transaction.merged(Transaction.credits(
|
34
|
+
@credits ||= Transaction.merged(Transaction.credits(start_date))
|
23
35
|
end
|
24
36
|
|
25
|
-
def build_report
|
37
|
+
def build_report!
|
26
38
|
filter_up_to_day_of_the_month!
|
27
39
|
separate_current_month!
|
28
40
|
group_priors_by_month!
|
@@ -38,7 +50,7 @@ module Cashflow
|
|
38
50
|
def filter_up_to_day_of_the_month!
|
39
51
|
TYPES.each do |type|
|
40
52
|
filtered = send(type).select do |transaction|
|
41
|
-
transaction.date.day <=
|
53
|
+
transaction.date.day <= end_date.day
|
42
54
|
end
|
43
55
|
send("#{type}=", filtered)
|
44
56
|
end
|
@@ -95,7 +107,11 @@ module Cashflow
|
|
95
107
|
# Calculate the average debits & credits based on the prior transactions.
|
96
108
|
def calculate_averages!
|
97
109
|
TYPES.each do |type|
|
98
|
-
|
110
|
+
begin
|
111
|
+
average = send("#{type}_sums").values.inject(0, :+) / send("#{type}_sums").values.length
|
112
|
+
rescue
|
113
|
+
average = 0
|
114
|
+
end
|
99
115
|
send("#{type}_average=", average)
|
100
116
|
end
|
101
117
|
end
|
data/lib/cashflow/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cashflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Fulcher
|
@@ -111,7 +111,7 @@ files:
|
|
111
111
|
- Rakefile
|
112
112
|
- bin/cashflow
|
113
113
|
- cashflow.gemspec
|
114
|
-
- db
|
114
|
+
- db/.gitkeep
|
115
115
|
- lib/cashflow.rb
|
116
116
|
- lib/cashflow/cli.rb
|
117
117
|
- lib/cashflow/patches.rb
|
data/db/cashflow.db
DELETED
Binary file
|