#pragma +
// Name:						Window-Klassen
// 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 <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <iostream.h>
#include <stdio.h>

#include "MT-Rechnung.h"
#include "MTLocale.h"
#include "MTScreen.h"
#include "MTWindow.h"
#include "MTAuswert.h"
#include "MTList.h"
#include "Datenbank.h"
#include "Einstellungen.h"
#include "Adressen.h"
#include "Artikel.h"
#include "Laender.h"
#include "Versand.h"
#include "RechnungArtikel.h"
#include "Rechnung.h"
#include "ARechnung.h"
#include "MTWinRech.h"
#include "MTWinARech.h"
#include "MTEditHook.h"
#include "MTWinSuch.h"
#include "MTWinArt.h"
#include "MTWinNavi.h"
#include "MTWinSchnellDruck.h"
#include "LocaleStrings.h"

extern Prefs				*MyPrefsPTR;
extern Laender				*MyLaenderPTR;
extern Adress				*MyAdressPTR;
extern Versand				*MyVersandPTR;
extern Kunden				*MyKundenPTR;
extern Mitarbeiter		*MyMitarbeiterPTR;
extern Artikel				*MyArtikelPTR;
extern RechnungArtikel	*MyARechnungArtikelPTR;
extern ARechnung			*MyARechnungPTR;
extern OpenLocaleClass	*MyLocalePTR;

extern FillAppStrings	*MyAppStringsPTR;

// Surface-Pointer
extern APTR	surface;

MTARech_Gadget::MTARech_Gadget(MTWindow *Win) : MTRech_Gadget( Win )
{
	WempfList				= new ListenClass(80);
	RempfList				= new ListenClass(80);

	AktDatum		= &MyARechnungPTR->Daten->ADatum;

	ThisWindow->ShortCuts[0]		= 0;

	ThisRechnung						= MyARechnungPTR;
	Berechtigung						= &MyMitarbeiterPTR->UserDaten.Ber_ARechnung;
	ArtRech								= &MyPrefsPTR->Daten->ARechArt;
	RStatus								= &MyARechnungPTR->Daten->RStatus;

	KopfuZus[0]		= AR_STATUS;
	KopfuZus[1]		= AR_DATUM;
	KopfuZus[2]		= AR_DATUM_SETZEN;
	KopfuZus[3]		= AR_WAEHRUNG;
	KopfuZus[4]		= AR_PREISSYS;
	KopfuZus[5]		= AR_MWSTBEFREIT;
	KopfuZus[6]		= AR_ZUSATZ;
	KopfuZus[7]		= AR_BUCHEN;

	Pos1Feld[0]		= AR_LV_NUMMER;
	Pos1Feld[1]		= AR_LV_ANZAHL;
	Pos1Feld[2]		= AR_LV_BEZEICH;
	Pos1Feld[3]		= AR_LV_EPREIS;
	Pos1Feld[4]		= AR_LV_GPREIS;
	Pos1Feld[5]		= AR_NEU_ART;
	Pos1Feld[6]		= AR_ANLEGEN_ART;
	Pos1Feld[7]		= AR_ERSATZ_ART;
	Pos1Feld[8]		= AR_LOE_ART;
	Pos1Feld[9]		= AR_GRUPPE1;

	Pos2Feld[0]		= AR_ART_NUMMER;
	Pos2Feld[1]		= AR2_ARTNR;
	Pos2Feld[2]		= AR_ART_SUCHEN;
	Pos2Feld[3]		= AR2_ARTNR_SUCH;
	Pos2Feld[4]		= AR_ART_ANZ;
	Pos2Feld[5]		= AR2_ANZ;
	Pos2Feld[6]		= AR_ART_BEZEICH;
	Pos2Feld[7]		= AR2_ARTBEZ;
	Pos2Feld[8]		= AR_ART_EPREIS;
	Pos2Feld[9]		= AR2_EPREIS;
	Pos2Feld[10]	= AR_ART_GPREIS;
	Pos2Feld[11]	= AR2_SUMMEZUAB;
	Pos2Feld[12]	= AR2_MGVERF;
	Pos2Feld[13]	= AR2_MGVORG;
	Pos2Feld[14]	= AR2_ZUAB1;
	Pos2Feld[15]	= AR2_ZUAB2;
	Pos2Feld[16]	= AR2_ZUAB3;
	Pos2Feld[17]	= AR2_ZUABWERT1;
	Pos2Feld[18]	= AR2_ZUABWERT2;
	Pos2Feld[19]	= AR2_ZUABWERT3;
	Pos2Feld[20]	= AR2_ZUABSUMME1;
	Pos2Feld[21]	= AR2_ZUABSUMME2;
	Pos2Feld[22]	= AR2_ZUABSUMME3;
	Pos2Feld[23]	= AR2_SUMME;
	Pos2Feld[24]	= AR2_ZUSATZ;
	Pos2Feld[25]	= AR2_BEMERKUNG;
	Pos2Feld[26]	= AR2_PE;

	SummenFeld[0]	= AR_VERSAND_KOSTEN;
	SummenFeld[1]	= AR_ZUAB1;
	SummenFeld[2]	= AR_ZUAB2;
	SummenFeld[3]	= AR_ZUAB3;
	SummenFeld[4]	= AR_ZUABWERT1;
	SummenFeld[5]	= AR_ZUABWERT2;
	SummenFeld[6]	= AR_ZUABWERT3;
	SummenFeld[7]	= AR_ZUABSUMME1;
	SummenFeld[8]	= AR_ZUABSUMME2;
	SummenFeld[9]	= AR_ZUABSUMME3;
	SummenFeld[10]	= AR_SKONTO;
	SummenFeld[11]	= AR_SKONTO_WERT;
	SummenFeld[12]	= AR_MWST_WERT;
	SummenFeld[13]	= AR_NETTO;
	SummenFeld[14]	= AR_BRUTTO;
	SummenFeld[15]	= AR_GRUPPE2;
	SummenFeld[16]	= AR_KASSE;
	SummenFeld[17]	= AR_BRUTTO2;
	SummenFeld[18]	= AR_BEZAHLT;
	SummenFeld[19]	= AR_RUECKGABE;
};

MTARech_Gadget::~MTARech_Gadget()
{
	delete RempfList;
	delete WempfList;
};

void MTARech_Gadget::HooksSetzen()
{
	SetGadgetAttrs( ThisWindow->gads[AR_STATUS], ThisWindow->Win, NULL, WCYCLEA_Labels, (ULONG)AppStrings[MSG_ARechStatus], TAG_DONE );

	GetAttr(WLABELA_Label, ThisWindow->gads[AR_LABEL_REMPF], (ULONG *)&TextPTR );
	ThisWindow->ShortCuts[0]		= GetHotKey(TextPTR,0);
	ThisWindow->ShortCutIcon[0]	= AR_REMPF_SUCH;
	ThisWindow->ShortCutKarte[0]	= -1;
	GetAttr(WLABELA_Label, ThisWindow->gads[AR_LABEL_WEMPF], (ULONG *)&TextPTR );
	ThisWindow->ShortCuts[1]		= GetHotKey(TextPTR,0);
	ThisWindow->ShortCutIcon[1]	= AR_WEMPF_SUCH;
	ThisWindow->ShortCutKarte[1]	= -1;
	GetAttr(WLABELA_Label, ThisWindow->gads[AR_LABEL_ART], (ULONG *)&TextPTR );
	ThisWindow->ShortCuts[2]		= GetHotKey(TextPTR,0);
	ThisWindow->ShortCutIcon[2]	= AR_ART_SUCHEN;
	ThisWindow->ShortCutKarte[2]	= 0;
	GetAttr(WLABELA_Label, ThisWindow->gads[AR2_LABEL], (ULONG *)&TextPTR );
	ThisWindow->ShortCuts[3]		= GetHotKey(TextPTR,0);
	ThisWindow->ShortCutIcon[3]	= AR2_ARTNR_SUCH;
	ThisWindow->ShortCutKarte[3]	= 1;
	ThisWindow->ShortCuts[4]		= 0;
};

void MTARech_Gadget::FillWindow2()
{
	FillWempf();
	FillRempf();
};

// Warenempfänger füllen:
void MTARech_Gadget::FillWempf()
{
	SetGadgetAttrs( ThisWindow->gads[AR_WEMPF_LV], ThisWindow->Win, NULL, WLISTVIEWA_List, NULL, TAG_DONE);

	if( MyARechnungPTR->ElementeVorhanden() == 0 ||
		 MyMitarbeiterPTR->UserDaten.Ber_ARechnung == 0 )
	{
		SetGadgetAttrs( ThisWindow->gads[AR_WEMPF_NR], ThisWindow->Win, NULL, WSTRINGA_String, "", GA_DISABLED, Gesperrt, TAG_DONE );
		SetGadgetAttrs( ThisWindow->gads[AR_WEMPF_SUCH], ThisWindow->Win, NULL, GA_DISABLED, Gesperrt, TAG_DONE );
		WempfList->EntferneAlle();
	}
	else
	{
		if( MyPrefsPTR->Daten->KundNr == 0 )
			SetGadgetAttrs( ThisWindow->gads[AR_WEMPF_NR], ThisWindow->Win, NULL, WSTRINGA_Hook, &PosZahl_edh, TAG_DONE );
		else
			SetGadgetAttrs( ThisWindow->gads[AR_WEMPF_NR], ThisWindow->Win, NULL, WSTRINGA_Hook, &Dummy_edh, TAG_DONE );

		MyKundenPTR->KundenNrErmitteln(	Buffer, MyPrefsPTR->Daten->KundNr,
													MyARechnungPTR->Daten->WareEmpf,
													&MyARechnungPTR->WempfKunde );
		SetGadgetAttrs( ThisWindow->gads[AR_WEMPF_NR], ThisWindow->Win, NULL, WSTRINGA_String, Buffer, GA_DISABLED, Gesperrt, TAG_DONE );
		SetGadgetAttrs( ThisWindow->gads[AR_WEMPF_SUCH], ThisWindow->Win, NULL, GA_DISABLED, Gesperrt, TAG_DONE );

		if( MyARechnungPTR->Daten->WareEmpf )
			MyAdressPTR->Anschrift( 2, WempfList, NULL, NULL, &MyARechnungPTR->WempfAdress );
		else
			WempfList->EntferneAlle();
	}

	SetGadgetAttrs( ThisWindow->gads[AR_WEMPF_LV], ThisWindow->Win, NULL, WLISTVIEWA_List, &WempfList->MyList,
																								 WLISTVIEWA_Top, 0,
																								 TAG_DONE);
};

// Rechnungsempfänger füllen:
void MTARech_Gadget::FillRempf()
{
	SetGadgetAttrs( ThisWindow->gads[AR_REMPF_LV], ThisWindow->Win, NULL, WLISTVIEWA_List, NULL, TAG_DONE);

	if( MyARechnungPTR->ElementeVorhanden() == 0 ||
		 MyMitarbeiterPTR->UserDaten.Ber_ARechnung == 0 )
	{
		SetGadgetAttrs( ThisWindow->gads[AR_REMPF_NR], ThisWindow->Win, NULL, WSTRINGA_String, "", GA_DISABLED, Gesperrt, TAG_DONE );
		SetGadgetAttrs( ThisWindow->gads[AR_REMPF_SUCH], ThisWindow->Win, NULL, GA_DISABLED, Gesperrt, TAG_DONE );
		RempfList->EntferneAlle();
	}
	else
	{
		if( MyPrefsPTR->Daten->KundNr == 0 )
			SetGadgetAttrs( ThisWindow->gads[AR_REMPF_NR], ThisWindow->Win, NULL, WSTRINGA_Hook, &PosZahl_edh, TAG_DONE );
		else
			SetGadgetAttrs( ThisWindow->gads[AR_REMPF_NR], ThisWindow->Win, NULL, WSTRINGA_Hook, &Dummy_edh, TAG_DONE );

		MyKundenPTR->KundenNrErmitteln(	Buffer, MyPrefsPTR->Daten->KundNr,
													MyARechnungPTR->Daten->RechEmpf,
													&MyARechnungPTR->RempfKunde );

		SetGadgetAttrs( ThisWindow->gads[AR_REMPF_NR], ThisWindow->Win, NULL, WSTRINGA_String, Buffer, GA_DISABLED, Gesperrt, TAG_DONE );
		SetGadgetAttrs( ThisWindow->gads[AR_REMPF_SUCH], ThisWindow->Win, NULL, GA_DISABLED, Gesperrt, TAG_DONE );
		if( MyARechnungPTR->Daten->RechEmpf )
			MyAdressPTR->Anschrift( 2, RempfList, NULL, NULL, &MyARechnungPTR->RempfAdress );
		else
		RempfList->EntferneAlle();
	}
	SetGadgetAttrs( ThisWindow->gads[AR_REMPF_LV], ThisWindow->Win, NULL, WLISTVIEWA_List, &RempfList->MyList,
																								 WLISTVIEWA_Top, 0,
																								 TAG_DONE);
};

// Summenfelder füllen:
void MTARech_Gadget::FillSummen2()
{
	if( MyARechnungPTR->ElementeVorhanden() == 0 ||
		 MyMitarbeiterPTR->UserDaten.Ber_ARechnung == 0 )
	{
		SetGadgetAttrs( ThisWindow->gads[AR_VERSAND], ThisWindow->Win, NULL, WCYCLEA_Labels, "", GA_DISABLED, Gesperrt, TAG_DONE );
	}
	else
	{
		SetGadgetAttrs( ThisWindow->gads[AR_VERSAND], ThisWindow->Win, NULL, WCYCLEA_Labels, (ULONG)MyVersandPTR->CycleVersand, WCYCLEA_Active, MyARechnungPTR->Daten->Versandart, GA_DISABLED, Gesperrt, TAG_DONE );
	}
};

// Gadget-Auswertung:
void MTARech_Gadget::MTAuswertungGadget()
{
	BOOL FillWarenempf	= FALSE;
	BOOL FillRechempf		= FALSE;

	switch( IconNummer )
	{
		case AR_REMPF_SUCH:
			((MTSuch_Gadget *)FindIt->FirstAuswert)->AktDB			= MyKundenPTR;

			ThisWindow->ThisScreen->ExclusiveAuswertung( FindIt );
			if( ((MTSuch_Gadget *)FindIt->FirstAuswert)->DB_Pos )
				MyAppStringsPTR->GetCSVWert( ((MTSuch_Gadget *)FindIt->FirstAuswert)->SelectPosText, Buffer, MyPrefsPTR->Daten->KundNr );
			else
				IconNummer = AR_REMPF_NR;
		// kein break!!!
		case AR_REMPF_NR:
			if( IconNummer == AR_REMPF_NR )
			{
				GetAttr(WSTRINGA_String, ThisWindow->gads[IconNummer], (ULONG *)&TextPTR );
				strcpy( Buffer, TextPTR );
			}
			UpDate			= TRUE;
			if( (*Buffer == 0) || (*Buffer == '0' && Buffer[1] == 0 ) )
			{
				if( MyARechnungPTR->Daten->RechEmpf == 0 )
					UpDate			= FALSE;
				else
					MyARechnungPTR->Daten->RechEmpf = 0;
				MyARechnungPTR->Rechnungsfehler &= (0xffffffff - 16);
			}
			else
			{
				if( (MyPrefsPTR->Daten->KundNr == 1) && (strcmp( Buffer, MyARechnungPTR->RempfKunde.KundenNr ) == 0) )
				{
					UpDate			= FALSE;
					MyARechnungPTR->Rechnungsfehler &= (0xffffffff - 16);
				}
				else
				{
					if( MyKundenPTR->KundenLesen( Buffer, MyPrefsPTR->Daten->KundNr ) )
					{
						if( MyARechnungPTR->Daten->RechEmpf == MyKundenPTR->AktElementNr )
							UpDate			= FALSE;
						else
							MyARechnungPTR->Daten->RechEmpf = MyKundenPTR->AktElementNr;
						MyARechnungPTR->Rechnungsfehler &= (0xffffffff - 16);
					}
					else
					{
						UpDate			= FALSE;
						SperrePruefen	= TRUE;
						MyARechnungPTR->Rechnungsfehler |= 16;
						MyARechnungPTR->Rechnungsfehler &= (0xffffffff - 2);
					}
				}
			}
			FillRechempf	= UpDate;
			break;
		case AR_WEMPF_SUCH:
			((MTSuch_Gadget *)FindIt->FirstAuswert)->AktDB			= MyKundenPTR;

			ThisWindow->ThisScreen->ExclusiveAuswertung( FindIt );
			if( ((MTSuch_Gadget *)FindIt->FirstAuswert)->DB_Pos )
				MyAppStringsPTR->GetCSVWert( ((MTSuch_Gadget *)FindIt->FirstAuswert)->SelectPosText, Buffer, MyPrefsPTR->Daten->KundNr );
			else
				IconNummer = AR_WEMPF_NR;
			// kein break!!!
		case AR_WEMPF_NR:
			if( IconNummer == AR_WEMPF_NR )
			{
				GetAttr(WSTRINGA_String, ThisWindow->gads[IconNummer], (ULONG *)&TextPTR );
				strcpy( Buffer, TextPTR );
			}
			UpDate			= TRUE;
			if( (*Buffer == 0) || (*Buffer == '0' && Buffer[1] == 0 ) )
			{
				if( MyARechnungPTR->Daten->WareEmpf == 0 )
					UpDate			= FALSE;
				else
					MyARechnungPTR->Daten->WareEmpf = 0;
				MyARechnungPTR->Rechnungsfehler &= (0xffffffff - 8);
			}
			else
			{
				if( (MyPrefsPTR->Daten->KundNr == 1) && (strcmp( Buffer, MyARechnungPTR->WempfKunde.KundenNr ) == 0) )
				{
					UpDate			= FALSE;
					MyARechnungPTR->Rechnungsfehler &= (0xffffffff - 8);
				}
				else
				{
					if( MyKundenPTR->KundenLesen( Buffer, MyPrefsPTR->Daten->KundNr ) )
					{
						if( MyARechnungPTR->Daten->WareEmpf == MyKundenPTR->AktElementNr )
							UpDate			= FALSE;
						else
							MyARechnungPTR->Daten->WareEmpf = MyKundenPTR->AktElementNr;
						MyARechnungPTR->Rechnungsfehler &= (0xffffffff - 8);
					}
					else
					{
						UpDate			= FALSE;
						SperrePruefen	= TRUE;
						MyARechnungPTR->Rechnungsfehler |= 8;
						MyARechnungPTR->Rechnungsfehler &= (0xffffffff - 1);
					}
				}
			}
			FillWarenempf = UpDate;
			break;
		case AR_VERSAND:
			UpDate = CycleAuswert( &MyARechnungPTR->Daten->Versandart );
			FillSum = UpDate;
			break;
	}
	if( FillWarenempf )
		FillWempf();
	if( FillRechempf )
	{
		FillRempf();
		FillPositionen();
	}
};

void MTARech_Gadget::SperreKopf()
{
	DisplayBeep(ThisWindow->ThisScreen->ThisScreen);
	ThisWindow->Fehler = TRUE;

	if( MyARechnungPTR->Rechnungsfehler & 8)
	{
		IconNummer = AR_WEMPF_NR;
		SetGadgetAttrs( GetIt->gads[NAV_HINWEIS], GetIt->Win, NULL, WARGSA_Format, AppStrings[MSG_FEHL_KundeNr], TAG_DONE );
	}
	else if( MyARechnungPTR->Rechnungsfehler & 1)
	{
		IconNummer = AR_WEMPF_NR;
		SetGadgetAttrs( GetIt->gads[NAV_HINWEIS], GetIt->Win, NULL, WARGSA_Format, AppStrings[MSG_FEHL_Geloescht], TAG_DONE );
	}
	else if( MyARechnungPTR->Rechnungsfehler & 16)
	{
		IconNummer = AR_REMPF_NR;
		SetGadgetAttrs( GetIt->gads[NAV_HINWEIS], GetIt->Win, NULL, WARGSA_Format, AppStrings[MSG_FEHL_KundeNr], TAG_DONE );
	}
	else if( MyARechnungPTR->Rechnungsfehler & 2)
	{
		IconNummer = AR_REMPF_NR;
		SetGadgetAttrs( GetIt->gads[NAV_HINWEIS], GetIt->Win, NULL, WARGSA_Format, AppStrings[MSG_FEHL_Geloescht], TAG_DONE );
	}
	else if( MyARechnungPTR->Rechnungsfehler & 4)
	{
		IconNummer = 0;
		DoubleWert = (0 -(MyKundenPTR->Daten->Kontostand + MyKundenPTR->Daten->KreditLimit));
		MyLocalePTR->FormatMoney( (STRPTR)Buffer, DoubleWert, MyPrefsPTR->WaehrungPTR[MyARechnungPTR->Daten->Waehrung_KZ] );
		SetGadgetAttrs( GetIt->gads[NAV_HINWEIS], GetIt->Win, NULL, WARGSA_Format, AppStrings[MSG_FEHL_KLimit], WARGSA_Arg0, Buffer, TAG_DONE );
	}

	if( IconNummer )
	{
		if( !ActivateGadget( ThisWindow->gads[IconNummer], ThisWindow->Win, NULL) )
		{
			GetIt->MTOpenWindow();
			ThisWindow->MTOpenWindow();
			ActivateGadget( ThisWindow->gads[IconNummer], ThisWindow->Win, NULL);
		}
		else
			FillWindow();
	}
};

// Schnelldruckvorbelegung
void MTARech_Gadget::MTSchnellDruckInit()
{
	((MTSDruck_Gadget *)(SDWindow->FirstAuswert))->AktDB		= ThisRechnung;

	ULONG i = (MyARechnungPTR->Daten->RStatus * 6);
	ULONG j = i + 6;

	for( ; i < j; i++)
	{
		if( *MyARechnungPTR->VersandDaten.Dokument[i] )
			((MTSDruck_Gadget *)(SDWindow->FirstAuswert))->DruDockSelected->NeuerNode( MyARechnungPTR->VersandDaten.Dokument[i] );
	}
};

void MTARech_Gadget::Mahnautomatik( UBYTE Status )
{
	if( Status )
	{

		if( GetIt )
			SetGadgetAttrs( GetIt->gads[NAV_HINWEIS], GetIt->Win, NULL, WARGSA_Format, AppStrings[MSG_FEHL_MAHNAUT], TAG_DONE );

		if( Status == 1 )
		{
			i = MyARechnungPTR->Mahnautomatik( Status, ((MTSuch_Gadget *)FindIt->FirstAuswert)->SuchList );

			if( GetIt )
				SetGadgetAttrs( GetIt->gads[NAV_HINWEIS], GetIt->Win, NULL, WARGSA_Format, "", TAG_DONE );

			if( i > 0 )
			{
				ThisWindow->MTOpenWindow();

				((MTSuch_Gadget *)FindIt->FirstAuswert)->AktDB	= MyARechnungPTR;

				ThisWindow->ThisScreen->ExclusiveAuswertung( FindIt );

				if( ((MTSuch_Gadget *)FindIt->FirstAuswert)->DB_Pos )
					DB_Pos = ((MTSuch_Gadget *)FindIt->FirstAuswert)->DB_Pos;

				MyARechnungPTR->GetElementNr( DB_Pos );
				MyARechnungPTR->LesenGesamtRech();
				First_LV		= 0;
				Select_LV	= 0;
				FillWindow();
			}
		}
		else if( Status == 2 )
		{
			i = MyARechnungPTR->Mahnautomatik( Status, NULL );
			if( GetIt )
				SetGadgetAttrs( GetIt->gads[NAV_HINWEIS], GetIt->Win, NULL, WARGSA_Format, AppStrings[MSG_FEHL_MAHNDRU], WARGSA_Arg0, i, TAG_DONE );
		}
	}
};

