#include"JWI_Klassen_Bestellung.h"
#include"JWI_Klassen_Lieferschein.h"
#include"JWI_Klassen_Geschaeftspartner.h"
#include"JWI_Klassen_Produkt.h"



class Verwaltung
{
	// Attribute
	int zaeler_knr;		//	zuletzt vergebene Kundennummer
	int zaeler_bnr;		//	zuletzt vergebene Kunden- oder Nachbestellungsnummer
	int zaeler_lnr;		//	zuletzt vergebene Lieferantennummer
	int zaeler_pnr;		//	zuletzt vergebene Produktnummer
	int zaeler_lsnr;	//	zuletzt vergebene Lieferscheinnummer
	KundenbestellungenKartei kundenbestellungen;//	Liste aller aktuellen Kundenbestellungen
	NachbestellungenKartei nachbestellungen;	//	Liste aller aktuellen Nachbestellungen
	LieferKartei liefer_kartei;					//	aktuelle Lieferkartei
	WarteKartei warte_kartei;					//	aktuelle Wartekartei
	KundenKartei kunden;						//	Liste aller Kunden
	LieferantenKartei lieferanten;				//	Liste aller Lieferanten
	ProduktKartei produkte;						//	Liste aller lieferbaren Produkte
	LieferscheinListe lieferscheine;			//	Liste aller Lieferscheine
	
	//	Operationen:
	public:

	//	Konstruktor - initialisiert das System bei jedem Programmstart
		Verwaltung(void): zaeler_knr(0), zaeler_bnr(0),
			zaeler_pnr(0), zaeler_lsnr(0)
			{
				//	Listen werden durch die Aufzählung unter Attributen initialisiert
			}

	//	Destruktor
		~Verwaltung(void)
		{
			//	speichert erst alle mit dem Konstructor erzeugten Listen
			DatenSpeichern();

			//	Lösche alle durch den Konstructor erzeugten Listen
		}


	//	speichert die Inhalte sämtlicher Listen und Karteien der Klasse Verwaltung
	//	und das aktuelle Datum
		void DatenSpeichern(void);

	//	läd die Daten sämtlicher Listen und Karteien die von der Klasse Verwaltung 
	//	benötigt werden; am Schluß wird das Datum der Datenspeicherung angegeben
		void DatenLaden(void);


	//	alle use-cases bzw. Funktionen des Programmes haben eine Operation in dieser Klasse


	//	Annahme einer neuen Kundenbestellung und direkte anschließende Bearbeitung
		void BestellungAnnehmenUndBearbeiten(void);

	//	Bestellt die Fehlbestände zu einem bestimmten Zeitpunkt nach
		void FehlbestaendeNachbestellen(void);

	//	Erstellen der Lieferscheine für die Auslieferung der Bestellungen	
		void LieferscheineErstellen(void);

	//	Bearbeitung des Einganges von Lieferungen, d.h.Lageranpassung
		void WareneingangBearbeiten(void);

	//	Bearbeitung von Rücklauf einer Auslieferung, d.h. Anpassung der Lieferkartei
		void RuecklaufBearbeiten(void);

	//	Hinzufügen eines neuen Kunden zur Kunden-Liste	
		void NeuerKunde(void);

	//	Hinzufügen eines neuen Lieferanten zur Lieferanten-Liste
		void NeuerLieferant(void);

	//	Hinzufügen eines neuen Produktes zur Produkt-Liste
		void NeuesProdukt(void);

	//	Ändern der Daten bereits existierender Kunden
		void KundendatenAendern(void);

	//	Ändern der Daten bereits existierender Lieferanten
		void LieferantendatenAendern(void);

	//	Ändern der Daten bereits existierender Produkte
	//	darüber können auch minimale und maximale Lagerbestände geändert werden
		void ProduktdatenAendern(void);

	//	Ändern einer Nachbestellung, d.h. derjenigen Daten, 
	//	die nicht durch das System vorgegeben werden - wie Bestellungsnummer ect.
	//	darüber können auch Bestellposten geändert werden
		void NachbestellungAendern(void);

	//	Ändern einer Kundenbestellung, d.h. derjenigen Daten,
	//	die nicht durch das System vorgegeben werden - wie Bestellungsnummer ect.
	//	darüber können auch Bestellposten geändert werden
		void KundenbestellungAendern(void);

	//	löscht die schon bearbeiteten Nachbestellungen
		void BearbeiteteNachbestellungenLoeschen(void);

	//	löscht die schon bearbeiteten Kundenbestellungen
		void BearbeiteteKundenbestellungenLoeschen(void);


	//	Hilfsoperationen
	private:

	//	sucht in der Kundenbestellungs-Kartei zu einer gegebenen Bestellungsnummer 
	//	die zugehörige Kundenbestellung
	//	wird die Kundenbestellung nicht gefunden, so wird ein Objekt Kundenbestellung zurückgegeben,
	//	dessen Bestellungsnummer bnr=0 ist!
		Kundenbestellung SucheKundenbestellung(int bestellnr);

	//	sucht in der Nachbestellungs-Kartei zu einer gegebenen Lieferantennummer
	//	die zugehörige Nachbestellung
	//	wird die Kundenbestellung nicht gefunden, so wird ein Objekt Nachbestellung zurückgegeben,
	//	dessen Bestellungsnummer bnr=0 ist!
		Nachbestellung SucheNachbestellungLieferantenNr(int lieferantennr);

	//	sucht zuerst in der Liefer-Kartei und dann in der Warte-Kartei
	//	zu einer gegebenen laufenden Bestllpostennummer den zugehörigen Bestellposten
	//	wird der Bestellposten nicht gefunden, so wird ein Objekt Bestellposten zurückgegeben,
	//	dessen laufende Bestellpostennummer lfdnr=0 ist!
		Bestellposten SucheBestellposten(int laufendenr);

	//	sucht in der Kundenkartei zu einer gegebenen Kundennummer den zugehörigen Kunden
	//	wird der Kunde nicht gefunden, so wird ein Objekt Kunde zurückgegeben,
	//	dessen Kundennummer knr=0 ist!
		Kunde SucheKunden(int kundennr);

	//	sucht in der Lieferantenkartei zu einer gegebenen Lieferantennummer
	//	den zugehörigen Lieferanten
	//	wird der Lieferant nicht gefunden, so wird ein Objekt Lieferant zurückgegeben,
	//	dessen Lieferantennummer lnr=0 ist!
		Lieferant SucheLieferanten(int lieferantennr);
				
	//	sucht in der Produktkartei zu einer gegebenen Produktnummer das zugehörige Produkt
	//	wird das Produkt nicht gefunden, so wird ein Objekt Produkt zurückgegeben,
	//	dessen Produktnummer pnr=0 ist!
		Produkt SucheProdukt(int produktnr);

	//	sucht in der Lieferschein Liste zu einer gegebenen Bestellpostennummer
	//	den zugehörigen Lieferschein
	//	wird der Lieferschein nicht gefunden, so wird ein Objekt lieferschein zurückgegeben,
	//	dessen Lieferscheinnummer lsnr=0 ist!
		Lieferschein SucheLieferscheinBestellungsNr(int bestellungsnr);
				
	//	Algorithmus, der einem Lieferschein einen Lieferwagen zuordnet
		int BestimmeLieferwagenNummer(Lieferschein liefers);
};
