Namn: Mikael Djurfeldt
Personnummer: ......-....
P-uppgiftsnummer: 100

Användargränssnitt
==================

Programmet presenterar en meny:

1. Visa alla kunder
2. Visa alla kunder som kan få gratis klippning
3. Nytt besök (klippning)
4. Registrera ny kund
5. Avsluta
Välj:

Om 1 väljs:
Anka, Anna 750103-0989 har klippt sig 4 ggr
Karlsson, Gustav 750105-0999 har klippt sig 5 ggr
...

Om 2 väljs:
Karlsson, Gustav 750105-0999 har klippt sig 5 ggr
...

Om 3 väljs:
Ange kundens personnummer: 750105-0999
Karlsson, Gustav 750105-0999 har klippt sig 5 ggr
Klippningen är gratis.

alt.

Ange kundens personnummer: 750105-0999
Karlsson, Gustav 750105-0999 har klippt sig 6 ggr
Klippning registrerad.

alt.

Ange kundens personnummer: 800720-4465
Hittade ej kund med det personnumret.
Vill du lägga till kunden? ja
Ange förnamn: Helena
Ange efternamn: Fridebäck
Ny kund har registrerats

Om 4 väljs:
Ange förnamn: Pelle
Ange efternamn: Ollesson
Ange personnummer: 810417-2213
Ny kund har registrerats


Algoritm
========

Programmets huvudalgoritm:

1. Rekonstruera databasen från fil (genom anrop till Database.readFromFile)
2. Skriv ut huvudmenyn genom anrop till mainMenu ()
3. Programmet läser in användarens svar och väljer:
3.1 Om 1, anropa showCustomer () (visa alla kunder)
3.2 Om 2, anropa showFreeCuts () (visa kunder med gratis klippning)
3.3.Om 3, anropa newVisit () (nytt besök (klippning))
3.4 Om 4, anropa newCustomer () (registrera en ny kund)
3.5 Om 5, anropa quitProgram () (spara databasen på fil)
4. Om ej 5, gå till steg 2

newCustomer:
1. Begära in data från användaren om kunden
2. anropa database.add (customer)

newVisit:
1. Fråga efter personnummer
2. Använd database.lookup för att slå upp kund
3. Om personnummer fanns
       Registrera klippning
   Annars
       Ska ny kund skapas?
           Skapa ny kund med en klippning registrerad

Database.add (customer):

Här måste vi uppdatera både listan och tabellen över kunder.

1. Lägg till kunden i tabellen (dict) över kunder
2. Lägg till kunden i listan av kundobjekt
3. Sortera listan


Datastrukturer och funktioner
=============================

class Database:
    # Konstruktör för databasen
    # filename: Kundregistrets filnamn
    def __init__ (self, filename):
        # lista för lagring av kunder i bokstavsordning
	self.customerList
	# tabell för snabbt uppslag av kund på basis av pnr
        self.customerDict

    # Lägger till ny kund i databasen
    # customer: instans av Customer
    def add (self, customer):

    # Slå upp kund från personnummer
    # pnr: personnummer (sträng)
    # Returner kundobjektet
    def lookup (self, pnr):

    # Lista med alla kunder
    # Returnerar en lista med kundobjekt
    def customers (self):

    # Lista med de kunder som har gratis klippning
    def bonusCuts (self):

    # Läs in databasen från fil
    def readFromFile (self)

    # Skriver ut databasen på fil
    def writeToFile (self)

    # Stänger ned databasen
    # Skriver ut databasen på fil genom anrop till writeToFile
    def close (self)


class Customer:
    # Konstruktör för kund
    # name:    Kundens förnamn
    # surname: Kundens efternamn
    # pnr:     Kundens personnummer
    # nVisits: Antal besök (default 0)
    def __init__ (self, name, surname, pnr, nVisits = 0):

    # Returnera strängrepresentationen av en kund på formatet:
    # EFTERNAMN, FÖRNAMN PERSONNUMMER
    def __str__ (self)

    # Jämförelseoperator för kunder
    # other: kunden vi jämför med
    def __lt__ (self, other)

    # Returnera sant om kund får gratis klippning
    def hasBonusCut (self):

# Funktion för att skriva ut programmets huvudmeny
# Returnerar användarens svar (heltal mellan 1 och 5)
def mainMenu ()

# Listar alla kunder
def showCustomers ()

# Listar kunder med kommande bonusklippningar
def showBonusCuts ()

# Ny klippning
def newVisit ()

# Lägg till ny kund
# Begär in namn, efternamn och personnummer från användaren
# och lägg in i databasen. Om personnumret inte finns, fråga
# om det ska läggas till.
def newCustomer ()

# Avsluta programmet (se till att databasen sparas)
def quitProgram ()


Filformat (customers.dat):

Förnamn1
Efternamn1
Pnr1
Antal klippningar1
Förnamn2
Efternamn2
Pnr2
Antal klippningar2
...
