//	****************************************************************************
//	*	$VER: ERechnung.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-2000 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

// Eingangsrechnung Daten
class ERechnungDaten
{public:
	UWORD							Status;					// 0	= alles OK
																// 1-0xfffe	= gesperrt
																// 0xffff	= gelöscht
	ULONG							Bestellernummer;		// Nummer des Bestellers
	ULONG							Niederlassung;			// Nummer der Niederlassung
	TEXT							LiefRechNr[20];		// Rechnungsnummer beim Lieferanten
	ULONG							LieferantenNr;			// Nummer des Lieferanten
	ULONG							ErsterArtikel;			// Nummer des ersten Artikels
																// in der RechnungArtikel-Datei
	UBYTE							RStatus;					// Rechnungsstatus
																// 0 = Bestellt
																// 1 = Bestätigt/Lieferschein
																// 2 = Rechnung (unbezahlt)
																// 3 = Wareneingang
																// 4 = Rechnung (1* gemahnt)
																// 5 = Rechnung (2* gemahnt)
																// 6 = Rechnung (3* gemahnt)
																// 7 = Rechnung (mahnverfahren)
																// 8 = storniert
																// 9 = Rechnung bezahlt
	UBYTE							HStatus;					// Häufigkeit
																// 0 = 1 malig
																// 1 = täglich
																// 2 = wöchentlich
																// 3 = monatlich
																// 4 = quartalsmässig
																// 5 = halbjährlich
																// 6 = jährlich
	DOUBLE						Rabatt;					// Rabatt in Prozent entfällt mit V1.02
	DOUBLE						Skonto;					// Skonto in Prozent
	DOUBLE						Versandkosten;			// Versandkosten
	UBYTE							VersMWSt;				// MWSt-Kennzeichen 0-9
	UBYTE							SkoRab;					// Skonto und Rabatt auch auf
																// Versandkosten
																// 0 = Keines von beiden
																// 1 = Nur Skonto
																// 2 = Nur Rabatt
																// 3 = Beides moeglich
	DOUBLE						Zusatzkosten;			// Versandzusatzkosten
																// generell ohne Skonto und Rabatt
	struct DateStamp			BestDatum;				// Bestelldatum
	struct DateStamp			LDatum;					// Bestätigungs-/Lieferscheindatum
	struct DateStamp			RDatum;					// Rechnungsdatum
	struct DateStamp			WDatum;					// Wareneingangsdatum
	struct DateStamp			MahnDatum[4];			// Mahnungs- + Mahnverfahrendaten
	struct DateStamp			SDatum;					// storniert
	struct DateStamp			BDatum;					// Bezahl-Datum
	struct DateStamp			HDatum;					// Nächster Termin (bei HStatus > 0)
	DOUBLE						MWSt[10];				// aus Prefs übernommene MWSt-Saetze
	TEXT							Bemerkung[160];		// Bemerkung
	UBYTE							Waehrung_KZ;			// Währungskennzeichen:
																// 0 = Währung 1 netto
																// 1 = Währung 1 brutto
																// 2 = Währung 2 netto
																// 3 = Währung 2 brutto
	UBYTE							ZusMWSt;					// Mehrwertsteuerkennzeichen Zusatzkosten
	UBYTE							Preissystem;			// Preissystemkennzeichen:											(V1.01)
																// 0 = Kundenpreis
																// 1 = Händlerpreis
																// 2 = Lieferantenpreis
	BOOL							MWStBefreit;			// Mehrwertsteuerbefreit											(V1.01)
	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
	DOUBLE						ZuAbWert[3];			// Zu-/Abschlagsvorgabe Wert/Prozent
																// je nach ZuAbNummer												(V1.02)
	UBYTE							MWSt_Typ[10];			// Mehrwertsteuer Typ												(V1.04)
	UWORD							Konto_Zahlung_Ein;	// Buchungskonto der Zahlung bei Eingängen					(V1.04)
	BOOL							Gebucht;					// Kennzeichen, ob der Auftrag bereits gebucht ist			(V1.04)
	DOUBLE						Bezahlt;					// Bezahlter Betrag (für Barbelege)								(V1.07)
	BOOL							Barbeleg;				// Barbeleg, wird über das Kassenbuch abgewickelt			(V1.07)
};

class ERechnung : public Rechnung
{
	ERechnungDaten			*AltDaten;

 public:

	ERechnungDaten			*Daten;

	LieferantenDaten		LiefLief;
	AdressDaten				LiefAdress;

	// Kostruktor
	// Übergabe:	Dateiname		= Name des Files der Datenbank
	//					Datenbankbez	= Bezeichnung der Datenbank
	//					User				= Nummer des Benutzers (Key in der Mitarbeiter-DB
	ERechnung( STRPTR, STRPTR, UWORD);

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

	// Suchfelder die nicht durch die allgemeine Suchfunktion abgedeckt
	// werden können, hier separat abhandeln
	// Übergabe:	SuchKlasse		= Pointer auf eine DataBaseSearch-Klasse
	// Rückgabe:	Gefunden ja/nein
	BOOL SuchVergleich( DataBaseSearch* );
	
	// War die Suchfunktion erfolgreich, hier die entsprechenden Daten
	// in eine Liste hängen
	// Übergabe:	SuchListe		= Pointer auf eine ListenClass-Klasse an die der
	//										  aktuelle DB-Satz angehängt wird
	void SuchListeAnhaengen(ListenClass*);

	// Lesen des Rechnungskopfes und all seiner Positionen
	// Adresse des Lieferanten, ...
	void LesenGesamtRech();

	// Rechnungskopf schreiben
	void UpDateElement();
	// Beleg löschen
	void LoeschenAkt();

	// Versandart und -kosten ermitteln
	void Versandermitteln();

	// Bei Versionsupdates von MT-Rechnung III erfolgt hier der UpDate
	// der Datenbank. Übergabeparameter ist die Versionsnummer der DB
	// vor dem UpDate
	// Übergabe:	AlteVersion		= StringPointer auf die alte Versionsnummer
	void UpdateSatz( STRPTR );

	// Statuswechsel einer Ausgangsrechnung Alt -> Neu
	// Übergabe:	StatusAlt		= Status vor dem Update
	//					StatusNeu		= Status nach dem Update
	// Rückgabe:	Fehler aufgetreten ja/nein
	BOOL Statuswechsel( UBYTE, UBYTE );

	// Rechnungssumme geändert?
	// Übergabe:	 Versandkennzeichen:	hier ohne Bedeutung
	void Summenaenderung( BOOL );
	
	// Automatische Bestellfunktion
	// Übergaben:	Status:		1 = Bestellungen erstellen
	//									2 = Bestellungen erstellen und drucken
	// Rückgabe:	Anzahl Bestellungen
	ULONG Bestellautomatik( UBYTE );

	// Druckvorbereitungen
	// Übergabe:	os = Pointer auf den Ausgabestream
	//					Art	'1' = Einzelbeleg
	//							'2' = Liste
	//							'3' = kompakte Liste
	void PrintVorbereiten( ofstream*, UBYTE );

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

	// Buchführung in künftigen Versionen....
	// Rückgabe:	Buchung durchgeführt ja/nein
	BOOL Buchen();
};

