// $Source: /usr/local/SimSoft/Sfx3D/src/gsl/regalver.h,v $
// $Revision: 1.2 $
// $Author: baum $
// $Date: 2001/11/29 15:18:10 $
//
// Login name of the user who locked the revision
// $Locker:  $
// Tag name used to checkout the file
// $Name:  $
// State assigned to revision
// $State: Exp $
//
//
// $Log: regalver.h,v $
// Revision 1.2  2001/11/29 15:18:10  baum
// -Realzeitsteuerung eingebaut
// -Handsteuerung eingebaut
//

#ifndef _REGALVER_H
#define _REGALVER_H     1

#include "Token.h"
#include "List.h"
#include "DynArray.h"

#include "bestell.h"
#include "baustein.h"

#ifdef _REGALVER_CPP
#  undef _impexp
#  define _impexp __declspec(dllexport)
#elif defined BUILD_MAIN_DLL
#  undef _impexp
#  define _impexp
#else
#  undef _impexp
#  define _impexp __declspec(dllimport)
#endif

#if defined __GNUC__ || defined __hpux
#  undef _impexp
#  define _impexp
#endif

#ifndef _PLATZ_H
class typPlatz;
#endif
class typRegaleinheit;
class typAbstrakteRegaleinheit;

//---------------------------------------------------------
// Klasse typRegalverwalter
//---------------------------------------------------------

class _impexp typRegalverwalter : public typBaustein {
  public:
    typRegalverwalter (unsigned n, unsigned b);
    virtual ~typRegalverwalter ();

    virtual void typTGSlesen (InputFile& file);
    virtual void typTPVlesen (InputFile& file);

    virtual void a_meldewarten ();

    virtual unsigned AnzahlArbeitsliste () const;
    virtual bool     hasKapazitaet (typTransportEinheit*) const;
    virtual unsigned Kapazitaet    () const;
    virtual unsigned setKapazitaet (unsigned wert);

    void Anforderung_naechste_TE (typBaustein *zB);

    virtual typBaustein* setZielBaustein (typTransportEinheit *zTE);

    bool WerkAusliefern (typTransportEinheit *zTE);

    virtual typBaustein* setVerwalter (typBaustein* newVerwalter);
    virtual typRegalverwalter* setBetreuer  (typRegalverwalter* newBetreuer);
    typBaustein* PoolBaustein (unsigned bstNr) const;

    virtual void ArbBestellung (unsigned idnr, unsigned istvorg, unsigned sollvorg, unsigned wieoft);
    virtual void TEBestellung (typTransportEinheit *te, unsigned sollvorg);
    virtual void ArtBestellung (unsigned idnr, unsigned istvorg, unsigned sollvorg, unsigned wieoft);

    virtual bool loescheArbBestellung (unsigned idnr, unsigned istvorg);
    virtual bool loescheTEBestellung (typTransportEinheit *te);
    virtual bool loescheArtBestellung (unsigned idnr, unsigned istvorg);

    void DruckeArbeitsListe () const;
    virtual typTransportEinheit* GibProjektIDTE (unsigned idnr = 0, unsigned projektID = 0, unsigned suchID = 0);
    virtual unsigned AnzahlArbeitsplanVorhanden  (unsigned arbNr, unsigned istv = 0) const;
    virtual unsigned AnzahlArtikelVorhanden     (unsigned artNr, unsigned istv = 0) const;
    virtual double   MengeArbeitsplanVorhanden   (unsigned arbNr, unsigned istv = 0) const;
    virtual double   MengeArtikelVorhanden      (unsigned artNr, unsigned istv = 0) const;

    virtual unsigned AnzahlArbeitsplanBestellbar (unsigned arbNr, unsigned istv = 0) const;
    virtual unsigned AnzahlProjektIDBestellbar (unsigned artNr, unsigned suchID) const;
    virtual unsigned AnzahlArtikelBestellbar    (unsigned artNr, unsigned istv = 0) const;
    virtual double   MengeArbeitsplanBestellbar  (unsigned arbNr, unsigned istv = 0) const;
    virtual double   MengeArtikelBestellbar     (unsigned artNr, unsigned istv = 0) const;

    virtual void ArbZuweisen  (unsigned was, unsigned wohin,
                               unsigned istVorg, unsigned sollVorg,
                               unsigned wieoft);
    virtual void ArtZuweisen  (unsigned was, unsigned wohin,
                               unsigned istVorg, unsigned sollVorg,
                               unsigned wieoft);

    DynArray<typRegaleinheit>& gibRegale();                              
    typRegaleinheit* einlagern_zielorientiert (typTransportEinheit *zTE);//public gemacht von miro 14.10.2003 11:57
    bool isZuweisbar (typRegaleinheit* zR) const;//public gemacht von miro 15.10.2003 16:20

  private:
    virtual void individuellAktivieren (typBaustein* vonWem);
    void BestAusliefern (Bestellzettel *zBZ);

    typBaustein* ZuweisungAusfuehren          (typTransportEinheit* zTE);
    typRegaleinheit* Regal_zuweisen           (typTransportEinheit *zTE); // erweitert wegen Zielorientiert einlagern
    typRegaleinheit* voll_Regal_zuweisen      ();
    typRegaleinheit* einlagern_Poolliste      ();
    typRegaleinheit* einlagern_gleichverteilt ();
    //typRegaleinheit* einlagern_zielorientiert (typTransportEinheit *zTE);
    void auslagermelden (char* str);

    //bool isZuweisbar (typRegaleinheit* zR) const;

    void meldeBetreuTeil      (const typTransportEinheit&);
    void meldeBestellFaehig   (const typTransportEinheit&);
    void loescheBestellFaehig (const typTransportEinheit&);

    typRegalverwalter* ObjBetreuer;
    typRegalverwalter* ObjVerwalter;

    List<typTransportEinheit> ObjBestellFaehig;
    List<typTransportEinheit> ObjBetreuTeile;
    List<Bestellzettel> ObjArbeitsliste;
    List<Zuweisung> ObjZuweisungen;
    DynArray<typRegaleinheit> ObjRegale;

  // friends
  friend class typRegaleinheit;
  friend class typAbstrakteRegaleinheit;
};

#endif
