partial void DocumentsSet_Updating(Documents entity)
        {
            var desc = DocDescriptor.FromByteArray(entity.Data);

            if (desc != null)
            {
                entity.Bezeichnung = desc.Auftragsnummer + " - " + desc.Titel + " vom " + entity.Datum.ToShortDateString();
                entity.GeneratedDocument.Documents = entity;
                entity.GeneratedDocument.Bytes     = DocumentGenerator.DocumentToPdf(desc);
            }
        }
        public static DocDescriptor CreateRechnung(Rechnungen value)
        {
            DocDescriptor result = new DocDescriptor(value.Referenznummer, "Rechnung");

            result.Adresse = value.Adresse;
            if (!String.IsNullOrWhiteSpace(value.Rechnungsnummer))
            {
                result.Rechnungsnummer = value.Rechnungsnummer;
            }
            if (value.Rechnungsdatum.HasValue)
            {
                result.Rechnungsdatum = value.Rechnungsdatum.Value.ToShortDateString();
            }
            if (value.Versanddatum.HasValue)
            {
                result.Versanddatum = value.Versanddatum.Value.ToShortDateString();
            }
            if (!String.IsNullOrWhiteSpace(value.Lieferscheinnummer))
            {
                result.Lieferscheinnummer = value.Lieferscheinnummer;
            }

            if (value.Lieferkosten.HasValue)
            {
                result.Lieferkosten = value.Lieferkosten.Value.ToString("C");
            }
            if (value.Rechnungsbetrag_Brutto.HasValue)
            {
                result.Brutto = value.Rechnungsbetrag_Brutto.Value.ToString("C");
            }
            if (value.Mehrwertsteuer.HasValue)
            {
                result.Mehrwertsteuer = value.Mehrwertsteuer.Value.ToString("C");
            }
            if (value.Netto_Gesamtbetrag.HasValue)
            {
                result.Netto = value.Netto_Gesamtbetrag.Value.ToString("C");
            }
            if (value.Mahnung.GetValueOrDefault(false))
            {
                result.Mahnkosten = value.Mahnkosten.ToString("C");
            }

            foreach (var art in value.ArtikellisteCollection)
            {
                result.Positionen.Add((Position)art);
            }

            return(result);
        }
        private void ProcessInRechnung()
        {
            var inRechnung = this.AuftragsSammlung1.Where(n => n.Status == (int)Bestellstatus.InRechnung);

            rechnungen = new List <Documents>();

            foreach (var item in inRechnung)
            {
                DocDescriptor desc = DocDescriptor.CreateRechnung(item);

                Documents newItem = DocumentsSet.AddNew();
                newItem.RechnungsId = item.Id;
                newItem.KundenId    = item.Kunde.Id;
                newItem.Bezeichnung = desc.Auftragsnummer + " - " + desc.Titel + " vom " + DateTime.Now.ToShortDateString();
                newItem.Datum       = DateTime.Now;
                newItem.Data        = desc.ToDictionary().Serialize();
                rechnungen.Add(newItem);
                item.RequiresProcessing = false;
            }
        }
        public static DocDescriptor CreateLieferschein(Rechnungen value)
        {
            DocDescriptor result = new DocDescriptor(value.Auftragsnummer, "Lieferschein");

            result.Adresse = value.Lieferadresse == null ? value.Adresse : value.Lieferadresse.ToString();
            if (!String.IsNullOrWhiteSpace(value.Kunde.Kundennummer))
            {
                result.Kundennummer = value.Kunde.Kundennummer;
            }
            if (value.Rechnungsbetrag_Brutto.HasValue)
            {
                result.Brutto = value.Rechnungsbetrag_Brutto.Value.ToString("C");
            }
            if (value.Versanddatum.HasValue)
            {
                result.Versanddatum = value.Versanddatum.Value.ToShortDateString();
            }
            if (value.Lieferkosten.HasValue)
            {
                result.Lieferkosten = value.Lieferkosten.Value.ToString("C");
            }
            if (!String.IsNullOrWhiteSpace(value.Lieferscheinnummer))
            {
                result.Lieferscheinnummer = value.Lieferscheinnummer;
            }
            if (value.Mehrwertsteuer.HasValue)
            {
                result.Mehrwertsteuer = value.Mehrwertsteuer.Value.ToString("C");
            }
            if (value.Netto_Gesamtbetrag.HasValue)
            {
                result.Netto = value.Netto_Gesamtbetrag.Value.ToString("C");
            }

            foreach (var art in value.ArtikellisteCollection)
            {
                result.Positionen.Add((Position)art);
            }

            return(result);
        }
        partial void Test_Execute()
        {
            Rechnungen tmp = new Rechnungen();

            tmp.Kunde = new KundenItem()
            {
                Anrede     = "Herr",
                Hausnummer = 1,
                Land       = "Deutschland",
                Nachnahme  = "Mustermann",
                PLZ        = 12345,
                Stadt      = "Musterstadt",
                Straße     = "Musterstraße",
                Vorname    = "Max"
            };
            tmp.GetRechnungsNummer();
            tmp.Auftragsnummer     = tmp.GetAuftragsNummer();
            tmp.Bestelldatum       = DateTime.Today;
            tmp.Rechnungsdatum     = DateTime.Today;
            tmp.Lieferdatum        = DateTime.Today;
            tmp.Lieferscheinnummer = "L-0001";
            tmp.Lieferkosten       = 6M;
            tmp.Referenznummer     = "R-00001";
            tmp.Versanddatum       = DateTime.Today;

            tmp.ArtikellisteCollection.Add(new ArtikellisteItem()
            {
                Anzahl           = 2,
                Rabatt           = 3,
                ArtikelstammItem = new ArtikelstammItem()
                {
                    Artikelnummer       = "A00001",
                    Artikelbeschreibung = "Testartikel",
                    Vertriebsname       = "Testartikel",
                    VK_pro_PK           = 10M
                }
            });
            tmp.ArtikellisteCollection.Add(new ArtikellisteItem()
            {
                Anzahl           = 1,
                Rabatt           = 0,
                ArtikelstammItem = new ArtikelstammItem()
                {
                    Artikelnummer       = "A00002",
                    Artikelbeschreibung = "Testartikel 2",
                    Vertriebsname       = "Testartikel 2",
                    VK_pro_PK           = 19.9M
                }
            });

            DocDescriptor test = DocDescriptor.CreateRechnung(tmp);

            byte[] documentBytes = null;
            using (var dw = Application.Current.CreateDataWorkspace())
            {
                var newDoc = dw.ApplicationData.DocumentsSet.AddNew();
                newDoc.Bezeichnung = "Vorlagentest";
                newDoc.Datum       = DateTime.Now;
                newDoc.Data        = test.ToByteArray();
                dw.ApplicationData.SaveChanges();
                documentBytes = newDoc.GeneratedDocument.Bytes;
                newDoc.Delete();
                dw.ApplicationData.SaveChanges();
            }

            Refresh();

            if (documentBytes != null)
            {
                string file = Helper.GetFreeTempFilename("pdf");
                File.WriteAllBytes(file, documentBytes);
                Helper.ShellExecute(file);
            }
        }
		public static DocDescriptor CreateRechnung(Rechnungen value)
		{
			DocDescriptor result = new DocDescriptor(value.Referenznummer, "Rechnung");

			result.Adresse = value.Adresse;
			if (!String.IsNullOrWhiteSpace(value.Rechnungsnummer))
				result.Rechnungsnummer = value.Rechnungsnummer;
			if (value.Rechnungsdatum.HasValue)
				result.Rechnungsdatum = value.Rechnungsdatum.Value.ToShortDateString();
			if (value.Versanddatum.HasValue)
				result.Versanddatum = value.Versanddatum.Value.ToShortDateString();
			if (!String.IsNullOrWhiteSpace(value.Lieferscheinnummer))
				result.Lieferscheinnummer = value.Lieferscheinnummer;

			if (value.Lieferkosten.HasValue)
				result.Lieferkosten = value.Lieferkosten.Value.ToString("C");
			if (value.Rechnungsbetrag_Brutto.HasValue)
				result.Brutto = value.Rechnungsbetrag_Brutto.Value.ToString("C");
			if (value.Mehrwertsteuer.HasValue)
				result.Mehrwertsteuer = value.Mehrwertsteuer.Value.ToString("C");
			if (value.Netto_Gesamtbetrag.HasValue)
				result.Netto = value.Netto_Gesamtbetrag.Value.ToString("C");
			if (value.Mahnung.GetValueOrDefault(false))
				result.Mahnkosten = value.Mahnkosten.ToString("C");

			foreach (var art in value.ArtikellisteCollection)
				result.Positionen.Add((Position)art);
					
			return result;
		}
		public static DocDescriptor CreateLieferschein(Rechnungen value)
		{
			DocDescriptor result = new DocDescriptor(value.Auftragsnummer, "Lieferschein");

			result.Adresse = value.Lieferadresse == null ? value.Adresse : value.Lieferadresse.ToString();
			if (!String.IsNullOrWhiteSpace(value.Kunde.Kundennummer))
				result.Kundennummer = value.Kunde.Kundennummer;
			if (value.Rechnungsbetrag_Brutto.HasValue)
				result.Brutto = value.Rechnungsbetrag_Brutto.Value.ToString("C");
			if (value.Versanddatum.HasValue)
				result.Versanddatum = value.Versanddatum.Value.ToShortDateString();
			if (value.Lieferkosten.HasValue)
				result.Lieferkosten = value.Lieferkosten.Value.ToString("C");
			if (!String.IsNullOrWhiteSpace(value.Lieferscheinnummer))
				result.Lieferscheinnummer = value.Lieferscheinnummer;
			if (value.Mehrwertsteuer.HasValue)
				result.Mehrwertsteuer = value.Mehrwertsteuer.Value.ToString("C");
			if (value.Netto_Gesamtbetrag.HasValue)
				result.Netto = value.Netto_Gesamtbetrag.Value.ToString("C");

			foreach (var art in value.ArtikellisteCollection)
				result.Positionen.Add((Position)art);

			return result;
		}
        internal static byte[] ProcessDocument(DocDescriptor data)
        {
            using (MemoryStream ms = CreateTemplate())
            {
                WordprocessingDocument doc = WordprocessingDocument.Open(ms, true);
                Body body = doc.MainDocumentPart.Document.Body;

                #region Positions

                if (data.Positionen.Count > 0)
                {
                    var table    = body.Elements <Table>().FirstOrDefault(n => n.Any(m => m.OuterXml.Contains("MapTableNoHeading")));
                    var row      = table.ChildElements.OfType <TableRow>().LastOrDefault();
                    var outerXml = row.OuterXml;
                    var rowParas = FindElements <Paragraph>(row).ToArray();
                    var first    = data.Positionen[0];
                    InsertTextRun(rowParas[0], "1");
                    InsertTextRun(rowParas[1], first.Artikelnummer);
                    InsertTextRun(rowParas[2], first.Bezeichnung);
                    InsertTextRun(rowParas[3], first.Anzahl.ToString());
                    InsertTextRun(rowParas[4], first.PosPreis.ToString("C"));
                    InsertTextRun(rowParas[5], first.Preis.ToString("C"));

                    if (data.Positionen.Count > 1)
                    {
                        OpenXmlElement last = row;
                        for (int i = 1; i < data.Positionen.Count; i++)
                        {
                            var newRow = new TableRow(outerXml);
                            last = last.InsertAfterSelf(newRow);
                            var current = data.Positionen[i];
                            var paras   = FindElements <Paragraph>(newRow).ToArray();
                            InsertTextRun(paras[0], (i + 1).ToString());
                            InsertTextRun(paras[1], current.Artikelnummer);
                            InsertTextRun(paras[2], current.Bezeichnung);
                            InsertTextRun(paras[3], current.Anzahl.ToString());
                            InsertTextRun(paras[4], current.PosPreis.ToString("C"));
                            InsertTextRun(paras[5], current.Preis.ToString("C"));
                        }
                    }
                }

                #endregion

                #region Summary

                var otherTable      = body.Elements <Table>().FirstOrDefault(n => n.Any(m => m.OuterXml.Contains("liste2")));
                var lieferKostenRow = otherTable.ChildElements.OfType <TableRow>().FirstOrDefault(n => n.InnerText.Contains(L_AMOUNT_TAG));
                var mahnKostenRow   = otherTable.ChildElements.OfType <TableRow>().FirstOrDefault(n => n.InnerText.Contains(MAHN_TAG));

                if (String.IsNullOrWhiteSpace(data.Lieferkosten) && (lieferKostenRow != null))
                {
                    lieferKostenRow.RemoveAllChildren();
                    lieferKostenRow.Remove();
                }

                if (String.IsNullOrWhiteSpace(data.Mahnkosten) && (mahnKostenRow != null))
                {
                    mahnKostenRow.RemoveAllChildren();
                    mahnKostenRow.Remove();
                }

                #endregion

                #region Replacements
                foreach (var item in FindElements <Text>(body, n => !String.IsNullOrWhiteSpace(n.Text)))
                {
                    #region Adress

                    if (item.Text.Contains(ADDRESS_TAG))
                    {
                        if (data.Adresse == null)
                        {
                            item.Text = item.Text.Replace(ADDRESS_TAG, String.Empty);
                        }
                        else
                        {
                            string[] parts = data.Adresse.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
                            if (parts.Length == 0)
                            {
                                parts = new string[] { "" }
                            }
                            ;
                            item.Text = item.Text.Replace(ADDRESS_TAG, String.IsNullOrWhiteSpace(data.Adresse) ? String.Empty : parts[0]);
                            OpenXmlElement last = item;
                            for (int i = 1; i < parts.Length; i++)
                            {
                                last = last.InsertAfterSelf(new Break());
                                last = last.InsertAfterSelf(new Text(parts[i]));
                            }
                        }
                    }

                    #endregion

                    if (item.Text.Contains(A_NR_TAG))
                    {
                        item.Text = item.Text.Replace(A_NR_TAG, String.IsNullOrWhiteSpace(data.Auftragsnummer) ? "" : data.Auftragsnummer);
                    }

                    if (item.Text.Contains(BRUTTO_TAG))
                    {
                        item.Text = item.Text.Replace(BRUTTO_TAG, String.IsNullOrWhiteSpace(data.Brutto) ? "" : data.Brutto);
                    }

                    if (item.Text.Contains(R_DATE_TAG))
                    {
                        item.Text = item.Text.Replace(R_DATE_TAG, String.IsNullOrWhiteSpace(data.Rechnungsdatum) ? "" : data.Rechnungsdatum);
                    }

                    if (item.Text.Contains(L_DATE_TAG))
                    {
                        item.Text = item.Text.Replace(L_DATE_TAG, String.IsNullOrWhiteSpace(data.Lieferdatum) ? "" : data.Lieferdatum);
                    }

                    if (item.Text.Contains(L_AMOUNT_TAG))
                    {
                        item.Text = item.Text.Replace(L_AMOUNT_TAG, String.IsNullOrWhiteSpace(data.Lieferkosten) ? "" : data.Lieferkosten);
                    }

                    if (item.Text.Contains(L_NR_TAG))
                    {
                        item.Text = item.Text.Replace(L_NR_TAG, String.IsNullOrWhiteSpace(data.Lieferscheinnummer) ? "" : data.Lieferscheinnummer);
                    }

                    if (item.Text.Contains(TAX_TAG))
                    {
                        item.Text = item.Text.Replace(TAX_TAG, String.IsNullOrWhiteSpace(data.Mehrwertsteuer) ? "" : data.Mehrwertsteuer);
                    }

                    if (item.Text.Contains(NETTO_TAG))
                    {
                        item.Text = item.Text.Replace(NETTO_TAG, String.IsNullOrWhiteSpace(data.Netto) ? "" : data.Netto);
                    }

                    if (item.Text.Contains(R_NR_TAG))
                    {
                        item.Text = item.Text.Replace(R_NR_TAG, String.IsNullOrWhiteSpace(data.Rechnungsnummer) ? "" : data.Rechnungsnummer);
                    }

                    if (item.Text.Contains(TITLE_TAG))
                    {
                        item.Text = item.Text.Replace(TITLE_TAG, String.IsNullOrWhiteSpace(data.Titel) ? "" : data.Titel);
                    }

                    if (item.Text.Contains(V_DATE_TAG))
                    {
                        item.Text = item.Text.Replace(V_DATE_TAG, String.IsNullOrWhiteSpace(data.Versanddatum) ? "" : data.Versanddatum);
                    }

                    if (item.Text.Contains(K_NR_TAG))
                    {
                        item.Text = item.Text.Replace(V_DATE_TAG, String.IsNullOrWhiteSpace(data.Kundennummer) ? "" : data.Kundennummer);
                    }

                    if (item.Text.Contains(MAHN_TAG))
                    {
                        item.Text = item.Text.Replace(MAHN_TAG, String.IsNullOrWhiteSpace(data.Mahnkosten) ? "" : data.Mahnkosten);
                    }

                    if (item.Text.Contains(L_NR_WORD))
                    {
                        if (String.IsNullOrWhiteSpace(data.Lieferscheinnummer))
                        {
                            item.Text = item.Text.Replace(L_NR_WORD, "");
                        }
                    }

                    if (item.Text.Contains(V_DATE_WORD))
                    {
                        if (String.IsNullOrWhiteSpace(data.Versanddatum))
                        {
                            item.Text = item.Text.Replace(V_DATE_WORD, "");
                        }
                    }
                }
                #endregion

                doc.CompressionOption = System.IO.Packaging.CompressionOption.Maximum;
                doc.Close();

                return(ms.ToArray());
            }
        }
 internal static byte[] DocumentToPdf(DocDescriptor data)
 {
     return(DocumentToPdf(ProcessDocument(data)));
 }