split_bills 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/split_bills.rb +370 -0
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0ef32d82d741e055d3cf51e6647a870b05dbd9b2
4
- data.tar.gz: 19e25bf018655fc1eeb260b4553c405c025debae
3
+ metadata.gz: 08bf27306e158f39efd824cfd35b452da49db0e7
4
+ data.tar.gz: 117217fe3f890e9a6ce74591ec537fc5a3246f72
5
5
  SHA512:
6
- metadata.gz: dace2bf9dc515960bec3ac0c1e08b937d31f21da3166857e00766d16190b99c601d02510114554ef54d36a1fa17cb25bd84a7ce91a64d5740f64b364c036e788
7
- data.tar.gz: 194b0eebb1380caf04d5a9e9340f95966ddcb2c85aa0a0bcb57d717a0030c42d27f98af9a62dc9aa4bc3339b65204e3b40bd3da6926e2c24630fec9908e5835e
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.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-18 00:00:00.000000000 Z
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