cashflow 0.0.2 → 0.0.5
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/.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
|

|
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
|