Created
July 30, 2009 17:23
-
-
Save jolts/158792 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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