using craftsReport.Interfaces;

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

		public rbvb01_xbs()
		{
		}

		// Zusammenfassung
		public bool Execute()
		{
			//  Standardbericht für einen einzelnen Beleg
			//  Übergabevariable FltKey
			// -------------------------------------------------------------------------
			//  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
			// --------------------------------------------------------------------------
			if (!HostObject.IsVar("RepTitel"))
				HostObject.DefineVariable2("RepTitel", "C,80,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");

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

			if (!HostObject.IsVar("FltKey"))
				HostObject.DefineVariable2("FltKey", "u,18,0");

			if (!HostObject.IsEmpty("FltKey"))
				goto IsFltKey;
			if (!HostObject.YesNo(HostObject.EvalString("\"Sie haben kein Belegfilter angegeben. Wollen Sie trotzdem fortsetzen ?")))
				return true;

			IsFltKey:

			// --------------------------------------------------
			//  Variablen für Ergebnisse
			HostObject.DefineVariable2("HEUTE_N", "d,8,2");
			HostObject.DefineVariable2("HEUTE_U", "d,8,2");
			HostObject.DefineVariable2("HEUTE_B", "d,8,2");
			HostObject.DefineVariable2("BISHER_N", "d,8,2");
			HostObject.DefineVariable2("BISHER_U", "d,8,2");
			HostObject.DefineVariable2("BISHER_B", "d,8,2");
			HostObject.DefineVariable2("BEZAHLT_N", "d,8,2");
			HostObject.DefineVariable2("BEZAHLT_U", "d,8,2");
			HostObject.DefineVariable2("BEZAHLT_B", "d,8,2");
			HostObject.DefineVariable2("ZUAB_B", "d,8,2");
			HostObject.DefineVariable2("ZUAB_U", "d,8,2");
			HostObject.DefineVariable2("OFFEN_N", "d,8,2");
			HostObject.DefineVariable2("OFFEN_U", "d,8,2");
			HostObject.DefineVariable2("OFFEN_B", "d,8,2");
			HostObject.DefineVariable2("REST_N", "d,8,2");
			HostObject.DefineVariable2("REST_U", "d,8,2");
			HostObject.DefineVariable2("REST_B", "d,8,2");
			HostObject.DefineVariable2("ZUZAHLEN", "d,8,2");
			HostObject.DefineVariable2("ANM1", "C,10,0");
			HostObject.DefineVariable2("bBrutto", "L,1,0");
			HostObject.DefineVariable2("bHdrBetr", "L,1,0");
			HostObject.DefineVariable2("bHdrTeil", "L,1,0");
			// --------------------------------------------------

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

			//  Datensätze für
			//  Belegkopf
			//  Belegextension
			//  Kundenadresse
			//  Bauleiteradresse
			//  Aufmassreferenzen nach Masskette
			//  Aufmassreferenzen nach Position
			//  Masskettenreferenz
			HostObject.DefineRecord("recKOPF1", "BELEGVERZEICHNIS", 0, 18, HostObject.EvalString(@"$[FltKey<18]"));
			HostObject.DefineRecord("recKOPF2", "BELEGKOPF_ERWEITERUNG", 0, 18, HostObject.EvalString(@"$[FltKey<18]"));
			HostObject.DefineRecord("recKUNDE", "BELEGADRESSEN", 0, 19, HostObject.EvalString(@"$[FltKey<18]0"));
			HostObject.DefineRecord("recBAULEI", "BELEGADRESSEN", 0, 19, HostObject.EvalString(@"$[FltKey<18]1"));
			HostObject.DefineRecord("recAMrefM", "AUFMASSREFERENZ", 0, 18, HostObject.EvalString(@"$[FltKey<18]"));
			HostObject.DefineRecord("recAMrefP", "AUFMASSREFERENZ", 0, 18, HostObject.EvalString(@"$[FltKey<18]"));
			HostObject.DefineRecord("recAMmass", "BELEGMASSKETTENREFERENZ", 0, 18, HostObject.EvalString(@"$[FltKey<18]"));

			HostObject.DefineVariable2("m13Btmp", "u,4,0");
			HostObject.DefineVariable2("m13B", "u,3,0");
			HostObject.DefineVariable2("U13B", "N,6,2");
			HostObject.DefineVariable2("B13B", "N,12,2");
			HostObject.DefineVariable2("mAnm1", "C,30,0");
			HostObject.Set("m13Btmp", @"$[recKOPF1.RES4NG2]", true);
			HostObject.Set("m13B", @"$[m13Btmp>3]", true);

			if (HostObject.CompareString("m13B", "=", HostObject.EvalString(@"13B")))
				HostObject.Set("mAnm1", @"Netto", true);
			else
				HostObject.Set("mAnm1", @"Brutto", true);

			//  Positionen  hier nach Druckfolge LV
			HostObject.DefineRecord("recPOS", "BELEGPOSITIONEN", 0, 18, HostObject.EvalString(@"$[FltKey<18]"));

			//  eigene Anschrift aus Belegvorlauf holen
			HostObject.DefineVariable2("mADRNR", "u,2,0");
			HostObject.Set("mADRNR", @"$[recKOPF1.EIGANSCH]", true);
			if (HostObject.EvalBool("$[mADRNR] < 10"))
				HostObject.Set("mADRNR", @"0$[mADRNR>1]", true);
			HostObject.DefineRecord("recADR", "EIGENE_ANSCHRIFTEN", 0, 2, HostObject.EvalString(@"$[mADRNR>2]"));

			//  Datum aus Belegvorlauf holen
			HostObject.Set("Heute", @"$[recKOPF1.TAG<2].$[recKOPF1.MONAT<2].$[recKOPF1.JAHR<4]", true);

			SUB_subPaperDefs();

			// -----------------------------------------------------------------------------
			//  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 Adressenlayouts
			HostObject.ProcessResource("outAdressen");


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


			HostObject.Set("OFFEN_N", @" $[HEUTE_N] - $[BEZAHLT_N]", true);
			HostObject.Set("OFFEN_U", @" $[HEUTE_U] - $[BEZAHLT_U]", true);
			HostObject.Set("OFFEN_B", @" $[HEUTE_B] - $[BEZAHLT_B]", true);
			HostObject.Set("REST_N", @"  $[HEUTE_N] - $[BISHER_N]", true);
			HostObject.Set("REST_U", @"  $[HEUTE_U] - $[BISHER_U]", true);
			HostObject.Set("REST_B", @"  $[HEUTE_B] - $[BISHER_B]", true);
			HostObject.Set("ZUZAHLEN", @"$[OFFEN_B] + $[ZUAB_B]", true);
			HostObject.Set("ZUAB_U", @"  $[ZUAB_B] * ($[recKOPF1.MWSTSATZ] / (100 + $[recKOPF1.MWSTSATZ]))", true);

			//  ----------------------------------------------------
			//  Druckdatei abschliessen
			HostObject.Set("Zeile", @"$[ZlMax]", true);
			HostObject.ProcessResource("outLine");
			HostObject.ProcessResource("FussBericht");
			HostObject.ProcessResource("outLine");
			HostObject.ProcessResource("outForderung");
			HostObject.ProcessResource("outLine");
			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");
			HostObject.Set("bHdrBetr", @"1", true);
			HostObject.Set("bHdrTeil", @"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("outWerbung");
			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();

			return HostObject.VariablesPop();
		}

		bool SUB_subNETTO()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN
			HostObject.DefineVariable2("netLOHN", "d,8,2");
			if (HostObject.EvalBool("$[recPOS.LOHNJN] = 1"))
				HostObject.Set("netLOHN", @"$[recPOS.VKLOHN]", true);

			HostObject.DefineVariable2("netMAT", "d,8,2");
			if (HostObject.EvalBool("$[recPOS.MATJN] = 1"))
				HostObject.Set("netMAT", @"$[recPOS.VKMAT]", true);

			HostObject.DefineVariable2("netFREMD", "d,8,2");
			HostObject.Set("netFREMD", @"$[recKOPF1.SUMMEFREMD]", true);

			HostObject.DefineVariable2("netRAB", "d,8,2");
			HostObject.Set("netRAB", @"$[recPOS.RABATTDM]", true);

			HostObject.Set("HEUTE_N", @"$[netLOHN] + $[netMAT] - $[netRAB]", true);

			HostObject.Set("bHdrBetr", @"1", true);
			HostObject.Set("bHdrTeil", @"1", true);

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

			return HostObject.VariablesPop();
		}

		bool SUB_subMWST()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN

			if (HostObject.CompareString("m13B", "=", HostObject.EvalString(@"13B")))
				HostObject.Set("U13b", @"$[recPOS.AufLohn]", true);
			if (HostObject.CompareString("m13B", "=", HostObject.EvalString(@"13B")))
				HostObject.Set("B13b", @"($[U13b] * $[HEUTE_N]) / 100.00", true);

			HostObject.Set("bHdrBetr", @"1", true);
			HostObject.Set("bHdrTeil", @"1", true);

			HostObject.Set("HEUTE_U", @" $[HEUTE_U] + $[recPOS.GPPOS]", true);
			HostObject.Set("HEUTE_B", @" $[HEUTE_U] + $[HEUTE_N]", true);
			HostObject.Set("ANM1", @"*)[1]", true);

			SUB_CheckPage();
			if (HostObject.CompareString("m13B", "=", HostObject.EvalString(@"13B")))
				HostObject.ProcessResource("outMWST13b");
			else
				HostObject.ProcessResource("outMWST");

			HostObject.Set("bBrutto", @"1", true);

			return HostObject.VariablesPop();
		}

		bool SUB_subBETRAG()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN
			if (HostObject.EvalBool(" $[recPOS.GPPOS] = 0 "))
				return HostObject.VariablesPop();

			if (HostObject.EvalBool("$[bBrutto]"))
				HostObject.Set("ZUAB_B", @"  $[ZUAB_B] + $[recPOS.GPPOS]   ", true);
			else
				HostObject.Set("HEUTE_N", @" $[HEUTE_N] + $[recPOS.GPPOS] ", true);

			SUB_CheckPage();
			if (HostObject.EvalBool("$[bHdrBetr]"))
				HostObject.ProcessResource("outBETRAGhdr");

			HostObject.Set("bHdrBetr", @"0", true);

			if (HostObject.EvalBool(" $[recPOS.ABSMENGE] = 0 "))
				HostObject.ProcessResource("outBETRAG");
			else
				HostObject.ProcessResource("outBETRAGVH");

			return HostObject.VariablesPop();
		}

		bool SUB_subTEILR()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN

			SUB_CheckPage();

			if (HostObject.EvalBool("$[bHdrTeil]"))
				HostObject.ProcessResource("outTEILRhdr");

			HostObject.Set("bHdrTeil", @"0", true);

			HostObject.DefineVariable2("DIVLOHN", "d,8,2");
			HostObject.DefineVariable2("DRKMAT", "d,8,2");
			HostObject.Set("DIVLOHN", @" $[recPOS.VKLOHN] - $[recPOS.EKLOHN]", true);
			HostObject.Set("DRKMAT", @"  0 - $[recPOS.VKMAT]", true);

			HostObject.ProcessResource("outTEILR");

			HostObject.Set("BEZAHLT_N", @" $[BEZAHLT_N] + $[recPOS.EKMAT]", true);
			HostObject.Set("BEZAHLT_B", @" $[BEZAHLT_B] + $[recPOS.VKMAT]", true);
			HostObject.Set("BEZAHLT_U", @" $[BEZAHLT_B] - $[BEZAHLT_N]", true);

			HostObject.Set("BISHER_N", @" $[BISHER_N] + $[recPOS.EKLOHN]", true);
			HostObject.Set("BISHER_B", @" $[BISHER_B] + $[recPOS.VKLOHN]", true);
			HostObject.Set("BISHER_U", @" $[BISHER_B] - $[BISHER_N]", true);

			return HostObject.VariablesPop();
		}


		bool SUB_loopMAIN()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain
			//  Datensatzschleife Positionen

			if (HostObject.EvalBool("$[recPOS.SATZART] = 1"))
				SUB_subNETTO();

			if (HostObject.EvalBool("$[recPOS.SATZART] = 12"))
				SUB_subMWST();

			if (HostObject.EvalBool("$[recPOS.SATZART] = 13"))
				SUB_subBETRAG();
			else
				HostObject.Set("bHdrBetr", @"1", true);

			if (HostObject.EvalBool("$[recPOS.SATZART] = 15"))
				SUB_subTEILR();
			else
				HostObject.Set("bHdrTeil", @"1", true);

			return HostObject.VariablesPop();
		}

		bool SUB_subPaperDefs()
		{
			HostObject.VariablesPush();

			//  Definition des Basislayouts und Papiergrößen

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

			// IF EMPTY(RepTitel)
			HostObject.Set("RepTitel", @"Zusammenstellung für $[recKOPF1.BELARTTEXT] $[recKOPF1.PRJNR]/$[recKOPF1.BELEGART]/$[recKOPF1.BELEGNR]", 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", @"     (29.7/$[cyZeile])  - 14", true);

			return HostObject.VariablesPop();
		}
	}
}
