// Serviceprotokoll
// Parameter mBelegNr u,20,0
// Parameter RegisterIt L,1,0
using craftsReport.Interfaces;
using System;

namespace craftsReport.modules
{
	public class rp0283_xbs : IReportModule, IReportModuleEvents
	{
		#region Members and Contructor

		enum Preisdruck	{ Auto, Ohne, Ek, Vk }

		private bool m_IsLastPage = false;
		private bool m_IsVerkauf = false;
		Preisdruck m_Preisdruck = Preisdruck.Auto;

        public rp0283_xbs()
		{
		}

		#endregion

		#region IReportModule

		public IReportHost HostObject { set; get; }

		public bool Execute()
		{
			// veraltete Parameter uebertragen
			if (!HostObject.IsVar("mBelegNr"))
				HostObject.DefineVariable2("mBelegNr", "u,20,0");
			if (HostObject.IsEmpty("mBelegNr") && HostObject.IsVar("BelNr"))
				HostObject.Set("mBelegNr", "$[BelNr]", true);

			HostObject.DefineRecord("recKopf", "LagerEinKopf", 0, 9, HostObject.EvalString(@"A$[mBelegNr<20]"));
			m_IsVerkauf = !HostObject.IsEmpty("recKopf.KredKto");

			// Art des Preisdrucks ermitteln
			if (HostObject.IsVar("PreisDruck"))
				m_Preisdruck = (Preisdruck)(HostObject.EvalInt("$[PreisDruck]"));
			if (m_Preisdruck == Preisdruck.Auto)
				m_Preisdruck = m_IsVerkauf ? Preisdruck.Vk : Preisdruck.Ohne;

            // Ueberschrift festlegen, zusammen mit mBelegNr wird daraus der JobName gebildet
            if (!HostObject.IsVar("mRepTitle"))
				HostObject.DefineVariable2("mRepTitle", "c,250,0");
			if (HostObject.IsEmpty("mRepTitle"))
				HostObject.Set("mRepTitle", m_IsVerkauf && (m_Preisdruck == Preisdruck.Vk) ? "Lagerverkauf" : "Lagerschein", false);

			// Kunden und Fibukonto ermitteln
            HostObject.DefineRecord("recKunde", "ADRESSSTAMM", 0, 15, HostObject.EvalString(@"$[recKopf.AdrNr<15]"));
			if (!HostObject.IsEmpty("recKopf.AdrNr"))
                HostObject.DefineRecord("recKonto", "Kontenplan", 0, 9, HostObject.EvalString(@"P$[recKopf.KredKto<8]"));
            else
                HostObject.DefineRecord("recKonto", "Kontenplan", 0, 9, HostObject.EvalString(@"S$[recKopf.KredKto<8]"));

            HostObject.LoadAdditionalResources("/d");
            HostObject.PaperDefinition("PaperDefinition");
			HostObject.DokumentStart();
			HostObject.SeitenKopf();

			Zeilen();
			Summen();

			m_IsLastPage = true;
			HostObject.SeitenFuss();
			HostObject.DokumentEnde();

			return true;
		}

		#endregion

		#region IReportModuleEvents

		public void OnAfterPageStart()
		{
			if (HostObject.EvalInt("$[Seite]") == 1)
			{
				HostObject.Set("VorlaufLabel1", "Kundennummer", true);
				HostObject.Set("VorlaufValue1", "$[recKopf.KredKto]", true);
				HostObject.Set("VorlaufLabel2", "Datum", true);
				HostObject.Set("VorlaufValue2", "$[recKopf.Datum]", true);
				HostObject.Set("VorlaufLabel3", "Projekt", true);
				HostObject.Set("VorlaufValue3", "$[recKopf.PrjNr]", true);
				HostObject.Set("VorlaufLabel4", "Konto", true);
				HostObject.Set("VorlaufValue4", "$[recKonto.Konto]", true);

				HostObject.ProcessDestAddress("recKunde");
				// public void ProcessAddress(string Vorname, string Name, string Line2, string Line3, string Line4, string Line5, string Line6, string Line7)
				HostObject.ProcessResource("Adresse");
                HostObject.ProcessResource("Vorlauf");
            }
            else
			{
			}

            HostObject.ProcessResource("ZeilenKopf");
        }

        public void OnBeforePageClose()
		{
			if (m_IsLastPage)
			{
			}
			else
			{
				int nextPageNo = HostObject.EvalInt("$[Seite]") + 1;
				string bsText = "Fortsetzung auf Seite " + nextPageNo.ToString();
				HostObject.Set("Zeile", "$[ZlMax] - 1", true);
				HostObject.ProcessRTextLine(bsText, false);
			}
		}

		public void OnAfterExecute(string szOutFileName)
		{
		}

        #endregion

        #region Internals

        void Zeilen()
		{
			HostObject.VariablesPush();

			HostObject.DefineVariable2("DispPreis", "N,14,2");
            IReportRecord recZeile = HostObject.DefineRecord("recZeile", "LagerEinPos", 1, 11, HostObject.EvalString(@"A$[recKopf.BelNr<8] 0"));
			while (!recZeile.Eof)
			{
				int nZeile2 = HostObject.IsEmpty("recZeile.Bez2") ? 0 : 1;
				int nZeile3 = HostObject.IsEmpty("recZeile.Merkmal") ? 0 : 1;
				int nSpace = 3 + nZeile2 + nZeile3;

				HostObject.CheckPageSpace(nSpace);


                switch (m_Preisdruck)
				{
                    case Preisdruck.Ek:
                        if (HostObject.EvalString("$[recZeile.ZuAb]") == "Z")
                            HostObject.Set("DispPreis", "$[recZeile.NettoGes]", true);
                        else
                            HostObject.Set("DispPreis", "0 - $[recZeile.NettoGes]", true);
                        HostObject.ProcessResource("Zeile1_EK");
                        break;

                    case Preisdruck.Vk:
                        if (HostObject.EvalString("$[recZeile.ZuAb]") == "Z")
                            HostObject.Set("DispPreis", "0 - $[recZeile.VkGesamt]", true);
                        else
                            HostObject.Set("DispPreis", "$[recZeile.VkGesamt]", true);
                        HostObject.ProcessResource("Zeile1_VK");
						break;

                    default:
                        HostObject.ProcessResource("Zeile1_Text");
                        break;
                }

                if (nZeile2 > 0) HostObject.ProcessResource("Zeile2");
                if (nZeile3 > 0) HostObject.ProcessResource("Zeile3");
                recZeile.GoNext();
			}

            HostObject.ProcessResource("Sterne");
            HostObject.VariablesPop();
        }

        void Summen()
		{
            HostObject.VariablesPush();

			if (m_Preisdruck == Preisdruck.Vk)
			{
				IReportRecord recUst = HostObject.DefineRecord("recUst", "LagerEinUst", 0, 9, HostObject.EvalString(@"A$[recKopf.BelNr<8]"));
				if (!recUst.Eof)
				{
					HostObject.DefineVariable2("Netto", "N,12,2");
					HostObject.DefineVariable2("MwstVH", "N,12,2");
					HostObject.DefineVariable2("Mwst", "N,12,2");
					HostObject.DefineVariable2("Brutto", "N,12,2");
					HostObject.Set("Netto", "0-$[recUst.Netto]", true);
					HostObject.Set("MwstVH", "$[recUst.UstVH]", true);
					HostObject.Set("Mwst", "0-$[recUst.Ust]", true);
					HostObject.Set("Brutto", "0-$[recUst.Brutto]", true);

					HostObject.CheckPageSpace(7);
					HostObject.ProcessResource("Summen_VK");

					if (HostObject.EvalBool("$[recKopf.FaelligTage]"))
						HostObject.ProcessResource("ZahlungNetto");
					else
						HostObject.ProcessResource("ZahlungSofort");
				}
			}
			else if (m_Preisdruck == Preisdruck.Ek)
			{
                HostObject.CheckPageSpace(3);
                HostObject.ProcessResource("Summen_EK");
            }

            HostObject.VariablesPop();
        }

        #endregion
    }
}
