// Bericht Kundenumsatzstatistik
// nachbearbeiteter Code
// s.a. 2024-08-16
using craftsReport.Interfaces;

namespace craftsReport.modules
{
	public class rkdums_xbs : IReportModule
	{
		public IReportHost HostObject { set; get; }

		public rkdums_xbs()
		{
		}

		// Umsatzstatistik
		public bool Execute()
		{

			// -------------------------------------------------------------------------
			//  Variablen:
			//  Zeile     aktuelle Zeilenummer
			//  ZlMax     Zeile ab der der Fussbereich beginnt
			//  Seite     Seitennummer beginnend mit 1
			//  RandX     linker Rand in cm
			//  RandY     oberer Rand in cm
			//  SizeX     Druckbreite ab Rand links
			//  recMAIN   Datensatz fuer Main-Schleifen
			// --------------------------------------------------------------------------
			HostObject.DefineVariable2("RepTitel", "C,50,0");
			HostObject.DefineVariable2("Zeile", "s,2,0");
			HostObject.DefineVariable2("ZlMax", "s,2,0");
			HostObject.DefineVariable2("Seite", "s,2,0");
			HostObject.DefineVariable2("RandX", "d,8,2");
			HostObject.DefineVariable2("RandY", "d,8,2");
			HostObject.DefineVariable2("SizeX", "d,8,2");
			HostObject.DefineVariable2("Heute", "D,10,0");
			HostObject.DefineVariable2("cyZeile", "d,8,3");
			HostObject.DefineVariable2("mLPI", "s,2,0");
			HostObject.DefineVariable2("mSumme", "N,12,2");
			HostObject.DefineVariable2("mNextSeite", "s,2,0");

			//  Datensatz EIGENE_ANSCHRIFTEN
			HostObject.DefineRecord("recADR", "EIGENE_ANSCHRIFTEN", 0, 2, HostObject.EvalString(@"01"));

			// -------------------------------------------------------------------------
			//  Prüfen der Übergabe von Filtervariablen

			if (!HostObject.IsVar("KeyVon"))
				HostObject.DefineVariable2("KeyVon", "u,15,0");
			if (!HostObject.IsVar("KeyBis"))
				HostObject.DefineVariable2("KeyBis", "u,15,0");
			if (!HostObject.IsVar("mSel1"))
				HostObject.DefineVariable2("mSel1", "u,15,0");
			if (!HostObject.IsVar("mSel2"))
				HostObject.DefineVariable2("mSel2", "u,15,0");
			if (!HostObject.IsVar("mKond"))
				HostObject.DefineVariable2("mKond", "l,4,0");
			if (!HostObject.IsVar("FltMon"))
				HostObject.DefineVariable2("FltMon", "s,2,0");
			if (!HostObject.IsVar("FltJahr"))
				HostObject.DefineVariable2("FltJahr", "s,2,0");

			//  Code für den
			//  Berichtsablauf ein.

			SUB_subPaperDefs();
			//  TODO 
			//  fügen Sie hier eine Datensatzvariable
			//  mit dem Namen recMAIN ein.
			//  Diese Variable beinhaltet die Leittabelle.

			if (HostObject.IsEmpty("KeyVon"))
				goto EmpKeys;
			if (!HostObject.CompareString("KeyVon", "=", HostObject.EvalString(@"$[KeyBis]")))
				goto EmpKeys;

			HostObject.DefineRecord("recMAIN", "ADRESSSTAMM", 0, 15, HostObject.EvalString(@"$[KeyVon<15]"));
			goto EndRecM;

			EmpKeys:
			HostObject.DefineRecord("recMAIN", "ADRESSSTAMM", 2, 0, HostObject.EvalString(@""));
			EndRecM:

			// -----------------------------------------------------------------------------
			//  Vorbereiten der Ausgabe 
			//  Initialisierung der Drucksteuerdaten
			HostObject.WriteLine(HostObject.EvalString(@"INITPAGESIZE"));
			HostObject.WriteLine(HostObject.EvalString(@"STARTJOB $[RepTitel]"));
			HostObject.WriteLine(HostObject.EvalString(@"TRANSPARENT"));
			HostObject.WriteLine(HostObject.EvalString(@"STARTPAGE"));
			HostObject.Set("Zeile", @"0", true);
			HostObject.ProcessResource("KopfBericht");
			HostObject.ProcessResource("KopfDetail");
			// -----------------------------------------------------------------------------

			//  Aufruf des Unterprogramms loopMAIN fuer jeden Datensatz
			//  der an recMAIN gebundenen Tabelle
			while(!HostObject.TestEof("recMAIN"))
			{
				SUB_loopMAIN();
				HostObject.SkipRecord("recMAIN");
			}

			//  ----------------------------------------------------
			//  Druckdatei abschliessen
			HostObject.Set("Zeile", @"$[ZlMax]", true);
			HostObject.ProcessResource("FussBericht");
			HostObject.ProcessResource("outPost");
			HostObject.WriteLine(HostObject.EvalString(@"ENDPAGE"));
			HostObject.WriteLine(HostObject.EvalString(@"ENDJOB"));


			return true;
		}

		bool SUB_Kopf()
		{
			HostObject.VariablesPush();

			//  Dieser Code wird immer beim Seitenwchsel
			//  aufgerufen, um den Kopf der nächsten Seite
			//  auszugeben
			//  Der Kopf für die erste Seite steht jedoch
			//  im Codestück OnPreReport

			HostObject.Set("Zeile", @"0", true);
			HostObject.ProcessResource("KopfSeite");
			HostObject.ProcessResource("KopfDetail");

			return HostObject.VariablesPop();
		}

		bool SUB_Fuss()
		{
			HostObject.VariablesPush();

			//  Dieser Code wird immer beim Seitenwchsel
			//  aufgerufen, um den Fuss der aktuellen Seite
			//  auszugeben
			//  Der Fuss für die letzte Seite steht jedoch
			//  im Codestück OnPostReport

			HostObject.Set("Zeile", @"$[ZlMax]", true);
			HostObject.ProcessResource("FussSeite");
			HostObject.ProcessResource("outPost");
			HostObject.WriteLine(HostObject.EvalString(@"ENDPAGE"));
			HostObject.Set("Seite", @"$[Seite]+1", true);
			HostObject.Set("mNextSeite", @"$[Seite]+1", true);
			HostObject.Set("Zeile", @"0", true);
			HostObject.WriteLine(HostObject.EvalString(@"STARTPAGE"));

			return HostObject.VariablesPop();
		}

		bool SUB_CheckPage()
		{
			HostObject.VariablesPush();

			//  Fussbereich ausgeben, wenn letzte Zeile erreicht
			if (HostObject.EvalBool("$[Zeile] >= $[ZlMax]"))
				SUB_Fuss();
			//  Kopfbereich ausgeben, wenn erste Zeile erreicht
			if (HostObject.EvalBool("$[Zeile] = 0"))
				SUB_Kopf();

			return HostObject.VariablesPop();
		}

		/*
		bool SUB_NeueSeite()
		{
			HostObject.VariablesPush();

			//  nächste Seite anfangen
			SUB_Fuss();
			SUB_Kopf();

			return HostObject.VariablesPop();
		}
		*/

		bool SUB_loopBVZ1()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN
			//  Datensatzschleife recBVZ1
			//  Test, ob Rechnungsbelege vorhanden sind

			if (HostObject.EvalBool("($[recBVZ1.BELEGART]<1)|($[recBVZ1.BELEGART]>4)"))
				return HostObject.VariablesPop();
			if (HostObject.EvalBool("$[FltJahr]=0"))
				goto NoFlt;
			if (HostObject.EvalBool("$[FltJahr]<>$[recBVZ1.JAHR]"))
				return HostObject.VariablesPop();
			if (HostObject.EvalBool("$[FltMon]=0"))
				goto NoFlt;
			if (HostObject.EvalBool("$[FltMon]<>$[recBVZ1.MONAT]"))
				return HostObject.VariablesPop();
			NoFlt:
			HostObject.Set("bUms", @"1", true);
			HostObject.BreakRecord("recBVZ1");

			return HostObject.VariablesPop();
		}


		bool SUB_loopBVZ()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN
			//  Datensatzschleife recBVZ

			HostObject.DefineVariable2("mNetto", "N,12,2");

			// **************************************************
			//  Datensatzschleife WÄHRUNGEN
			HostObject.DefineRecord("recWAEHR", "WÄHRUNGEN", 1, 6, HostObject.EvalString(@"$[recBVZ.WAEHRUNG<6]"));

			if (HostObject.EvalBool("($[recBVZ.BELEGART]<1)|($[recBVZ.BELEGART]>4)"))
				return HostObject.VariablesPop();
			if (HostObject.EvalBool("$[FltJahr]=0"))
				goto NoFlt;
			if (HostObject.EvalBool("$[FltJahr]<>$[recBVZ.JAHR]"))
				return HostObject.VariablesPop();
			if (HostObject.EvalBool("$[FltMon]=0"))
				goto NoFlt;
			if (HostObject.EvalBool("$[FltMon]<>$[recBVZ.MONAT]"))
				return HostObject.VariablesPop();
			NoFlt:

			// ==== :Kond_31A6 Bedingungscode
			if (HostObject.EvalBool("($[recBVZ.BELEGART]) <> (2)"))
				HostObject.Set("mNetto", @" $[recBVZ.NETTO]/$[recWAEHR.EUROKURS]", true);
			else
				HostObject.Set("mNetto", @" (0 - $[recBVZ.NETTO])/$[recWAEHR.EUROKURS]", true);

			SUB_CheckPage();
			HostObject.ProcessResource("outloopBVZ");
			HostObject.Set("mSumAdr", @"$[mSumAdr] + $[mNetto]", true);
			return HostObject.VariablesPop();
		}

		bool SUB_loopMAIN()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain
			//  Datensatzschleife recMAIN

			//  locale Variablen
			HostObject.DefineVariable2("mAdr", "C,254,0");
			HostObject.DefineVariable2("mSumAdr", "N,12,2");
			HostObject.DefineVariable2("bUms", "L,1,0");

			//  1. gültige Sätze prüfen
			//  -----------------------------------------------------------------------------
			if (HostObject.IsEmpty("KeyBis"))
				goto NoEnde;
			if (HostObject.CompareString("recMAIN.DESTDEBNR", ">", HostObject.EvalString(@"$[KeyBis]")))
				return HostObject.VariablesPop();
			NoEnde:

			if (HostObject.IsEmpty("KeyVon"))
				goto NoAnfang;
			if (HostObject.CompareString("recMAIN.DESTDEBNR", "<", HostObject.EvalString(@"$[KeyVon]")))
				return HostObject.VariablesPop();
			NoAnfang:

			if (HostObject.IsEmpty("mSel1"))
				goto NoSel1;
			if (!HostObject.CompareString("recMAIN.SELECTION1", "=", HostObject.EvalString(@"$[mSel1]")))
				return HostObject.VariablesPop();
			NoSel1:

			if (HostObject.IsEmpty("mSel2"))
				goto NoSel2;
			if (!HostObject.CompareString("recMAIN.SELECTION2", "=", HostObject.EvalString(@"$[mSel2]")))
				return HostObject.VariablesPop();
			NoSel2:

			if (HostObject.EvalBool("$[mKond] = 0"))
				goto NoKond;
			if (HostObject.EvalBool("$[mKond] <> $[recMAIN.KONDITION]"))
				return HostObject.VariablesPop();
			NoKond:

			// ----------------------------------------------------
			//  2. Testen, ob dieser Kunde Belege hat
			HostObject.DefineRecord("recBVZ", "BELEGVERZEICHNIS", 5, 15, HostObject.EvalString(@"$[recMAIN.DESTDEBNR<15]"));
			HostObject.DefineRecord("recBVZ1", "BELEGVERZEICHNIS", 5, 15, HostObject.EvalString(@"$[recMAIN.DESTDEBNR<15]"));

			if (HostObject.TestEof("recBVZ"))
				goto EOF_recBVZ;
			while(!HostObject.TestEof("recBVZ1"))
			{
				SUB_loopBVZ1();
				HostObject.SkipRecord("recBVZ1");
			}
			if (!HostObject.EvalBool("$[bUms]"))
				goto EOF_recBVZ;

			//  3. Daten ausgeben
			//  -----------------------------------------------------------------------------
			//  Adresse zusammensetzten

			HostObject.Set("mAdr", @"$[recMAIN.NAME1]", true);
			if (!HostObject.IsEmpty("recMAIN.VORNAME"))
				HostObject.Set("mAdr", @"$[recMAIN.VORNAME] $[mAdr]", true);
			HostObject.Set("mAdr", @"$[mAdr] $[recMAIN.NAME2] ", true);
			HostObject.Set("mAdr", @"$[mAdr] * $[recMAIN.STRASSE] ", true);
			HostObject.Set("mAdr", @"$[mAdr] * $[recMAIN.PLZ<8] ", true);
			HostObject.Set("mAdr", @"$[mAdr] $[recMAIN.ORT] ", true);

			SUB_CheckPage();
			HostObject.ProcessResource("outMAIN");

			//  4. Detaildaten ausgeben
			//  -----------------------------------------------------------------------------
			while(!HostObject.TestEof("recBVZ"))
			{
				SUB_loopBVZ();
				HostObject.SkipRecord("recBVZ");
			}
			if (HostObject.EvalBool("$[mSumAdr]=0"))
				goto NoFuss;
			SUB_CheckPage();
			HostObject.ProcessResource("outfussBVZ");
			// Zeile=$[Zeile]+1
			// IF BOOL($[Zeile] < $[ZlMax])
			//    Zeile=$[Zeile]+1
			HostObject.Set("mSumme", @"$[mSumme]+$[mSumAdr]", true);
			NoFuss:

			EOF_recBVZ:
			return HostObject.VariablesPop();
		}

		bool SUB_subPaperDefs()
		{
			HostObject.VariablesPush();

			//  Definition des Basislayouts und Papiergrößen

			//  Zeilen per Inc
			HostObject.Set("mLPI", @"8", true);

			HostObject.Set("RepTitel", @"Kundenumsatz", true);
			HostObject.Set("Heute", @"H", true);
			HostObject.Set("RandX", @"      1,80", true);
			HostObject.Set("RandY", @"      0,80", true);
			HostObject.Set("SizeX", @"      18,0", true);
			HostObject.Set("Seite", @"      1", true);
			HostObject.Set("Zeile", @"      0", true);
			HostObject.Set("cyZeile", @"    2.54/$[mLPI]", true);
			HostObject.Set("ZlMax", @"     26.5/$[cyZeile]", true);
			HostObject.Set("mNextSeite", @" $[Seite] + 1", true);

			return HostObject.VariablesPop();
		}
	}
}
