split_bills 0.0.0 → 0.0.1
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/lib/split_bills.rb +370 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 08bf27306e158f39efd824cfd35b452da49db0e7
|
4
|
+
data.tar.gz: 117217fe3f890e9a6ce74591ec537fc5a3246f72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69a51fbbc4051fad4a89774a73e677758dd569d3ac6abeb77561084b7c9939af812fb3ca7484f00423e5a55929ebc828f08fb860fca7658f268f404dcc632a2d
|
7
|
+
data.tar.gz: 984637e7263cd857714c226eb102aa732c99ed98b760fb5df07c95217adde1c62dadc6d6c8b7a514fdd08d317a931d5a797ca015f4187027790b788f3a024ecc
|
data/lib/split_bills.rb
CHANGED
@@ -1,5 +1,375 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require 'yaml'
|
3
|
+
#require 'money' #if I get to supporting currency
|
4
|
+
|
1
5
|
class SplitBills
|
6
|
+
|
7
|
+
#attr_accessor :members, :new_bill
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
$members = Hash.new
|
11
|
+
$bills = Hash.new
|
12
|
+
$monthly_bills = Hash.new
|
13
|
+
#$monthly_split = Hash.new
|
14
|
+
@save_path = "./data/"
|
15
|
+
@bills_file = "bills.yml"
|
16
|
+
@members_file = "members.yml"
|
17
|
+
date = Time.new
|
18
|
+
@month_year = "#{date.year}_#{date.month}"
|
19
|
+
@dated_split_file = "#{@month_year}_split.yml"
|
20
|
+
@monthly_bills_file = "#{@month_year}_bills.yml"
|
21
|
+
@divide_key = 0
|
22
|
+
@divide_by = Hash[:empty => 0]
|
23
|
+
@mem_with_key = Array.new
|
24
|
+
@split_bill_list = Array.new
|
25
|
+
end
|
26
|
+
|
27
|
+
# Startup shortcuts
|
28
|
+
|
29
|
+
def load_all
|
30
|
+
load_members
|
31
|
+
load_bills
|
32
|
+
load_monthly_bills
|
33
|
+
#load_monthly_split
|
34
|
+
#populate_divide_by
|
35
|
+
end
|
36
|
+
|
37
|
+
def save_all
|
38
|
+
save_members
|
39
|
+
save_bills
|
40
|
+
save_monthly_bills
|
41
|
+
#save_monthly_split
|
42
|
+
end
|
43
|
+
|
44
|
+
# Member methods - elements are (member_name), (member_unit), (...)
|
45
|
+
|
46
|
+
def get_new_member # transfer to UI class/module
|
47
|
+
first_name = gets_from_user("Members first name")
|
48
|
+
last_name = gets_from_user("Members last name")
|
49
|
+
new_member(first_name, last_name)
|
50
|
+
end
|
51
|
+
|
52
|
+
def new_member(first_name, last_name)
|
53
|
+
new_mem = [first_name, last_name].reject(&:empty?).join(' ')
|
54
|
+
new_mem = name_to_sym(new_mem)
|
55
|
+
$members[new_mem] = { :my_bills =>["total", 0] }
|
56
|
+
end
|
57
|
+
|
58
|
+
def save_members
|
59
|
+
#File.open("./data/members.yml", "w"){ |f| f.write @members.to_yaml }
|
60
|
+
save_file(@members_file, $members)
|
61
|
+
end
|
62
|
+
|
63
|
+
def load_members
|
64
|
+
$members = load_file(@members_file, $members)
|
65
|
+
#load_work = load_file(@members_file, $members)
|
66
|
+
#$members = load_work
|
67
|
+
end
|
68
|
+
|
69
|
+
def list_members #remove?
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
def del_member!(del_mem)
|
75
|
+
$members.delete_if{ |m| m==del_mem }
|
76
|
+
end
|
77
|
+
|
78
|
+
# Bill methods
|
79
|
+
|
80
|
+
def enter_bill #ui element
|
81
|
+
name = gets_from_user("Bill name")
|
82
|
+
split = gets_from_user("#{name} is split evenly or a fixed ammount (split/fixed)")
|
83
|
+
value = gets_currency_from_user("if this is a fixed bill enter the ammount in whole numbers, otherwise enter 0")
|
84
|
+
new_bill(name, split, value)
|
85
|
+
end
|
86
|
+
|
87
|
+
def new_bill(name, split, value)
|
88
|
+
bill_sym = name_to_sym(name)
|
89
|
+
bill_name = "my_" + name.downcase
|
90
|
+
bill_name_sym = name_to_sym(bill_name)
|
91
|
+
$bills[bill_sym] = { bill_name_sym =>[split, value] }
|
92
|
+
end
|
93
|
+
|
94
|
+
def save_bills
|
95
|
+
save_file(@bills_file, $bills)
|
96
|
+
end
|
97
|
+
|
98
|
+
def load_bills
|
99
|
+
$bills = load_file(@bills_file, $bills)
|
100
|
+
#load_work = load_file(@bills_file, $bills)
|
101
|
+
#$bills = load_work
|
102
|
+
end
|
103
|
+
|
104
|
+
def remove_bill(del_bill)
|
105
|
+
$bills.delete_if{ |b| b==del_bill }
|
106
|
+
end
|
107
|
+
|
108
|
+
def list_bills
|
109
|
+
$bills.each { |key, value| puts "#{key}" }
|
110
|
+
end
|
111
|
+
|
112
|
+
def list_members_bills(mem_key) #working on this
|
113
|
+
$members[mem_key].each { |key, value| puts "#{sym_to_name(key)}" }
|
114
|
+
end
|
115
|
+
|
116
|
+
def assign_bill_ui #ui element
|
117
|
+
end
|
118
|
+
|
119
|
+
def assign_bill_to_mem(mem_key, bill_key, value)
|
120
|
+
work_mem = $members[mem_key]
|
121
|
+
work_bill = $bills[bill_key]
|
122
|
+
work_merge = work_mem.merge(work_bill)
|
123
|
+
$members[mem_key] = work_merge
|
124
|
+
end
|
125
|
+
|
126
|
+
def remove_bill_from_mem(mem_key, bill_key)
|
127
|
+
$members[mem_key] = $members[mem_key].delete_if{ |m| m==bill_key }
|
128
|
+
end
|
129
|
+
|
130
|
+
# Monthly bills methods
|
131
|
+
|
132
|
+
def save_monthly_bills
|
133
|
+
save_file(@dated_bills_file, $monthly_bills)
|
134
|
+
end
|
135
|
+
|
136
|
+
def load_monthly_bills
|
137
|
+
$monthly_bills = load_file(@monthly_bills_file, $monthly_bills)
|
138
|
+
#load_work = load_file(@dated_bills_file, $monthly_bills)
|
139
|
+
#$monthly_bills = load_work
|
140
|
+
end
|
141
|
+
|
142
|
+
def enter_monthly_bill(bill_key, value) #create monthly instance of bill and set total
|
143
|
+
#get record from $bills
|
144
|
+
#record_work = $bills[bill_key]
|
145
|
+
# @divide_by = Hash[:empty => 0] # reset divide by count, used in splitting bills
|
146
|
+
key_work = "mon_" + bill_key.to_s
|
147
|
+
old_key = "my_" + bill_key.to_s
|
148
|
+
old_key = old_key.to_sym
|
149
|
+
new_key = key_work.to_sym
|
150
|
+
copy_val = $bills[bill_key][old_key][0]
|
151
|
+
$monthly_bills[bill_key] = { new_key =>[copy_val, value] }
|
152
|
+
end
|
153
|
+
|
154
|
+
def remove_bill_from_mon(del_bill)
|
155
|
+
$monthly_bills.delete_if{ |b| b==del_bill }
|
156
|
+
end
|
157
|
+
|
158
|
+
# Monthly split methods - Working
|
159
|
+
|
160
|
+
def save_monthly_split
|
161
|
+
save_file(@dated_split_file, $monthly_split)
|
162
|
+
end
|
163
|
+
|
164
|
+
def load_monthly_split
|
165
|
+
$monthly_split = load_file(@dated_split_file, $monthly_split)
|
166
|
+
#load_work = load_file(@dated_split_file, $monthly_split)
|
167
|
+
#$monthly_split = load_work
|
168
|
+
end
|
169
|
+
|
170
|
+
#def split_monthly_split #set value of bill split for
|
171
|
+
# populate_divide_by
|
172
|
+
#list_keys.each {|key| get_target_val(key) }
|
173
|
+
#end
|
174
|
+
|
175
|
+
def list_keys
|
176
|
+
$monthly_bills.keys
|
177
|
+
end
|
178
|
+
|
179
|
+
def calculate_monthly_split
|
180
|
+
# for each bill in monthly
|
181
|
+
# get bills which are "split"
|
182
|
+
# for each split bill
|
183
|
+
# get members who owe
|
184
|
+
# calculate number to split between
|
185
|
+
# calculate what split equals
|
186
|
+
# assign split value to member[:key][:subkey]
|
187
|
+
#
|
188
|
+
split_key_list = list_keys.each { |key| get_split_bill_list(key) } #[:rent], [:garbage]
|
189
|
+
split_key_list.each { |key| get_split_bill_list(key) }
|
190
|
+
@split_bill_list = @split_bill_list.uniq
|
191
|
+
# for each bill in split_bill_list
|
192
|
+
@split_bill_list.each { |key| calculate_and_set_split(key) }
|
193
|
+
# eligible_members = split_key_list.each { |key| get_eligible_member_list(key) }
|
194
|
+
#divide_by = (eligible_members.uniq).count
|
195
|
+
#get_whole = split_key_list.each { |key| calculate_split_value(key) }
|
196
|
+
#calculate_split = get_whole.to_f/divide_by.to_f
|
197
|
+
end
|
198
|
+
|
199
|
+
def get_split_bill_list(key) #evaluate sub_keys for instance of "split" and store key = :rent, sub_key = :mon_rent
|
200
|
+
# for each bill in monthly
|
201
|
+
# get bills which are "split"
|
202
|
+
# evaluate sub_key[0] for "split"
|
203
|
+
# save results into an array
|
204
|
+
#
|
205
|
+
#split_list = Array.new
|
206
|
+
#$monthly_bills[key].each {||}
|
207
|
+
sub_sym = return_sub_sym(key) # [:mon_garbage]
|
208
|
+
if $monthly_bills[key][sub_sym][0]=="split"
|
209
|
+
@split_bill_list << key
|
210
|
+
else
|
211
|
+
end
|
212
|
+
@split_bill_list
|
213
|
+
end #good
|
214
|
+
|
215
|
+
def calculate_and_set_split(bill_key) # [:rent]
|
216
|
+
# for each of these set split total and set in members bills
|
217
|
+
sub_key = return_sub_sym(bill_key)
|
218
|
+
mem_sub_key = return_mem_sub_sym(bill_key)
|
219
|
+
bill_total = $monthly_bills[bill_key][sub_key][1]
|
220
|
+
elig_mem = get_eligible_member_list(bill_key)
|
221
|
+
div_by = elig_mem.count
|
222
|
+
split = bill_total.to_f/div_by.to_f
|
223
|
+
|
224
|
+
elig_mem.each { |mem_key| set_mem_split(mem_key, mem_sub_key, split) }
|
225
|
+
end
|
226
|
+
|
227
|
+
def get_eligible_member_list(bill_key)
|
228
|
+
#eligible_members = Array.new
|
229
|
+
mem_keys = $members.keys
|
230
|
+
mem_sub_key = return_mem_sub_sym(bill_key)
|
231
|
+
mem_keys.each { |mem_key| eligible_member_test(mem_key, mem_sub_key) }
|
232
|
+
end
|
233
|
+
|
234
|
+
def eligible_member_test(mem_key, sub_key) # [:scott_dodson], [:my_garbage]
|
235
|
+
elig_list = Array.new
|
236
|
+
#sub_key = return_mem_sub_sym(key) # [:my_garbage]
|
237
|
+
#puts "#{key}, #{sub_key}"
|
238
|
+
#key
|
239
|
+
work_test = $members[mem_key][sub_key][0]
|
240
|
+
if work_test=="split"
|
241
|
+
elig_list << mem_key
|
242
|
+
else
|
243
|
+
end
|
244
|
+
elig_list
|
245
|
+
end
|
246
|
+
|
247
|
+
def set_mem_split(mem_key, mem_sub_key, split)
|
248
|
+
$members[mem_key][mem_sub_key][1] = split
|
249
|
+
end
|
250
|
+
|
251
|
+
def check_split(bill_key, mem_key)
|
252
|
+
sub_key = return_mem_sub_sym(bill_key)
|
253
|
+
if $bills[bill_key][sub_key][1].to_f > $members[mem_key][sub_key][1]
|
254
|
+
true
|
255
|
+
else
|
256
|
+
false
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def check_split_total #total members split for a given bill
|
261
|
+
end
|
262
|
+
|
263
|
+
# Test Methods
|
264
|
+
|
265
|
+
def show_divide_by
|
266
|
+
@divide_by
|
267
|
+
end
|
268
|
+
|
269
|
+
def show_mem_with_key
|
270
|
+
@mem_with_key
|
271
|
+
end
|
272
|
+
|
273
|
+
def show_monthly_split #show bill total, members split and total of members split
|
274
|
+
$monthly_split
|
275
|
+
end
|
276
|
+
|
277
|
+
def show_members_split #use after split values calculated
|
278
|
+
end
|
279
|
+
|
280
|
+
def show_bills
|
281
|
+
$bills
|
282
|
+
end
|
283
|
+
|
284
|
+
def show_monthly_bills
|
285
|
+
$monthly_bills
|
286
|
+
end
|
287
|
+
|
288
|
+
def show_members
|
289
|
+
$members
|
290
|
+
end
|
291
|
+
|
292
|
+
def show_members_bills(mem_key)
|
293
|
+
$members[mem_key]
|
294
|
+
end
|
295
|
+
|
296
|
+
# Class work methods
|
297
|
+
|
298
|
+
def sym_to_name(name_sym) #convert symbol to name
|
299
|
+
name_sym.to_s.gsub!('_', ' ').gsub(/\b\w/){|f| f.upcase}
|
300
|
+
end #good
|
301
|
+
|
302
|
+
def name_to_sym(sym_name) #convert name to symbol
|
303
|
+
sym_name.gsub(/\b\w/){|f| f.downcase}.gsub(' ', '_').to_sym
|
304
|
+
end #good
|
305
|
+
|
306
|
+
def save_file(file, data)
|
307
|
+
File.open("#{@save_path}#{file}", "w"){ |f| f.write data.to_yaml }
|
308
|
+
end
|
309
|
+
|
310
|
+
def load_file(file, data)
|
311
|
+
if File.exists?("#{@save_path + file}")
|
312
|
+
data = YAML.load_file("#{@save_path + file}")
|
313
|
+
else
|
314
|
+
data = File.new("#{@save_path + file}", "w")
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
def set_save_path(path)
|
319
|
+
@save_path = path
|
320
|
+
end
|
321
|
+
|
322
|
+
def check_time
|
323
|
+
@month_year
|
324
|
+
end
|
325
|
+
|
326
|
+
def alnum_chk(string)
|
327
|
+
string.index(/[^[:alnum:]]/)
|
328
|
+
end
|
329
|
+
|
330
|
+
def currency_check(string)
|
331
|
+
string.index(/[^\d]/)
|
332
|
+
#string.index(/[^\$?(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$]/) #if I get to supporting currency
|
333
|
+
end
|
334
|
+
|
335
|
+
def gets_from_user(question)
|
336
|
+
puts "#{question}:"
|
337
|
+
user_in = gets.chomp
|
338
|
+
if alnum_chk(user_in) != nil
|
339
|
+
puts "no special characters please:"
|
340
|
+
else
|
341
|
+
user_in
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
def gets_currency_from_user(question)
|
346
|
+
puts "#{question}:"
|
347
|
+
user_in = gets.chomp
|
348
|
+
if currency_check(user_in) != nil
|
349
|
+
puts "no special characters please:"
|
350
|
+
else
|
351
|
+
user_in
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
def return_sub_sym(sym)
|
356
|
+
("mon_" + sym.to_s).to_sym
|
357
|
+
#key_work = "mon_" + sym.to_s
|
358
|
+
#new_sym = key_work.to_sym
|
359
|
+
#new_sym
|
360
|
+
end
|
361
|
+
|
362
|
+
def return_mem_sub_sym(sym) #for getting number to split by
|
363
|
+
("my_" + sym.to_s).to_sym
|
364
|
+
#key_work = "my_" + sym.to_s
|
365
|
+
#new_sym = key_work.to_sym
|
366
|
+
#new_sym
|
367
|
+
end
|
368
|
+
|
2
369
|
def self.hi
|
3
370
|
puts "SplitBills, hello!"
|
4
371
|
end
|
5
372
|
end
|
373
|
+
|
374
|
+
# http://www.techotopia.com/index.php/Working_with_Files_in_Ruby
|
375
|
+
# http://stackoverflow.com/questions/12880770/get-the-first-key-and-value-pair-from-a-hash-table-in-ruby-wierd-results
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: split_bills
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Dodson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A gem which provides tools for splitting bills
|
14
14
|
email: capourso@gmail.com
|