// Bericht Sool/Istvergleich fuer einen Arbeitnehmer
// nachbearbeiteter Code
// s.a. 2024-08-16
using craftsReport.Interfaces;

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

		public rpusia_xbs()
		{
		}

		// Telefonliste
		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("mNeueSeite", "N,1,0");
			HostObject.DefineVariable2("mTagMon", "C,5,0");
			HostObject.DefineVariable2("mVonZeit", "C,8,0");
			HostObject.DefineVariable2("mBisZeit", "C,8,0");
			HostObject.DefineVariable2("mSollSumme", "N,12,2");
			HostObject.DefineVariable2("mStundenSumme", "N,12,2");
			HostObject.DefineVariable2("mDiffSumme", "N,12,2");

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

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

			if (!HostObject.IsVar("VonNum"))
				HostObject.DefineVariable2("VonNum", "u,15,0");
			if (!HostObject.IsVar("BisNum"))
				HostObject.DefineVariable2("BisNum", "u,15,0");
			if (!HostObject.IsVar("VonDatum"))
				HostObject.DefineVariable2("VonDatum", "u,10,0");
			if (!HostObject.IsVar("BisDatum"))
				HostObject.DefineVariable2("BisDatum", "u,10,0");

			HostObject.Set("mTagMon", @"$[VonDatum<5]", true);
			HostObject.Set("mVonZeit", @"$[VonDatum>4]$[mTagMon>2]$[mTagMon<2]", true);
			HostObject.Set("mTagMon", @"$[BisDatum<5]", true);
			HostObject.Set("mBisZeit", @"$[BisDatum>4]$[mTagMon>2]$[mTagMon<2]", true);


			SUB_subPaperDefs();

			HostObject.DefineRecord("recKND", "ADRESSSTAMM", 6, 2, HostObject.EvalString(@" 4"));

			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.Set("mNeueSeite", @"0", true);
			HostObject.Set("mSollSumme", @"0", true);
			HostObject.Set("mDiffSumme", @"0", true);
			HostObject.Set("mStundenSumme", @"0", true);

			while(!HostObject.TestEof("recKND"))
			{
				SUB_loopMAIN();
				HostObject.SkipRecord("recKND");
			}

			//  ----------------------------------------------------
			//  Druckdatei abschliessen
			HostObject.Set("Zeile", @"$[ZlMax]", true);
			HostObject.ProcessResource("FussBericht");
			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("outKopfInfo");
			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.WriteLine(HostObject.EvalString(@"ENDPAGE"));
			HostObject.Set("Seite", @"$[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

			if (HostObject.EvalBool("$[mNeueSeite]=0"))
				return HostObject.VariablesPop();

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

			return HostObject.VariablesPop();
		}

		bool SUB_loopTAG()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN/loopZEIT
			//  Datensatzschleife recZEIT

			HostObject.DefineRecord("recLOHN", "LOHNARTEN", 0, 3, HostObject.EvalString(@"$[recZEIT.lohnart<3]"));

			if (HostObject.TestEof("recLOHN"))
				return HostObject.VariablesPop();

			if (HostObject.EvalBool("1 = $[recLOHN.bsoll]"))
				HostObject.Set("mStunden", @"$[mStunden] + $[recZEIT.stunden]", true);

			return HostObject.VariablesPop();
		}


		bool SUB_loopZEIT()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN
			//  Datensatzschleife recZEIT

			HostObject.DefineVariable2("mZeit", "u,8,0");

			HostObject.Set("mNeueSeite", @"1", true);
			HostObject.Set("mZeit", @"$[recSOLL.jahr]$[recSOLL.monat]$[recSOLL.tag]", true);
			if (HostObject.IsEmpty("recSOLL.tag"))
				return HostObject.VariablesPop();
			if (HostObject.IsEmpty("recSOLL.monat"))
				return HostObject.VariablesPop();
			if (HostObject.IsEmpty("recSOLL.jahr"))
				return HostObject.VariablesPop();

			if (HostObject.IsEmpty("VonDatum"))
				goto NoVonDatum;
			if (HostObject.CompareString("mVonZeit", ">", HostObject.EvalString(@"$[mZeit<8]")))
				return HostObject.VariablesPop();
			NoVonDatum:

			if (HostObject.IsEmpty("BisDatum"))
				goto NoBisDatum;
			if (HostObject.CompareString("mBisZeit", "<", HostObject.EvalString(@"$[mZeit<8]")))
				return HostObject.VariablesPop();
			NoBisDatum:

			HostObject.DefineRecord("recZEIT", "ZEITERFASSUNG", 3, 12, HostObject.EvalString(@"$[recKND.Annr<4]$[mZeit<8]"));

			HostObject.Set("mStunden", @"0", true);
			while(!HostObject.TestEof("recZEIT"))
			{
				SUB_loopTAG();
				HostObject.SkipRecord("recZEIT");
			}

			HostObject.Set("mDatum", @"$[recSOLL.tag].$[recSOLL.monat].$[recSOLL.jahr]", true);
			HostObject.Set("mSoll", @"$[recSOLL.sstunden]", true);
			HostObject.Set("mDiff", @"$[mStunden] - $[mSoll]", true);

			HostObject.Set("mDiffSumme", @"$[mDiffSumme] + $[mDiff]", true);
			HostObject.Set("mSollSumme", @"$[mSollSumme] + $[mSoll]", true);
			HostObject.Set("mStundenSumme", @"$[mStundenSumme] + $[mStunden]", true);

			SUB_CheckPage();
			HostObject.ProcessResource("outMAIN");
			return HostObject.VariablesPop();
		}

		bool SUB_loopMAIN()
		{
			HostObject.VariablesPush();


			HostObject.DefineVariable2("mDatum", "C,10,0");
			HostObject.DefineVariable2("mStunden", "N,12,2");
			HostObject.DefineVariable2("mSoll", "N,12,2");
			HostObject.DefineVariable2("mDiff", "N,12,2");
			HostObject.DefineVariable2("mTmp", "C,8,0");

			if (HostObject.IsEmpty("BisNum"))
				goto NoBisNum;
			if (HostObject.CompareString("recKND.Annr", ">", HostObject.EvalString(@"$[BisNum<4]")))
				return HostObject.VariablesPop();
			NoBisNum:

			if (HostObject.IsEmpty("VonNum"))
				goto NoVonNum;
			if (HostObject.CompareString("recKND.Annr", "<", HostObject.EvalString(@"$[VonNum<4]")))
				return HostObject.VariablesPop();
			NoVonNum:


			SUB_NeueSeite();
			HostObject.ProcessResource("KopfSeite");
			HostObject.ProcessResource("outKopfInfo");
			HostObject.ProcessResource("KopfDetail");

			HostObject.Set("mStundenSumme", @"0", true);
			HostObject.Set("mSollSumme", @"0", true);
			HostObject.Set("mDiffSumme", @"0", true);

			HostObject.Set("mTmp", @"$[mVonZeit<4]", true);
			if (HostObject.CompareString("mTmp", "=", HostObject.EvalString(@"$[mBisZeit<4]")))
				goto JahrFlt;
			HostObject.Set("mTmp", @"$[mVonZeit<6]", true);
			if (HostObject.CompareString("mTmp", "=", HostObject.EvalString(@"$[mBisZeit<6]")))
				goto MonatFlt;
			goto LeerFlt;

			JahrFlt:
			HostObject.DefineRecord("recSOLL", "KALENDERSOLL", 0, 6, HostObject.EvalString(@"$[recKND.BaGruppe<2]$[mVonZeit<4]"));
			goto ToLoop;

			MonatFlt:
			HostObject.DefineRecord("recSOLL", "KALENDERSOLL", 0, 8, HostObject.EvalString(@"$[recKND.BaGruppe<2]$[mVonZeit<6]"));
			goto ToLoop;

			LeerFlt:
			HostObject.DefineRecord("recSOLL", "KALENDERSOLL", 0, 2, HostObject.EvalString(@"$[recKND.BaGruppe<2]"));

			ToLoop:
			while(!HostObject.TestEof("recSOLL"))
			{
				SUB_loopZEIT();
				HostObject.SkipRecord("recSOLL");
			}

			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", @"Produktive Stunden", true);
			HostObject.Set("Heute", @"H", true);
			HostObject.Set("RandX", @"      1,80", true);
			HostObject.Set("RandY", @"      0,80", true);
			HostObject.Set("SizeX", @"      17,5", true);
			HostObject.Set("Seite", @"      1", true);
			HostObject.Set("Zeile", @"      0", true);
			HostObject.Set("cyZeile", @"    2.54/$[mLPI]", true);
			HostObject.Set("ZlMax", @"     (27.4/$[cyZeile]) - 2", true);

			return HostObject.VariablesPop();
		}

	}
}
