Skip to content

Instantly share code, notes, and snippets.

@jolts
Created July 30, 2009 17:23
Show Gist options
  • Save jolts/158792 to your computer and use it in GitHub Desktop.
Save jolts/158792 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# Uppgift 4 av Johan Nordström
require 'mysql'
$places = {} # Håller koll på elmätaren för platsen
$guests = [] # Håller reda på samtliga gäster
class DatabaseController
attr_reader :dbh, :connected
def initialize(hostname, user, password, db, table)
@hostname, @user, @password, @db, @table = hostname, user, password, db, table
@connected = false
end
def close
@dbh.close if @dbh
@connected = false
end
def open
# Initiates connection to database
begin
@dbh = Mysql.real_connect(@hostname, @user, @password, @db)
@connected = true
rescue Mysql::Error => e
puts "Error code: #{e.errno}"
puts "Error message: #{e.error}"
puts "Error SQLSTATE: #{e.sqlstate}" if e.respond_to?("sqlstate")
end
end
def store_guest(first_name, last_name, address, phone_no, arrival_date, place, power_usage, type)
open unless @connected
## Ändra så den tar ett guest objekt ist
begin
@dbh.query("""INSERT INTO #{@table} (first_name, last_name, address, phone_no, arrival_date, place, power_usage, type) VALUES (#{first_name}, #{last_name}, #{address}, #{phone_no}, #{arrival_date}, #{place}, #{power_usage}, #{type});""")
ensure
close
end
end
end
class GuestController
attr_reader :guests
class Guest < Struct.new(:first_name, :last_name, :address, :phone_no, :arrival_date, :place, :power_usage, :type); end
def create_guests
'''Skapar 5 slumpmässiga gäster'''
if @guests.empty?
@guests << Guest.new("Bengt", "Larsson", "Tegelvägen 2", "111-115-511", "2009-15-03", 1, 2400, 2)
@guests << Guest.new("Sven", "Bengtsson", "Testvägen 3", "121-151-111", "2009-01-01", 2, 3000, 2)
@guests << Guest.new("Lena", "Svensson", "Rundvägen 5", "111-111-151", "2009-10-01", 3, 2550, 2)
@guests << Guest.new("Christer", "Andersson", "Testgatan 10", "111-151-111", "2009-05-01", 4, 3100, 2)
@guests << Guest.new("Annika", "Larsson", "Storgatan 2", "121-111-511", "2009-01-01", 5, 3200, 2)
@guests.each { |guest| $guests << guest }
(1..5).each do |num|
guest = @guests[num-1]
$places[guest.place] = guest.power_usage # Sparar elskåpets kapacitet för slumpanvändare
end
end
end
def initialize
@guests = []
create_guests
end
def add_guest(guest)
@guests << guest
$guests << guest
end
def create_guest(first_name, last_name, address, phone_no, arrival_date, place, power_usage, type)
return Guest.new(first_name, last_name, address, phone_no, arrival_date, place, power_usage, type)
end
def list_all_guests
'''Listar samtliga gäster som varit inskrivna'''
$guests.each do |guest|
puts guest.first_name + " " + guest.last_name
end
end
def list_current_guests
'''Listar aktuella gäster'''
places = {}
@guests.each do |guest|
places[guest.place] = guest.first_name + " " + guest.last_name
end
(1..48).each do |num|
place = places[num]
if place
puts num.to_s + ". " + place.to_s # Tar bort alla nummer
else
puts num.to_s + ". LEDIG"
end
end
end
end
class Economy
attr_reader :price_list
attr_writer :revenues
def initialize
'''Konstruktor'''
# Sätt dagens priser för hyra nedan
@price_list = {:Tent => 50, :Trailer => 100, :Cabin => 450, :Utility => 0.50 }
@revenues = {:Tent => [0, 0], :Trailer => [0, 0], :Cabin => [0, 0], :Utility => [0, 0]}
end
def print_price_list
puts """-------------------------------------------
Prislista
1. Tält - #{@price_list[:Tent]} / natt
2. Husbil/Husvagn - #{@price_list[:Trailer]} / natt
3. Stuga - #{@price_list[:Cabin]} / natt
4. Elektricitet för 2. #{@price_list[:Utility]} Kr / kWh
0. Återgå StartMeny
-------------------------------------------"""
input = gets.chomp
$rc.menu if input == '0'
end
def add_guest_revenue(type, price, nights, kwh=0)
case type
when 1
@revenues[:Tent][0] += nights
@revenues[:Tent][1] += price
when 2
@revenues[:Trailer][0] += nights
@revenues[:Trailer][1] += price
when 3
@revenues[:Cabin][0] += nights
@revenues[:Cabin][1] += price
when 4
@revenues[:Utility][0] += kwh
@revenues[:Utility][1] += price
end
end
def calculate_price(guest, nights)
price = 0
case guest.type
when 1
price = nights * @price_list[:Tent] # Baserat på 50kr/natt eftersom inget pris står specifierat i lab
add_guest_revenue(1, @price_list[:Tent], nights)
when 2
price += nights * 100
if guest.power_usage > 0
price += guest.power_usage * 0.5 # Baserat på 50 öre / kWh
add_guest_revenue(4, guest.power_usage * @price_list[:Utility], 0, guest.power_usage)
end
when 3
until nights == 0
if nights >= 7
price += 3000
nights -= 7
elsif nights <= 6
price += 450
nights -= 1
else
continue
end
end
add_guest_revenue(3, price, nights)
end
price
end
def edit_price_list
print_price_list
input = gets.chomp
case input
when '1'
puts "Skriv in ett nytt pris för tälthyra (per natt), nuvarande pris är: #{@price_list[:Tent]}"
@price_list[:Tent] = gets.chomp
when '2'
puts "Skriv in ett nytt pris för husbil/vagnshyra (per natt), nuvarande pris är: #{@price_list[:Cabin]}"
@price_list[:Trailer] = gets.chomp
when '3'
puts "Skriv in ett nytt pris för stughyra (per natt), nuvarande pris är: #{@price_list[:Cabin]}"
@price_list[:Cabin] = gets.chomp
when '4'
puts "Skriv in ett nytt pris för kilowattimmar, nuvarande pris är: #{@price_list[:Utility]}"
@price_list[:Utility] = gets.chomp
end
end
def print_revenues
puts """-------------------------------------------
Inkomster
1. Tält - #{@revenues[:Tent][0]} nätter och #{@revenues[:Tent][1]} kronor
2. Husbil/Husvagn - #{@revenues[:Trailer][1]} nätter och #{@revenues[:Tent][1]} kronor
3. Stuga - #{@revenues[:Cabin][0]} nätter och #{@revenues[:Cabin][1]} kronor
4. Elektricitet #{@revenues[:Utility][0]} antal kWh och #{@revenues[:Utility][1]} kronor i intänkter
0. Återgå StartMeny
-------------------------------------------"""
input = gets.chomp
$rc.menu if input == '0'
end
def spawn_menu
puts "1. Prislista\n2. Redigera prislista\n3. Summering intänkter\n\n0. Återgå StartMeny"
case gets.chomp
when '1'
print_price_list
when '2'
edit_price_list
when '3'
print_revenues
end
end
end
class RubyCamping
attr_reader :is_finished
def initialize
@guests = GuestController.new
@all_guests = $guests
@current_guests = @guests.guests
@economy = Economy.new
@db = DatabaseController.new("localhost", "root", "", "test", "Guests")
@db.open
end
def spawn_lists
puts "1. Lista aktuella gäster\n2. Lista samtliga gäster\n\n0. Återgå StartMeny"
case gets.chomp
when '1'
@guests.list_current_guests
when '2'
@guests.list_all_guests
when '0'
menu
end
end
def menu
puts """-------------------------------------------
Välkommen till Ruby Camping!
Meny
1. Incheckning
2. Utcheckning
3. Listor
4. Ekonomi
5. Avsluta
-------------------------------------------"""
get_input
end
def get_trailer_place
'''Returnerar en plats som inte är ockuperad'''
@all_guests.each do |guest|
number = 1 + rand(36)
if guest.place == number
next
else
return number
end
end
end
def get_power_amount(place)
'''Returnerar elskåpets förbrukning'''
if $places[place]
$places[place] # Returnerar elförbrukningen för ett visst elskåp på en viss plats
else
rand(2000) + 2000 # Annars returnera vi ett random nummer
end
end
def get_power_usage
rand(10) + 80
end
def get_house_place
@all_guests.each do |guest|
number = rand(12) + 36
if guest.place == number and guest.type == 3
next
else
return number
end
end
end
def check_in
print "Förnamn: "; first_name = gets.chomp
print "Efternamn: "; last_name = gets.chomp
print "Address: "; address = gets.chomp
print "Telefonnummer: "; phone_no = gets.chomp
print "Ankomstdatum (YYYY-MM-DD): "; arrival_date = gets.chomp
puts "Vill du ha; 1) Tält, 2) Husbil/Husvagn, eller 3) Stuga?"
case gets.chomp
when '1'
guest = @guests.create_guest(first_name, last_name, address, phone_no, arrival_date, 0, 0, 1)
$guests << guest
@guests.add_guest(guest)
@db.store_guest(first_name, last_name, address, phone_no, arrival_date, 0, 0, 1)
puts "Grattis du blev tilldelad en tältplats, vänligen parkera ditt tält där det finns plats"
when '2'
place = get_trailer_place
puts "Du blev tilldelad plats #{place.to_s}"
puts "Vill du ha el under uppställningstiden (J/N) ?"
case gets.chomp
when 'J'
power = get_power_amount(place)
power_usage = get_power_usage
puts "Du kommer förbruka #{(power_usage).to_s} kWh"
puts "Ditt tilldelade elskåp kan leverera #{(power).to_s} kWh"
$places[place] = power # Sparar ner initala elförbrukningen på elskåpet
end
guest = @guests.create_guest(first_name, last_name, address, phone_no, arrival_date, place, power_usage, 2)
@db.store_guest(first_name, last_name, address, phone_no, arrival_date, place, power_usage, 2)
@guests.add_guest(guest) # Registrerar gästen genom att lägga till den i listan..
$guests << guest
when '3'
place = get_house_place
puts "Grattis du blev tilldelad plats #{place.to_s}"
guest = @guests.create_guest(first_name, last_name, address, phone_no, arrival_date, place, 0, 3)
@guests.add_guest(guest) # Registrerar gästen genom att lägga till den i listan..
@db.store_guest(first_name, last_name, address, phone_no, arrival_date, place, 0, 3)
$guests << guest
end
end
def check_out
puts "Du har inte checkat in!" if @current_guests.empty?
i = 1
puts "Välj en gäst att avregistera: "
@current_guests.each do |guest|
puts i.to_s + ". " + guest.first_name + " " + guest.last_name
i += 1
end
index = (gets.chomp).to_i # Gör om till heltal så att vi kan räkna med det
# Eftersom en arrays index börjar på 0 och i är 1 tar vi minus ett
guest = @current_guests[index-1]
puts "Hur många nätter har du spenderat vid våran camping?"; nights = gets.chomp
price = @economy.calculate_price(guest, nights.to_i)
puts "Förnamn: " + guest.first_name
puts "Efternamn: " + guest.last_name
puts "Address: " + guest.address
puts "Telefonnummer: " + guest.phone_no
puts "Ankomstdatum: " + guest.arrival_date
puts "Elanvändning: " + guest.power_usage.to_s + " kWh" if guest.power_usage != 0
puts "Den totala summan blir: #{price.to_s}"
# Fixad bugg, programmet avslutades eftersom tält/stugor inte har någon
# elförbrukning
if guest.type == 2
$places[guest.place] += guest.power_usage # Plussar på elmätarens startvärde
end
## db.remove_quest(guest)
@current_guests.delete_at(index-1)
end
def get_input
input = gets.chomp
if input == '1'
check_in
elsif input == '2'
check_out
elsif input == '3' # Listor
spawn_lists
elsif input == '4'
@economy.spawn_menu
else
@is_finished = true
end
end
end
$rc = RubyCamping.new
until $rc.is_finished
$rc.menu
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment