#pragma +
// Name:						BuchenPos
// Programmtyp:			Hilfsroutine für
//								Fakturierprogramm
//	Programmiersprache:	C++ (AT&T Standard 3.0)
// Computersystem:		Commodore AMIGA
// Betriebssystem:		AMIGA OS3.0 oder höher
// Autor:					Manfred Tremmel
// © Copyright:			1997-2000 by MT Graphic & Design
// Version:					V1.08
//
//    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


// Includes:
#include <new.h>
#include <clib/dos_protos.h>
#include <stdlib.h>
#include <stdio.h>

#include "MTList.h"
#include "MTLocale.h"
#include "Datenbank.h"
#include "BuchenPos.h"
#include "Buchen.h"
#include "Einstellungen.h"
#include "LocaleStrings.h"
#include "MTARexx.h"

extern OpenLocaleClass	*MyLocalePTR;
extern Prefs				*MyPrefsPTR;
extern Buchen				*MyBuchenPTR;

// ARexx-Port Auswertung
extern MTARexx				MyARexx;

BuchenPos::BuchenPos(STRPTR Dateiname, STRPTR Datenbankbez, UWORD User ) : DataBase( Dateiname, Datenbankbez, User, sizeof(BuchenPosDaten), 0 )
{
	Daten = (BuchenPosDaten *)UserData;

	Such_DB_Anzahl		= 1;
	Such_DB_Feld		= new void*[Such_DB_Anzahl];
	Such_DB_Typ			= new UBYTE[Such_DB_Anzahl];
	Such_DB_CS			= new STRPTR[Such_DB_Anzahl];

	Such_DB_Feld[0]	= NULL;
	Such_DB_Typ[0]		= 0;
	Such_DB_CS[0]		= NULL;

	Such_DB_Nr			= 10;

	FirstBuchung		= NULL;
	LastBuchung			= NULL;
	AktBuchung			= NULL;

	Such_DB_Felder_Laenge = strlen( AppStrings[MSG_Such_Adr_Dummy] ) + 1;
	Such_DB_Felder_String = new TEXT[ Such_DB_Felder_Laenge ];

	strcpy( Such_DB_Felder_String, AppStrings[MSG_Such_Adr_Dummy] );
	Such_DB_Felder_String[(Such_DB_Felder_Laenge - 2)] = 0;


	struct DruWert BuchungPosDruWert[] =
	{
		{"",							"",  NULL, 0, "", FALSE}
	};

	DruckWertInit( BuchungPosDruWert );
};

BuchenPos::~BuchenPos()
{
	RemoveAllBuchen();	
};

void BuchenPos::Initialisiere( STRPTR InitDaten )
{
	DataBase::Initialisiere( InitDaten );
};

void BuchenPos::UpDateElement()
{
	AltDaten			= (BuchenPosDaten *)UnDoBuffer[UnDoUsed];

	memcpy( (void *)&AktBuchung->ListeBuchenDaten, (const void *)Daten, sizeof(BuchenPosDaten) );

	DataBase::UpDateElement();
};

void BuchenPos::LesenBuchenListe()
{
	RemoveAllBuchen();

	if( MyBuchenPTR->Daten->ErstesBuchung )
	{
		for( ULONG AktPos = MyBuchenPTR->Daten->ErstesBuchung; AktPos; AktPos = Daten->NextBuchung )
		{
			GetElementNr( AktPos );
			AddBuchung( AktElementNr );
		}
	}
};

void BuchenPos::AddBuchung( ULONG Pos )
{
	if( Pos )
	{
		AktBuchung						= new MTBuchen_Pos;
		AktBuchung->DB_Position	= Pos;
		memcpy( (void *)&AktBuchung->ListeBuchenDaten, (const void *)Daten, sizeof(BuchenPosDaten) );

		if( FirstBuchung )
		{
			LastBuchung->NextBuchung	= AktBuchung;
			AktBuchung->PrevBuchung	= LastBuchung;
		}
		else
		{
			FirstBuchung				= AktBuchung;
			AktBuchung->PrevBuchung	= NULL;
		}
		AktBuchung->NextBuchung		= NULL;
		LastBuchung					= AktBuchung;
	}
};

void BuchenPos::RemoveBuchung()
{
	if( AktBuchung )
	{
		if( AktBuchung->NextBuchung )
			AktBuchung->NextBuchung->PrevBuchung = AktBuchung->PrevBuchung;
		else
			LastBuchung = AktBuchung->PrevBuchung;

		if( AktBuchung->PrevBuchung )
			AktBuchung->PrevBuchung->NextBuchung = AktBuchung->NextBuchung;
		else
			FirstBuchung = AktBuchung->NextBuchung;

		delete AktBuchung;
		AktBuchung = NULL;
	}
};

void BuchenPos::RemoveAllBuchen()
{
	MTBuchen_Pos *Hilfe	= LastBuchung;
	MTBuchen_Pos *DelBuchung;

	while( Hilfe )
	{
		DelBuchung = Hilfe;
		Hilfe 	= DelBuchung->PrevBuchung;
		delete DelBuchung;
	}

	FirstBuchung	= NULL;
	LastBuchung		= NULL;
	AktBuchung		= NULL;
};

void BuchenPos::FindBuchung( ULONG Position )
{
	AktBuchung		= FirstBuchung;

	for( ULONG i = 0; AktBuchung && (i < Position); i++ )
	{
		AktBuchung = AktBuchung->NextBuchung;
	}
};

BOOL BuchenPos::LoescheBuchung( ULONG Position )
{
	BOOL ReturnWert = FALSE;

	FindBuchung( Position );

	RemoveBuchung();

	if( Position == 0 )
	{
		if( FirstBuchung )
			MyBuchenPTR->Daten->ErstesBuchung = FirstBuchung->DB_Position;
		else
			MyBuchenPTR->Daten->ErstesBuchung = 0;
		MyBuchenPTR->UpDateElement();
	}
	else
	{
		FindBuchung( Position - 1 );
		GetElementNr(AktBuchung->DB_Position);
		if( AktBuchung->NextBuchung )
		{
			AktBuchung->ListeBuchenDaten.NextBuchung	= AktBuchung->NextBuchung->DB_Position;
			Daten->NextBuchung								= AktBuchung->NextBuchung->DB_Position;
		}
		else
		{
			AktBuchung->ListeBuchenDaten.NextBuchung	= 0;
			Daten->NextBuchung								= 0;
		}
		UpDateElement();
	}

	return ReturnWert;
};

void BuchenPos::NeuesBuchung()
{
	NeuerDatensatz();
	
	AddBuchung( AktElementNr );

	if( MyBuchenPTR->Daten->ErstesBuchung )
	{
		GetElementNr(LastBuchung->PrevBuchung->DB_Position);
		Daten->NextBuchung = ElementeVorhanden();
		LastBuchung->PrevBuchung->ListeBuchenDaten.NextBuchung = Daten->NextBuchung;
		AktBuchung	= LastBuchung->PrevBuchung;
		UpDateElement();
		AktBuchung	= LastBuchung;
	}
	else
	{
		MyBuchenPTR->Daten->ErstesBuchung = ElementeVorhanden();
		MyBuchenPTR->UpDateElement();
	}
};

void BuchenPos::PrintString( ofstream* os, STRPTR start )
{
	(*os) << "/Buchen ";
	PrintTabelle( os, '2', 0, 0, NULL, NULL );
	(*os) << " def\n";
};

void BuchenPos::PrintTabelle( ofstream* os, UBYTE Typ, ULONG von, ULONG bis, DataBaseSearch* Vergleichsfunktion, UWORD* Verknuepf )
{
	MTBuchen_Pos	*SuchBuchung	= AktBuchung;
	(*os) << "[\n";

	AktBuchung		= FirstBuchung;
	while( AktBuchung )
	{
		DataBase::PrintTabelle( os, Typ, AktBuchung->DB_Position, 0, NULL, NULL );
		AktBuchung = AktBuchung->NextBuchung;
	}

	(*os) << "]";
	AktBuchung		= SuchBuchung;
};

void BuchenPos::PrintVorbereiten( ofstream* os, UBYTE Art )
{
};

ULONG BuchenPos::GetRexx(struct RexxMsg *rxmsg, ULONG Position )
{
	ULONG ReturnWert = 0;
	return ReturnWert;
};

ULONG BuchenPos::SetRexx(struct RexxMsg *rxmsg, ULONG Position)
{
	ULONG ReturnWert = 0;
	return ReturnWert;
};

