//	****************************************************************************
//	*	$VER: RechnungArtikel.h 1.08 25.02.2000											*
//	****************************************************************************
//	*	Include für MT-Rechnung III, Enthält die die Klasse(n) für die Ein-		*
//	*	gamgsrechnungsverwaltung, soweit es um reine Datenverarbeitung geht.		*
// *	Für Bildschirmdarstellung und ähnliches ist ein anderes Include			*
// *	zuständig.																					*
//	****************************************************************************
//	*	Programmiersprache:	C++																*
//	*	Compiler:				Maxon C++ (Version 3.00)									*
//	*	Portierung:				keine AMIGA-spezifischen Teile							*
//	*	Programmierer:			Manfred Tremmel												*
//	****************************************************************************
//    Copyright (C) 1997-2001 Manfred Tremmel
//
//    This program is free software; you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation; either version 2 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program; if not, write to the Free Software
//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA

// Artikeldaten
class RechnungArtikelDaten
{public:
	UWORD							Status;					// 0	= alles OK
																// 1-0xfffe	= gesperrt
																// 0xffff	= gelöscht
	ULONG							Artikelnummer;			// verweis auf Artikeldatei
	ULONG							NaechsterArtikel;		// verweis auf nächsten Artikel
	DOUBLE						Artikelanzahl;			// Anzahl der Artikel
	DOUBLE						Artikelpreis;			// Aus Artikeldatei übernommener
																// Preis
	UBYTE							ZuAbNummer[3];			// Nummer des Zu-/Abschlags in den Prefs (V1.02)
	UBYTE							ZuAbTyp[3];				// Zu-/Abschlagstypen (V1.02)
																// 0  = Zuschlag Prozentual
																// 1  = Zuschlag Wert je Einheit
																// 2  = Zuschlag Wert je Verpachungseinheit
																// 3  = Zuschlag Wert je Lieferantenverpachungseinheit
																// 4  = Zuschlag Wert absolut
																// 5  = Abschlag Prozentual
																// 6  = Abschlag Wert je Einheit
																// 7  = Abschlag Wert je Verpachungseinheit
																// 8  = Abschlag Wert je Lieferantenverpachungseinheit
																// 9  = Abschlag Wert absolut
	TEXT							Frei[2];					// derzeit nicht belegt
	UBYTE							MWSt;						// MWSt-Kennzeichen 0-9
	BOOL							Preisaender;			// wurde der Preis manuell geändert
	DOUBLE						ZuAbWert[3];			// Zu-/Abschlagsvorgabe Wert/Prozent
																// je nach ZuAbNummer (V1.02)
	DOUBLE						Verpackung;				// Verpackungsgroesse
																// nur vielfache davon sind moeglich
	DOUBLE						VerpackungLief;		// " bei Lieferant, fuer Nachbest.
	TEXT							Bemerkung[200];		// Zusatztext-/Bemerkung (V1.02)
	DOUBLE						PreisEinheit;			// Preiseinheit (V1.02)
};

// Einzelne Artikelpositionen
class MTRech_Art
{
 public:
	MTRech_Art* PrevArtikel;
	MTRech_Art* NextArtikel;

	ULONG							DB_Position;
	RechnungArtikelDaten		ZuOrdnungTab;
	ArtikelDaten				ArtikelDaten;
	ULONG							Artikelfehler;		// 0 = OK
															// 1 = Artikel gelöscht
															// 2 = Menge nicht durch Verpackungseinheit teilbar
															// 4 = Unzureichender Bestand
	DOUBLE						MengeMerker;
	ULONG							ArtikelMerker;
	DOUBLE						Einzelpreis[4];
	DOUBLE						Einzelpreis_minus_ZuAb[4];
	DOUBLE						Positionssumme[4];
	DOUBLE						Pos_Summe_minus_ZuAb[4];
	DOUBLE						ZuAbEinzelwert[3][4];
	DOUBLE						ZuAbPosition[3][4];
};


class Rechnung;

class RechnungArtikel : public DataBase
{
	// Position des übergebenen Artikels mit dem darunter tauschen
	// Übergabe:	Runter			= Pointer auf den Artikel
	void PositionTausche( MTRech_Art* );
 public:

	Rechnung			*MyRechnung;
	UBYTE				*RStatus;

	RechnungArtikelDaten	*AltDaten;
	RechnungArtikelDaten	*Daten;

	UBYTE				*Waehrung_KZ;
	UBYTE				*Artikel_KZ;

	MTRech_Art*		FirstArtikel;
	MTRech_Art*		LastArtikel;

	MTRech_Art*		AktArtikel;

	// Kostruktor
	// Übergabe:	Dateiname		= Name des Files der Datenbank
	//					Datenbankbez	= Bezeichnung der Datenbank
	//					User				= Nummer des Benutzers (Key in der Mitarbeiter-DB
	RechnungArtikel( STRPTR, STRPTR, UWORD);
	// Destruktor, am Ende aufräumen
	~RechnungArtikel();

	// Initialisierung der Datenbankstruktur
	// Übergabe:	InitDaten		= String-Pointer auf die zu initialisierende DB-Struktur
	void Initialisiere( STRPTR );

	// Datensatz schreiben
	void UpDateElement();

	// Artikel in die Liste aufnehmen
	// Übergabe:	Pos			= Position in der Datenbank
	//					AD				= Pointer auf die Artikeldaten
	void AddArtikel( ULONG, ArtikelDaten* );
	// aktuellen Artikel aus der Liste entfernen
	void RemoveArtikel();
	// alle Artikel aus der Liste entfernen
	void RemoveAllArtikel();
	// Aktiviert einen bestimmten Artikel
	// Übergabe:	Position		= Nummer des Artikels im Beleg
	void FindArtikel( ULONG );
	// Ändert die Menge des aktuellen Artikels
	// Übergabe:	MengeAender	= Die neue Artikelmenge
	void Mengenaenderung( DOUBLE );
	// Neuermittlung des Preises für den aktuellen Artikel
	void Preisermittlung();
	// Neuermittlung des Preises für alle Artikel
	void PreisermittlungAlle();
	// Ermittlung der Positionssumme und der Zu-/Abschläge
	void PositionsSumme();
	// Aktuelle Position eins nach unten innerhalb der Positionsliste
	void PositionRunter();
	// Aktuelle Position eins nach oben innerhalb der Positionsliste
	void PositionRauf();

	// Löschen eines Artikels aus der Rechnung
	// Übergabe:	Position		= Position innerhalb des Belegs
	// Rückgabe:	Fehlerprüfung erneut durchführen Ja/Nein
	BOOL LoescheArtikel( ULONG );
	// Neue Position in die Datenbank einfügen und in den aktuellen Beleg aufnehmen
	void NeuerArtikel();

	// Druckausgabe für Einzelbeleg einzelnen String für Position
	// Übergabe:	os				= Pointer auf den Ausgabestream
	//					start			= Startstring der Variablen
	//										/AR : Ausgangsrechnungen
	//										/ER : Eingangsrechnungen
	void PrintString( ofstream*, STRPTR );
	// Druckausgabe für eine Listenaufbereitung für die Position
	// Übergabe:	os				= Pointer auf den Ausgabestream
	//					Art				'1' = Einzelbeleg
	//										'2' = Liste
	//										'3' = kompakte Liste
	//					von			= in dem Fall ohne Bedeutung
	//					bis			= in dem Fall ohne Bedeutung
	//					Vergleichsfunktion	= in dem Fall ohne Bedeutung
	//					Verknuepf	= in dem Fall ohne Bedeutung
	void PrintTabelle( ofstream*, UBYTE, ULONG, ULONG, DataBaseSearch*, UWORD*, ULONG );
	// Druckvorbereitungen
	// Übergabe:	os 			= Pointer auf den Ausgabestream
	//					Art			=	'1' = Einzelbeleg
	//										'2' = Liste
	//										'3' = kompakte Liste
	void PrintVorbereiten( ofstream*, UBYTE );

	// (A)Rexx-lesen des Satzes
	// Übergabe:	rxmsg = Pointer auf den Rexx Message Struktur
	//					Position = gewünschte Rechnung
	// Rückgabe:	0 = Ok
	//					2 = Fehler aufgetreten
	ULONG GetRexx( struct RexxMsg *, ULONG, STRPTR );
	
	// (A)Rexx-schreiben des Satzes
	// Übergabe:	rxmsg		= Pointer auf den Rexx Message Struktur
	//					Position	= gewünschte Rechnung
	// Rückgabe:	0 = Ok
	//					2 = Fehler aufgetreten
	ULONG SetRexx( struct RexxMsg *, ULONG, STRPTR );
}; 