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

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

		public rp0411_xbs()
		{
		}

		// Rechnungsausgangsbuch
		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("mSeiteZuvo", "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("LinesNeed", "s,2,0");
			HostObject.Set("LinesNeed", @"1", true);

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

			HostObject.DefineVariable2("mWaehr", "u,3,0");
			HostObject.Set("mWaehr", @"EUR", true);

			// -------------------------------------------------------------------------
			//  Prüfen der Übergabe von Filtervariablen
			if (!HostObject.IsVar("VonDatum"))
				HostObject.DefineVariable2("VonDatum", "D,10,0");
			if (!HostObject.IsVar("BisDatum"))
				HostObject.DefineVariable2("BisDatum", "D,10,0");

			if (HostObject.IsEmpty("VonDatum"))
				HostObject.Set("VonDatum", @"H", true);
			if (HostObject.CompareString("VonDatum", "=", HostObject.EvalString(@"00.00.0000")))
				HostObject.Set("VonDatum", @"H", true);
			if (HostObject.IsEmpty("BisDatum"))
				HostObject.Set("BisDatum", @"H", true);
			if (HostObject.CompareString("BisDatum", "=", HostObject.EvalString(@"00.00.0000")))
				HostObject.Set("BisDatum", @"H", true);

			HostObject.DefineVariable2("FilterTmp", "C,10,0");

			HostObject.DefineVariable2("FilterVon", "C,8,0");
			HostObject.Set("FilterTmp", @"$[VonDatum]", true);
			SUB_subFiltDatum();
			HostObject.Set("FilterVon", @"$[FilterTmp]", true);

			HostObject.DefineVariable2("FilterBis", "C,8,0");
			HostObject.Set("FilterTmp", @"$[BisDatum]", true);
			SUB_subFiltDatum();
			HostObject.Set("FilterBis", @"$[FilterTmp]", true);

			HostObject.DefineVariable2("mFltText", "C,50,0");
			HostObject.Set("mFltText", @"vom $[VonDatum] bis $[BisDatum]", true);

			HostObject.DefineVariable2("sumNett", "N,12,2");
			HostObject.DefineVariable2("sumMwst", "N,12,2");
			HostObject.DefineVariable2("sumBrut", "N,12,2");

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

			SUB_subPaperDefs();

			//  Bereichsklassifizierung (Name und Wertanteilsrelevanz)
			HostObject.DefineVariable2("mBereich", "C,1,0");
			HostObject.DefineVariable2("mBerName", "C,80,0");
			HostObject.DefineVariable2("mBerWert", "L,1,0");

			HostObject.DefineVariable2("DoBgColor", "L,1,0");
			HostObject.Set("DoBgColor", @"1", true);

			// -----------------------------------------------------------------------------
			//  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");
			// -----------------------------------------------------------------------------

			HostObject.DefineRecord("recMAIN", "BELEGVERZEICHNIS", 10, 4, HostObject.EvalString(@"$[FilterVon<4]"));
			while(!HostObject.TestEof("recMAIN"))
			{
				SUB_loopMAIN();
				HostObject.SkipRecord("recMAIN");
			}

			HostObject.DefineVariable2("mCntSumm2", "N,8,0");
			HostObject.DefineVariable2("mCntSumm3", "N,8,0");
			HostObject.DefineRecord("recSummen1", "RP0411_BELEGMWSTSUMMEN", 0, 18, HostObject.EvalString(@"REPORT####RA#BUCH#"));
			while(!HostObject.TestEof("recSummen1"))
			{
				SUB_loopSummen1();
				HostObject.SkipRecord("recSummen1");
			}
			if (HostObject.EvalBool("$[mCntSumm2]"))
				HostObject.Set("mCntSumm2", @"$[mCntSumm2] + 3", true);
			if (HostObject.EvalBool("$[mCntSumm3]"))
				HostObject.Set("mCntSumm3", @"$[mCntSumm3] + 2", true);

			//  unten ausrichten oder neue Seite beginnen
			if (HostObject.EvalBool("($[ZlMax] - ($[mCntSumm2] + $[mCntSumm3])) > ($[Zeile])"))
				HostObject.Set("Zeile", @"$[ZlMax] - ($[mCntSumm2] + $[mCntSumm3])", true);
			else
				HostObject.Set("Zeile", @"$[ZlMax]", true);

			if (!HostObject.EvalBool("$[mCntSumm2]"))
				goto AfterSumm2;
			HostObject.Set("LinesNeed", @"2", true);
			SUB_CheckPage();
			HostObject.ProcessResource("outSummHdr");
			HostObject.DefineRecord("recSummen2", "RP0411_BELEGMWSTSUMMEN", 0, 18, HostObject.EvalString(@"REPORT####RA#BUCH#"));
			while(!HostObject.TestEof("recSummen2"))
			{
				SUB_loopSummen2();
				HostObject.SkipRecord("recSummen2");
			}
			AfterSumm2:

			if (!HostObject.EvalBool("$[mCntSumm3]"))
				goto AfterSumm3;
			HostObject.Set("LinesNeed", @"2", true);
			SUB_CheckPage();
			HostObject.ProcessResource("outInfoHdr");
			HostObject.DefineRecord("recSummen3", "RP0411_BELEGMWSTSUMMEN", 0, 18, HostObject.EvalString(@"REPORT####RA#BUCH#"));
			while(!HostObject.TestEof("recSummen3"))
			{
				SUB_loopSummen3();
				HostObject.SkipRecord("recSummen3");
			}
			AfterSumm3:


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


			return true;
		}

		bool SUB_subFiltDatum()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von OnPreReport
			HostObject.DefineVariable2("tmpTagMon", "C,5,0");
			HostObject.Set("tmpTagMon", @"$[FilterTmp<5]", true);
			HostObject.Set("FilterTmp", @"$[FilterTmp>4]$[tmpTagMon>2]$[tmpTagMon<2]", true);
			return HostObject.VariablesPop();
		}

		bool SUB_Kopf()
		{
			HostObject.VariablesPush();

			//  wird immer beim Seitenwechsel
			//  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");
			HostObject.Set("DoBgColor", @"1", true);

			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");
			// OUT ##outPost
			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] + $[LinesNeed]) > $[ZlMax]"))
				goto Ende;

			SUB_Fuss();
			SUB_Kopf();
			HostObject.Set("mSeiteZuvo", @" $[Seite] - 1", true);
			HostObject.ProcessResource("outUebertr");

			Ende:
			HostObject.Set("LinesNeed", @"1", true);

			return HostObject.VariablesPop();
		}

		bool SUB_loopDetail1()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN
			//  Datensatzschleife recDetail1

			HostObject.Set("belCnt", @"$[belCnt] + 1", true);
			HostObject.Set("mBereich", @"$[recDetail1.BEREICH]", true);
			SUB_subBerName();

			if (!HostObject.EvalBool("$[mBerWert]"))
				return HostObject.VariablesPop();

			HostObject.Set("belNett", @"$[belNett] + $[recDetail1.NETTO]", true);
			HostObject.Set("belMwst", @"$[belMwst] + $[recDetail1.MWST]", true);
			HostObject.Set("belBrut", @"$[belBrut] + $[recDetail1.BRUTTO]", true);

			//  bereitstellen falls nur ein Detail existiert
			HostObject.Set("belSatz", @"$[recDetail1.SATZ]", true);
			HostObject.Set("belBer", @"$[recDetail1.BEREICH]", true);
			HostObject.Set("belKat", @"$[recDetail1.MWSTKATEG]", true);

			return HostObject.VariablesPop();
		}

		bool SUB_loopDetail2()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN
			//  Datensatzschleife recDetail2

			HostObject.Set("mBereich", @"$[recDetail2.BEREICH]", true);
			SUB_subBerName();
			if (!HostObject.EvalBool("$[mBerWert]"))
				return HostObject.VariablesPop();

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

			return HostObject.VariablesPop();
		}

		bool SUB_loopDetail3()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN
			//  Datensatzschleife recDetail3

			HostObject.Set("mBereich", @"$[recDetail3.BEREICH]", true);
			SUB_subBerName();
			if (HostObject.EvalBool("$[mBerWert]"))
				return HostObject.VariablesPop();

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

			return HostObject.VariablesPop();
		}

		bool SUB_loopMAIN()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain
			//  Datensatzschleife recMAIN

			HostObject.DefineVariable2("mYYYMMDD", "C,8,0");
			HostObject.Set("mYYYMMDD", @"$[recMAIN.JAHR]$[recMAIN.MONAT]$[recMAIN.TAG]", true);
			if (HostObject.CompareString("mYYYMMDD", "<", HostObject.EvalString(@"$[FilterVon]")))
				return HostObject.VariablesPop();
			if (HostObject.CompareString("mYYYMMDD", ">", HostObject.EvalString(@"$[FilterBis]")))
				return HostObject.VariablesPop();

			//  Details zählen und relevante summieren
			HostObject.DefineVariable2("belNett", "N,12,2");
			HostObject.DefineVariable2("belMwst", "N,12,2");
			HostObject.DefineVariable2("belBrut", "N,12,2");
			HostObject.DefineVariable2("belSatz", "N,12,2");
			HostObject.DefineVariable2("belBer", "C,1,0");
			HostObject.DefineVariable2("belKat", "C,3,0");
			HostObject.DefineVariable2("belCnt", "s,2,0");

			HostObject.DefineRecord("recDetail1", "RP0411_BELEGMWSTSUMMEN", 0, 18, HostObject.EvalString(@"$[recMAIN.PRJNR<8]$[recMAIN.BELEGART<2]$[recMAIN.BELEGNR<8]"));
			while(!HostObject.TestEof("recDetail1"))
			{
				SUB_loopDetail1();
				HostObject.SkipRecord("recDetail1");
			}

			if (HostObject.EvalBool("$[belCnt] <= 1"))
				goto HauptSatz;
			//  Spezifikationen folgen aus Detail2, hier erstmal leeren
			HostObject.Set("belSatz", @"0", true);
			HostObject.Set("belBer", @"", true);
			HostObject.Set("belKat", @"", true);

			HauptSatz:
			HostObject.Set("LinesNeed", @"2", true);
			SUB_CheckPage();
			// IF BOOL($[DoBgColor])
			//   SUB #subFillLine
			HostObject.ProcessResource("outMAIN");
			HostObject.Set("sumNett", @"$[sumNett] + $[belNett]", true);
			HostObject.Set("sumMwst", @"$[sumMwst] + $[belMwst]", true);
			HostObject.Set("sumBrut", @"$[sumBrut] + $[belBrut]", true);
			if (HostObject.EvalBool("$[DoBgColor]"))
				HostObject.Set("DoBgColor", @"0", true);
			else
				HostObject.Set("DoBgColor", @"1", true);

			if (HostObject.EvalBool("$[belCnt] <= 1"))
				goto AfterDetails;

			//  Details ausgeben
			HostObject.DefineRecord("recDetail2", "RP0411_BELEGMWSTSUMMEN", 0, 18, HostObject.EvalString(@"$[recMAIN.PRJNR<8]$[recMAIN.BELEGART<2]$[recMAIN.BELEGNR<8]"));
			while(!HostObject.TestEof("recDetail2"))
			{
				SUB_loopDetail2();
				HostObject.SkipRecord("recDetail2");
			}
			HostObject.DefineRecord("recDetail3", "RP0411_BELEGMWSTSUMMEN", 0, 18, HostObject.EvalString(@"$[recMAIN.PRJNR<8]$[recMAIN.BELEGART<2]$[recMAIN.BELEGNR<8]"));
			while(!HostObject.TestEof("recDetail3"))
			{
				SUB_loopDetail3();
				HostObject.SkipRecord("recDetail3");
			}

			//  naechsten auf jeden Fall wieder hervorheben
			HostObject.Set("DoBgColor", @"1", true);

			AfterDetails:
			if (!HostObject.EvalBool("($[Zeile] + 1) > $[ZlMax]"))
				HostObject.ProcessResource("outLine");

			return HostObject.VariablesPop();
		}

		bool SUB_subPaperDefs()
		{
			HostObject.VariablesPush();

			//  Definition des Basislayouts und Papiergrößen

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

			HostObject.Set("RepTitel", @"Rechnungsausgang", 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", @"     (29,7 / $[cyZeile]) - 6", true);

			return HostObject.VariablesPop();
		}

		bool SUB_loopSummen1()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain
			//  Datensatzschleife recSummen

			HostObject.Set("mBereich", @"$[recSummen1.BEREICH]", true);
			SUB_subBerName();

			if (HostObject.EvalBool("$[mBerWert]"))
				HostObject.Set("mCntSumm2", @"$[mCntSumm2] + 1", true);
			else
				HostObject.Set("mCntSumm3", @"$[mCntSumm3] + 1", true);

			return HostObject.VariablesPop();
		}

		bool SUB_loopSummen2()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain
			//  Datensatzschleife recSummen2
			//  Summen mit Wertanteil

			HostObject.Set("mBereich", @"$[recSummen2.BEREICH]", true);
			SUB_subBerName();
			if (!HostObject.EvalBool("$[mBerWert]"))
				return HostObject.VariablesPop();

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


		bool SUB_subBerName()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain
			//  Bereichsnamen Kalkulieren

			HostObject.Set("mBerName", @"??", true);
			HostObject.Set("mBerWert", @"0", true);

			//  ----------------------- Umsatzrelevante Anteile
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"G")))
				HostObject.Set("mBerName", @"Leistungsanteile", true);
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"G")))
				HostObject.Set("mBerWert", @"1", true);
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"O")))
				HostObject.Set("mBerName", @"Bruttoabzüge nach MWSt.", true);
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"O")))
				HostObject.Set("mBerWert", @"1", true);
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"P")))
				HostObject.Set("mBerName", @"angerechnete Abschlagsforderungen", true);
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"P")))
				HostObject.Set("mBerWert", @"1", true);

			if (HostObject.EvalBool("$[mBerWert]"))
				return HostObject.VariablesPop();

			//  ----------------------- Informatorische Anteile
			// IF CMP(mBereich,=)C
			//   mBerName=Untergeordnete
			// IF CMP(mBereich,=)D
			//   mBerName=Rabattanteile
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"J")))
				HostObject.Set("mBerName", @"Netto angerechnete Abschlagsforderungen", true);
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"K")))
				HostObject.Set("mBerName", @"Anzahlungen auf Netto angerechnete Abschlagsford.", true);
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"L")))
				HostObject.Set("mBerName", @"Skonti auf Netto angerechnete Abschlagsford.", true);
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"Q")))
				HostObject.Set("mBerName", @"ausgeglichene Abschlagsforderungen", true);
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"R")))
				HostObject.Set("mBerName", @"Skonti auf Abschlagsforderungen", true);
			if (HostObject.CompareString("mBereich", "=", HostObject.EvalString(@"U")))
				HostObject.Set("mBerName", @"Offen aus angerechneten Abschlagsforderungen", true);

			return HostObject.VariablesPop();
		}

		bool SUB_loopSummen3()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain
			//  Datensatzschleife recSummen3
			//  Summen ohne Wertanteilsrelevanz

			HostObject.Set("mBereich", @"$[recSummen3.BEREICH]", true);
			SUB_subBerName();
			if (HostObject.EvalBool("$[mBerWert]"))
				return HostObject.VariablesPop();

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

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

			//  Unterprogramm von ReportMain
			HostObject.DefineVariable2("mFillStart", "d,8,2");
			HostObject.Set("mFillStart", @" $[RandY] + ($[cyZeile] * $[Zeile])", true);
			HostObject.WriteLine(HostObject.EvalString(@"RGBFILL $[RandX];$[mFillStart];$[SizeX];$[cyZeile];15263976"));

			return HostObject.VariablesPop();
		}
		*/
	}
}
