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