Class: SplitBills

Inherits:
Object
  • Object
show all
Defined in:
lib/split_bills.rb

Overview

require ‘money’ #if I get to supporting currency

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSplitBills

attr_accessor :members, :new_bill



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/split_bills.rb', line 9

def initialize
  $members          = Hash.new
	$bills            = Hash.new
  $monthly_bills    = Hash.new
	#$monthly_split    = Hash.new
  @save_path        = "./data/"
  @bills_file       = "bills.yml"
  @members_file     = "members.yml"
  date              = Time.new
  @month_year       = "#{date.year}_#{date.month}"
  @dated_split_file = "#{@month_year}_split.yml"
  @monthly_bills_file = "#{@month_year}_bills.yml"
  @divide_key       = 0
  @divide_by        = Hash[:empty => 0]
  @mem_with_key     = Array.new
  @split_bill_list  = Array.new
end

Class Method Details

.hiObject



338
339
340
# File 'lib/split_bills.rb', line 338

def self.hi
	puts "SplitBills, hello!"
end

Instance Method Details

#alnum_chk(string) ⇒ Object



301
302
303
# File 'lib/split_bills.rb', line 301

def alnum_chk(string)
	string.index(/[^[:alnum:]]/)
end

#assign_bill_to_mem(mem_key, bill_key, value) ⇒ Object

broken



114
115
116
117
118
119
# File 'lib/split_bills.rb', line 114

def assign_bill_to_mem(mem_key, bill_key, value) #broken
  work_mem = $members[mem_key]
  work_bill = $bills[bill_key]
  work_merge = work_mem.merge(work_bill)
  $members[mem_key] = work_merge
end

#assign_bill_uiObject

ui element



111
112
# File 'lib/split_bills.rb', line 111

def assign_bill_ui #ui element
end

#calculate_and_set_split(bill_key) ⇒ Object

good



200
201
202
203
204
205
206
207
208
209
210
# File 'lib/split_bills.rb', line 200

def calculate_and_set_split(bill_key) # [:rent]
  # for each of these set split total and set in members bills
  sub_key     = return_sub_sym(bill_key)
  mem_sub_key = return_mem_sub_sym(bill_key)
  bill_total  = $monthly_bills[bill_key][sub_key][1]
  elig_mem    = get_eligible_member_list(bill_key)
  div_by      = elig_mem.count
  split       = bill_total.to_f/div_by.to_f

  elig_mem.each { |mem_key| set_mem_split(mem_key, mem_sub_key, split) }
end

#calculate_monthly_splitObject



169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/split_bills.rb', line 169

def calculate_monthly_split
  # for each bill in monthly
  #   get bills which are "split"
  # for each split bill
  #   get members who owe 
  #   calculate number to split between
  #   calculate what split equals
  #   assign split value to member[:key][:subkey]
  #
  split_key_list   = list_keys.each { |key| get_split_bill_list(key) } #[:rent], [:garbage]
  split_key_list.each { |key| get_split_bill_list(key) }
  @split_bill_list  = @split_bill_list.uniq
  @split_bill_list.each { |key| calculate_and_set_split(key) }
end

#check_split(bill_key, mem_key) ⇒ Object



236
237
238
239
240
241
242
243
# File 'lib/split_bills.rb', line 236

def check_split(bill_key, mem_key)
  sub_key = return_mem_sub_sym(bill_key)
  if $bills[bill_key][sub_key][1].to_f > $members[mem_key][sub_key][1]
    true
  else
    false
  end
end

#check_timeObject



297
298
299
# File 'lib/split_bills.rb', line 297

def check_time
	@month_year
end

#currency_check(string) ⇒ Object



305
306
307
308
# File 'lib/split_bills.rb', line 305

def currency_check(string)
  string.index(/[^\d]/)
  #string.index(/[^\$?(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$]/) #if I get to supporting currency
end

#del_member!(del_mem) ⇒ Object



69
70
71
# File 'lib/split_bills.rb', line 69

def del_member!(del_mem)
  $members.delete_if{ |m| m==del_mem }
end

#eligible_member_test(mem_key, sub_key) ⇒ Object

:scott_dodson], [:my_garbage


219
220
221
222
223
224
225
226
227
228
229
230
# File 'lib/split_bills.rb', line 219

def eligible_member_test(mem_key, sub_key) # [:scott_dodson], [:my_garbage]
  elig_list = Array.new
  #sub_key = return_mem_sub_sym(key) # [:my_garbage]
  #puts "#{key}, #{sub_key}"
  #key
  work_test = $members[mem_key][sub_key][0]
    if work_test=="split"
      elig_list << mem_key
   else
  end
  elig_list
end

#enter_billObject

Bill methods



75
76
77
78
79
80
# File 'lib/split_bills.rb', line 75

def enter_bill #ui element
	name = gets_from_user("Bill name")
	split = gets_from_user("#{name} is split evenly or a fixed ammount (split/fixed)")
  value = gets_currency_from_user("if this is a fixed bill enter the ammount in whole numbers, otherwise enter 0")
  new_bill(name, split, value)
end

#enter_monthly_bill(bill_key, value) ⇒ Object

create monthly instance of bill and set total



137
138
139
140
141
142
143
144
145
146
147
# File 'lib/split_bills.rb', line 137

def enter_monthly_bill(bill_key, value) #create monthly instance of bill and set total
  #get record from $bills
  #record_work = $bills[bill_key]
  # @divide_by = Hash[:empty => 0] # reset divide by count, used in splitting bills
  key_work = "mon_" + bill_key.to_s
  old_key  = "my_" + bill_key.to_s
  old_key  = old_key.to_sym
  new_key  = key_work.to_sym
  copy_val = $bills[bill_key][old_key][0]
  $monthly_bills[bill_key] = { new_key =>[copy_val, value] }
end

#get_eligible_member_list(bill_key) ⇒ Object



212
213
214
215
216
217
# File 'lib/split_bills.rb', line 212

def get_eligible_member_list(bill_key)
  #eligible_members = Array.new
  mem_keys = $members.keys
  mem_sub_key = return_mem_sub_sym(bill_key)
  mem_keys.each { |mem_key| eligible_member_test(mem_key, mem_sub_key) }
end

#get_new_memberObject

Member methods - elements are (member_name), (member_unit), (…)



46
47
48
49
50
# File 'lib/split_bills.rb', line 46

def get_new_member # transfer to UI class/module
	first_name = gets_from_user("Members first name")
	last_name = gets_from_user("Members last name")
  new_member(first_name, last_name)
end

#get_split_bill_list(key) ⇒ Object

evaluate sub_keys for instance of “split” and store key = :rent, sub_key = :mon_rent



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/split_bills.rb', line 184

def get_split_bill_list(key) #evaluate sub_keys for instance of "split" and store key = :rent, sub_key = :mon_rent
  # for each bill in monthly
  #   get bills which are "split"
  #     evaluate sub_key[0] for "split"
  #   save results into an array
  #
  #split_list = Array.new
     #$monthly_bills[key].each {||}
  sub_sym = return_sub_sym(key) # [:mon_garbage]
  if $monthly_bills[key][sub_sym][0]=="split"
    @split_bill_list << key
  else
  end
  @split_bill_list
end

#gets_currency_from_user(question) ⇒ Object



320
321
322
323
324
325
326
327
328
# File 'lib/split_bills.rb', line 320

def gets_currency_from_user(question)
  puts "#{question}:"
  user_in = gets.chomp
  if currency_check(user_in) != nil
    puts "no special characters please:"
  else
    user_in
  end
end

#gets_from_user(question) ⇒ Object



310
311
312
313
314
315
316
317
318
# File 'lib/split_bills.rb', line 310

def gets_from_user(question)
	puts "#{question}:"
	user_in = gets.chomp
	if alnum_chk(user_in) != nil
	  puts "no special characters please:"
	else
	  user_in
	end
end

#list_billsObject



103
104
105
# File 'lib/split_bills.rb', line 103

def list_bills
	$bills.each { |key, value| puts "#{key}" }
end

#list_keysObject



165
166
167
# File 'lib/split_bills.rb', line 165

def list_keys
  $monthly_bills.keys
end

#list_members_bills(mem_key) ⇒ Object

working on this



107
108
109
# File 'lib/split_bills.rb', line 107

def list_members_bills(mem_key) #working on this
  $members[mem_key].each { |key, value| puts "#{sym_to_name(key)}" }
end

#load_allObject

Startup shortcuts



29
30
31
32
33
34
35
# File 'lib/split_bills.rb', line 29

def load_all
  load_members
  load_bills
  load_monthly_bills
  #load_monthly_split
  #populate_divide_by
end

#load_billsObject



93
94
95
96
97
# File 'lib/split_bills.rb', line 93

def load_bills
  $bills = load_file(@bills_file, $bills)
  #load_work = load_file(@bills_file, $bills)
  #$bills = load_work
end

#load_file(file, data) ⇒ Object



285
286
287
288
289
290
291
# File 'lib/split_bills.rb', line 285

def load_file(file, data)
  if File.exists?("#{@save_path + file}")
    data = YAML.load_file("#{@save_path + file}")
  else
    data = File.new("#{@save_path + file}", "w")
  end
end

#load_membersObject



63
64
65
66
67
# File 'lib/split_bills.rb', line 63

def load_members
  $members = load_file(@members_file, $members)
  #load_work = load_file(@members_file, $members)
  #$members = load_work
end

#load_monthly_billsObject



131
132
133
134
135
# File 'lib/split_bills.rb', line 131

def load_monthly_bills
  $monthly_bills = load_file(@monthly_bills_file, $monthly_bills)
  #load_work = load_file(@dated_bills_file, $monthly_bills)
  #$monthly_bills = load_work
end

#load_monthly_splitObject



159
160
161
162
163
# File 'lib/split_bills.rb', line 159

def load_monthly_split
  $monthly_split = load_file(@dated_split_file, $monthly_split)
  #load_work = load_file(@dated_split_file, $monthly_split)
  #$monthly_split = load_work
end

#name_to_sym(sym_name) ⇒ Object

good



277
278
279
# File 'lib/split_bills.rb', line 277

def name_to_sym(sym_name) #convert name to symbol
	sym_name.gsub(/\b\w/){|f| f.downcase}.gsub(' ', '_').to_sym
end

#new_bill(name, split, value) ⇒ Object



82
83
84
85
86
87
# File 'lib/split_bills.rb', line 82

def new_bill(name, split, value)
  bill_sym = name_to_sym(name)
  bill_name = "my_" + name.downcase
  bill_name_sym = name_to_sym(bill_name)
  $bills[bill_sym] = { bill_name_sym =>[split, value] }
end

#new_member(first_name, last_name) ⇒ Object



52
53
54
55
56
# File 'lib/split_bills.rb', line 52

def new_member(first_name, last_name)
  new_mem = [first_name, last_name].reject(&:empty?).join(' ')
  new_mem = name_to_sym(new_mem)
  $members[new_mem] = { :my_bills =>["total", 0] }
end

#remove_bill(del_bill) ⇒ Object



99
100
101
# File 'lib/split_bills.rb', line 99

def remove_bill(del_bill)
  $bills.delete_if{ |b| b==del_bill }
end

#remove_bill_from_mem(mem_key, bill_key) ⇒ Object



121
122
123
# File 'lib/split_bills.rb', line 121

def remove_bill_from_mem(mem_key, bill_key)
  $members[mem_key] = $members[mem_key].delete_if{ |m| m==bill_key }
end

#remove_bill_from_mon(del_bill) ⇒ Object



149
150
151
# File 'lib/split_bills.rb', line 149

def remove_bill_from_mon(del_bill)
  $monthly_bills.delete_if{ |b| b==del_bill }
end

#return_mem_sub_sym(sym) ⇒ Object

for getting number to split by



334
335
336
# File 'lib/split_bills.rb', line 334

def return_mem_sub_sym(sym) #for getting number to split by
  ("my_" + sym.to_s).to_sym
end

#return_sub_sym(sym) ⇒ Object



330
331
332
# File 'lib/split_bills.rb', line 330

def return_sub_sym(sym)
  ("mon_" + sym.to_s).to_sym
end

#save_allObject



37
38
39
40
41
42
# File 'lib/split_bills.rb', line 37

def save_all
  save_members
  save_bills
  save_monthly_bills
  #save_monthly_split
end

#save_billsObject



89
90
91
# File 'lib/split_bills.rb', line 89

def save_bills
  save_file(@bills_file, $bills)
end

#save_file(file, data) ⇒ Object

good



281
282
283
# File 'lib/split_bills.rb', line 281

def save_file(file, data)
  File.open("#{@save_path}#{file}", "w"){ |f| f.write data.to_yaml }
end

#save_membersObject



58
59
60
61
# File 'lib/split_bills.rb', line 58

def save_members
	#File.open("./data/members.yml", "w"){ |f| f.write @members.to_yaml }
  save_file(@members_file, $members)
end

#save_monthly_billsObject

Monthly bills methods



127
128
129
# File 'lib/split_bills.rb', line 127

def save_monthly_bills
  save_file(@monthly_bills_file, $monthly_bills)
end

#save_monthly_splitObject

Monthly split methods - Working



155
156
157
# File 'lib/split_bills.rb', line 155

def save_monthly_split
  save_file(@dated_split_file, $monthly_split)
end

#set_mem_split(mem_key, mem_sub_key, split) ⇒ Object



232
233
234
# File 'lib/split_bills.rb', line 232

def set_mem_split(mem_key, mem_sub_key, split)
  $members[mem_key][mem_sub_key][1] = split
end

#set_save_path(path) ⇒ Object



293
294
295
# File 'lib/split_bills.rb', line 293

def set_save_path(path)
  @save_path = path
end

#show_billsObject



255
256
257
# File 'lib/split_bills.rb', line 255

def show_bills
  $bills
end

#show_divide_byObject

Test Methods



247
248
249
# File 'lib/split_bills.rb', line 247

def show_divide_by
  @divide_by
end

#show_mem_with_keyObject



251
252
253
# File 'lib/split_bills.rb', line 251

def show_mem_with_key
  @mem_with_key
end

#show_membersObject



263
264
265
# File 'lib/split_bills.rb', line 263

def show_members
  $members
end

#show_members_bills(mem_key) ⇒ Object



267
268
269
# File 'lib/split_bills.rb', line 267

def show_members_bills(mem_key)
  $members[mem_key]
end

#show_monthly_billsObject



259
260
261
# File 'lib/split_bills.rb', line 259

def show_monthly_bills
  $monthly_bills
end

#sym_to_name(name_sym) ⇒ Object

Class work methods



273
274
275
# File 'lib/split_bills.rb', line 273

def sym_to_name(name_sym) #convert symbol to name
	name_sym.to_s.gsub!('_', ' ').gsub(/\b\w/){|f| f.upcase}
end