adjust TexFileHandler to VM structure

pull/1/head
Sascha Woitschetzki 2021-06-11 12:05:18 +07:00 committed by Sascha Woitschetzki
parent 106c003ffc
commit 4c55632435
5 changed files with 64 additions and 56 deletions

@ -34,25 +34,5 @@ namespace Gremlin.GremlinData.EntityClasses
public decimal ExtendedListPrice { get; set; }
public decimal NetPrice { get; set; }
public decimal Total { get; set; }
internal string ToTex()
{
throw new NotImplementedException();
}
internal object GetAnschreiben()
{
throw new NotImplementedException();
}
internal object GetItem()
{
throw new NotImplementedException();
}
internal Product GetProduct()
{
throw new NotImplementedException();
}
}
}

@ -1,6 +1,5 @@
using Gremlin.GremlinData.EntityClasses;
using Gremlin.GremlinUI.ViewModels;
using Gremlin.Models;
using System.Collections.Generic;
using System.IO;
using System.Text;
using static Gremlin.GremlinData.EntityClasses.Enums;
@ -17,17 +16,16 @@ namespace Gremlin.Operations
}
}
public static StringBuilder CreateTexFile(List<LineItem> quote, string angebotsnummer, Contact contact, string angebotstitel = "ein Analysegerät", bool brutto = false, int warranty = 12)
public static StringBuilder CreateTexFile(QuoteVM quoteVM, bool? brutto = false)
{
float rand = Properties.Settings.Default.texRand;
decimal mehrwertsteuer = Properties.Settings.Default.MwSt;
StringBuilder texFile = new($"\\documentclass[a4paper,ngerman,parskip,10pt]{{scrlttr2}}" + $"\\usepackage{{lmodern}}" + $"\\usepackage[T1]{{fontenc}}" + $"\\usepackage[utf8]{{inputenc}}" + $"\\usepackage{{babel}}" + $"\\usepackage[hidelinks]{{hyperref}}");
_ = texFile.AppendLine($"\\usepackage[left={rand}cm, right={rand}cm, top={rand}cm, bottom={rand}cm]{{geometry}}");
_ = texFile.AppendLine($"\\usepackage[table]{{xcolor}}\r\n\\usepackage[right]{{eurosym}}\r\n\\usepackage[locale=DE]{{siunitx}}\r\n\\usepackage{{scrlayer-scrpage}}\r\n\\usepackage{{lastpage}}\r\n\\usepackage{{graphicx}}\r\n\\usepackage{{multirow}}\r\n\\usepackage{{longtable}}\r\n\\usepackage{{enumitem}}\r\n\\usepackage{{fp, xstring, spreadtab, numprint}}\r\n\\DeclareSIUnit{{\\sieuro}}{{\\mbox{{\\euro}}}}");
_ = texFile.AppendLine($"\\rohead{{{angebotsnummer}}}");
_ = texFile.AppendLine($"\\rohead{{{quoteVM.QuotationNumber}}}");
_ = texFile.AppendLine("\\cfoot{Seite \\thepage/\\pageref{LastPage}}\n" + "\\sisetup{round-integer-to-decimal,round-precision=2,round-mode=places}" + "\n\\newcommand{\\produkttitel}[1]{\\textsc{#1}}" + "\n\\renewcommand{\\arraystretch}{1.2}\r\n\\definecolor{AgilentBlau}{HTML}{0085d5}" + "\n\\setlist{noitemsep}\r\n\\begin{document}" + "\n\\begin{tabular}{p{0.4\\hsize}p{0.5\\hsize}}" + "\n\\multirow{4}{*}{\\includegraphics[width=0.9\\hsize]{Agilent_Logo_Tag_h_RGB.png}}" + "\n&\\normalsize{Agilent Technologies Sales \\& Services GmbH \\& Co.KG}\\\\" + "\n&\\normalsize{Life Sciences \\& Chemical Analysis}\\\\" + $"\n&\\normalsize{{Hewlett-Packard-Str. 8}}\\\\" + "\n&\\normalsize{D-76337 Waldbronn}" + "\n\\end{tabular}" + "\n\\par\r\n\\begin{flushright}" + "\n\\colorbox{AgilentBlau}{\\textcolor{white}{\\textsc{\\Huge{Angebot}}}}\r\n\\end{flushright}\r\n\\begin{tabular}{p{0.4\\hsize}p{0.6\\hsize}}" + "\n&\n\\multirow{4}{*}{" + "\n\\begin{tabular}{|ll|}" + "\n\\hline");
_ = texFile.AppendLine($"\\textbf{{Angebotsnummer:}}&{angebotsnummer}\\\\");
_ = texFile.AppendLine($"\\textbf{{Angebotsnummer:}}&{quoteVM.QuotationNumber}\\\\");
_ = texFile.Append("Angebotdatum:&\\today\\\\\r\nAngebotsgültigkeit:&60 Tage\\\\");
_ = texFile.AppendLine($"\\textbf{{Ansprechpartner:}}&{RUSettingModel.GetSettingValue(Properties.Settings.Default.userSettingID, "userName")}\\\\");
_ = texFile.AppendLine($"Telefon: &{RUSettingModel.GetSettingValue(Properties.Settings.Default.userSettingID, "userPhone")}\\\\");
@ -38,48 +36,55 @@ namespace Gremlin.Operations
_ = texFile.AppendLine("&\\\\\r\n&\\\\\r\n\\end{tabular}\r\n\\vspace{1cm}\\par ");
//Anrede
_ = contact.Gender == (byte)Gender.Male
? texFile.AppendLine($"Sehr geehrter Herr {contact.LastName},\\par ")
: texFile.AppendLine($"Sehr geehrte Frau {contact.LastName},\\par ");
_ = quoteVM.Recipient.Gender == (byte)Gender.Male
? texFile.AppendLine($"Sehr geehrter Herr {quoteVM.Recipient.LastName},\\par ")
: texFile.AppendLine($"Sehr geehrte Frau {quoteVM.Recipient.LastName},\\par ");
//Anschreiben
_ = texFile.Append(ErstelleAnschreibenListe(quote, angebotstitel));
_ = texFile.Append(ErstelleAnschreibenListe(quoteVM));
//Tabelle
_ = texFile.Append("\\begin{center}");
_ = texFile.Append("\\begin{longtable}");
_ = texFile.Append("{| cp{0.72\\textwidth} cr |} \\hline");
_ = texFile.Append(@"\textbf{\#} & \textbf{Produktbeschreibung} (Produktnummer) & \textbf{Menge} & \textbf{Preis}\\ \hline \endhead");
foreach (LineItem lineItem in quote) { _ = texFile.Append(lineItem.ToTex() + "\n"); }
foreach (LineItemVM lineItemVM in quoteVM.LineItemsVM)
{
string lineItemTex = lineItemVM.OptionNumber != ""
? $"{lineItemVM.Position} &\\textbf{{{lineItemVM.CustomDescription.Heading}}} ({lineItemVM.ProductNumber}\\#{lineItemVM.OptionNumber})\\newline {lineItemVM.CustomDescription.DescriptionText}&{lineItemVM.Amount}&\\SI{{{lineItemVM.TotalNet}}}{{\\sieuro}}\\\\"
: $"{lineItemVM.Position} &\\textbf{{{lineItemVM.CustomDescription.Heading}}} ({lineItemVM.ProductNumber})\\newline {lineItemVM.CustomDescription.DescriptionText}&{lineItemVM.Amount}&\\SI{{{lineItemVM.TotalNet}}}{{\\sieuro}}\\\\";
_ = texFile.Append(lineItemTex + "\n");
}
_ = texFile.Append("\\hline\r\n\\end{longtable}\r\n\\end{center}\r\n\\vspace{-2cm}\r\n\\begin{flushright}\r\n\\begin{large}\r\n\\begin{tabular}{|rr|}\r\n\\hline");
//Gesamtsumme
_ = texFile.AppendLine($"\\textbf{{Gesamtsumme netto}} & \\SI{{{GetSum(quote)}}}{{\\sieuro}}\\\\");
_ = texFile.AppendLine($"\\textbf{{Gesamtsumme netto}} & \\SI{{{quoteVM.TotalNet}}}{{\\sieuro}}\\\\");
//mit Mehrwertsteuer
if (brutto)
if (brutto == true)
{
_ = texFile.AppendLine($"\\textbf{{Mehrwertsteuer {mehrwertsteuer}\\%}} & \\SI{{{GetSum(quote) * mehrwertsteuer / 100}}}{{\\sieuro}}\\\\");
_ = texFile.AppendLine($"\\textbf{{Mehrwertsteuer {quoteVM.VAT}\\%}} & \\SI{{{(float)quoteVM.TotalNet * quoteVM.VAT / 100}}}{{\\sieuro}}\\\\");
_ = texFile.AppendLine($"\\textbf{{Gesamtsumme brutto}} & \\SI{{{GetSum(quote) * (1 + mehrwertsteuer / 100)}}}{{\\sieuro}}\\\\");
_ = texFile.AppendLine($"\\textbf{{Gesamtsumme brutto}} & \\SI{{{(float)quoteVM.TotalNet * (1 + (quoteVM.VAT / 100))}}}{{\\sieuro}}\\\\");
}
_ = texFile.Append("\\hline\r\n\\end{tabular}\r\n\\end{large}\r\n\\end{flushright}\r\n\r\nDer Betrag versteht sich zzgl. der gesetzlichen Steuern.\\\\\r\nDiese werden im Rechnungszeitraum auf der Rechnung gesondert ausgewiesen.\\\\\r\nZahlungsbedingungen: 30 Tage netto ab Rechnungsdatum.\\\\\r\nIncoterm (2010) für Lieferungen innerhalb Deutschlands: DDP.\r\n\\begin{small}\r\n\r\n\\textbf{Gewährleistung:}\\\\\r\nDie Gewährleistung für Zubehör und Ersatzteilprodukte und für Analytik-Hardwareprodukte beträgt ");
_ = texFile.Append(warranty);
_ = texFile.Append(quoteVM.Warranty);
_ = texFile.Append(" Monate.\r\n\r\n\\textbf{Hinweis:}\\\\ \r\nFür den Verkauf der in diesem Angebot aufgeführten Standard-Produkte und -Services gelten die aktuellen \\emph{Agilent Geschäftsbedingungen} und alle sonstigen anwendbaren Zusatzbedingungen sowie zusätzliche Bedingungen, soweit darauf hier Bezug genommen wird. Soweit Produkte oder Services nach speziellen Kundenanforderungen hergestellt, konfiguriert oder angepasst werden, gelten für den Verkauf aller in diesem Angebot aufgeführten Produkte und Services die aktuellen \\emph{Agilent Geschäftsbedingungen für kundenspezifische Produkte} und alle sonstigen anwendbaren Zusatzbedingungen sowie zusätzliche Bedingungen, soweit darauf hier Bezug genommen wird. Eine Kopie der maßgeblichen Bedingungen ist entweder beigefügt oder wurde Ihnen bereits zur Verfügung gestellt. Sollten Sie keine Kopie erhalten haben oder eine weitere Kopie benötigen, setzen Sie sich bitte mit uns in Verbindung. Soweit Sie mit Agilent eine gesonderte Vereinbarung getroffen haben, die den Verkauf der in diesem Angebot aufgeführten Produkte und Services umfasst, sind die Bestimmungen dieser Vereinbarung anwendbar. Abweichende oder ergänzende Vereinbarungen, insbesondere widersprechende Geschäftsbedingungen, sind nur gültig, wenn sie ausdrücklich schriftlich vereinbart worden sind. Die angegebenen Daten zur Verfügbarkeit von Produkten und Services sind vorläufig. Die tatsächlichen Lieferzeiten bzw. Lieferperioden werden Ihnen bei Auftragsbestätigung mitgeteilt. Waren, Technologien oder Software, die aus den Vereinigten Staaten von Amerika (\\emph{USA}) oder anderen exportierenden Ländern ausgeführt werden, unterliegen den Ausfuhrbestimmungen der USA sowie anderer Rechtsordnungen. Bei Ausfuhr ist der Kunde dafür verantwortlich, dass die anwendbaren Ausfuhrbestimmungen eingehalten werden.\r\n\\end{small}\r\n \r\n\\begin{scriptsize}\r\nAgilent Technologies Sales \\& Services GmbH \\& Co. KG, Hewlett-Packard-Str. 8, 76337 Waldbronn\\\\\r\nSitz der Gesellschaft: Waldbronn, Amtsgericht: Mannheim, HRA 706631, WEEE-Reg.-Nr. DE 86631749\\\\\r\nPersönlich haftende Gesellschafterin: Agilent Technologies Sales \\& Services Verwaltungs-GmbH, Hewlett-Packard-Str. 8, 76337 Waldbronn\\\\\r\nSitz der persönlich haftenden Gesellschafterin: Waldbronn, Amtsgericht Mannheim, HRB 723773\\\\\r\nGeschäftsführer: Armin Jehle\r\n\\href{www.agilent.com}{www.agilent.com}\r\n\\end{scriptsize}\r\n\\end{document}");
return texFile;
}
private static StringBuilder ErstelleAnschreibenListe(List<LineItem> quote, string angebotstyp)
private static StringBuilder ErstelleAnschreibenListe(QuoteVM quoteVM)
{
bool subitem = false;
StringBuilder anschreibenListe = new($"nachfolgend erhalten Sie Ihr gewünschtes Angebot über eine {angebotstyp}.\\\\" + $"Es umfasst im Einzelnen:\n" + $"\\begin{{itemize}}");
StringBuilder anschreibenListe = new($"nachfolgend erhalten Sie Ihr gewünschtes Angebot über eine {quoteVM.QuotationType}.\\\\" + $"Es umfasst im Einzelnen:\n" + $"\\begin{{itemize}}");
foreach (LineItem lineItem in quote)
foreach (LineItemVM lineItemVM in quoteVM.LineItemsVM)
{
if (lineItem.OptionNumber == "")
if (lineItemVM.OptionNumber == "")
{
//Hauptitem
if (subitem)
@ -88,21 +93,21 @@ namespace Gremlin.Operations
_ = anschreibenListe.AppendLine(@"\end{itemize}");
subitem = false;
}
_ = anschreibenListe.AppendLine($"\\item {lineItem.GetAnschreiben()} (\\#{lineItem.GetItem()})");
_ = anschreibenListe.AppendLine($"\\item {lineItemVM.CustomDescription.CoverletterText} (\\#{lineItemVM.Position})");
}
else
{
if (subitem)
{
//weiteres Subitem
_ = anschreibenListe.AppendLine($"\\item {lineItem.GetAnschreiben()} (\\#{lineItem.GetItem()})");
_ = anschreibenListe.AppendLine($"\\item {lineItemVM.CustomDescription.CoverletterText} (\\#{lineItemVM.Position})");
}
else
{
//neues Subitem
subitem = true;
_ = anschreibenListe.AppendLine("\\begin{itemize}");
_ = anschreibenListe.AppendLine($"\\item {lineItem.GetAnschreiben()} (\\#{lineItem.GetItem()})");
_ = anschreibenListe.AppendLine($"\\item {lineItemVM.CustomDescription.CoverletterText} (\\#{lineItemVM.Position})");
}
}
}
@ -118,14 +123,14 @@ namespace Gremlin.Operations
return anschreibenListe;
}
public static decimal GetSum(List<LineItem> quote)
{
decimal gesamtnetto = new();
foreach (LineItem lineItem in quote)
{
gesamtnetto += lineItem.ListPrice;
}
return gesamtnetto;
}
//public static decimal GetSum(List<LineItem> quote)
//{
// decimal gesamtnetto = new();
// foreach (LineItem lineItem in quote)
// {
// gesamtnetto += lineItem.ListPrice;
// }
// return gesamtnetto;
//}
}
}

@ -82,14 +82,15 @@
<StackPanel>
<Button x:Name="butPasteQuote" Content="Angebot aus PriceSurfer einfügen" Margin="10,5,10,5" Click="ButPasteQuote_Click" />
<TextBlock x:Name="lblQuote" Text="Bitte Angebot einfügen." Height="150" Margin="10,5,10,5"/>
<DataGrid x:Name="dgLineItems" AutoGenerateColumns="True" Height="300" Margin="10,5,10,5" />
<DataGrid x:Name="dgLineItems" AutoGenerateColumns="True" Height="280" Margin="10,5,10,5" />
</StackPanel>
</Grid>
<Grid Grid.Row="3" Height="Auto" x:Name="gridUnten" Margin="10,5,10,5">
<StackPanel>
<Button x:Name="butCreateQuote" Content="Angebot als PDF erstellen und öffnen" Margin="10,5,10,5"/>
<Button x:Name="butSendQuote" Content="Angebot als Anhang in Mail-Entwurf erstellen" Margin="10,5,10,5"/>
<Button x:Name="butCreateTex" Content="Tex erstellen und öffnen" Margin="10,5,10,5" Click="ButCreateTex_Click" />
<Button x:Name="butCreateQuote" Content="Angebot als PDF erstellen und öffnen" Margin="10,5,10,5" Click="ButCreateQuote_Click" />
<Button x:Name="butSendQuote" Content="Angebot als Anhang in Mail-Entwurf erstellen" Margin="10,5,10,5" Click="ButSendQuote_Click" />
</StackPanel>
</Grid>
</Grid>

@ -1,5 +1,6 @@
using Gremlin.GremlinData.EntityClasses;
using Gremlin.GremlinUI.ViewModels;
using Gremlin.Operations;
using Gremlin.ViewModels;
using System.Collections.ObjectModel;
using System.Windows;
@ -46,5 +47,20 @@ namespace Gremlin.GremlinUI
lineItems = new(lineItemsViewModel);
UpdateUI();
}
private void ButCreateTex_Click(object sender, RoutedEventArgs e)
{
TexFileHandler.CreateTexFile(quoteVM, cbBrutto.IsChecked);
}
private void ButCreateQuote_Click(object sender, RoutedEventArgs e)
{
}
private void ButSendQuote_Click(object sender, RoutedEventArgs e)
{
}
}
}

@ -8,6 +8,7 @@ namespace Gremlin.GremlinUI.ViewModels
internal class QuoteVM : BaseVM
{
public string QuotationNumber { get; set; }
public string QuotationType { get; set; }
public ContactVM Recipient { get; set; }
public ContactVM SalesRep { get; set; }
public List<LineItemVM> LineItemsVM { get; set; }
@ -15,20 +16,23 @@ namespace Gremlin.GremlinUI.ViewModels
public decimal AverageDiscount { get; set; }
public decimal TotalNet { get; set; }
public float VAT { get; set; }
public int Warranty { get; set; }
public bool QuoteContains3PP { get; set; }
public bool QuoteContainsRB { get; set; }
internal QuoteVM() { }
internal QuoteVM(string quotationNumber, ContactVM recipient, ContactVM salesRep, decimal totalListprice, decimal totalDiscount, decimal totalNet, float vAT, bool quoteContains3PP, bool quoteContainsRB)
internal QuoteVM(string quotationNumber, string quotationType, ContactVM recipient, ContactVM salesRep, decimal totalListprice, decimal totalDiscount, decimal totalNet, float vAT, int warranty, bool quoteContains3PP, bool quoteContainsRB)
{
QuotationNumber = quotationNumber ?? throw new ArgumentNullException(nameof(quotationNumber));
QuotationType = quotationType ?? throw new ArgumentNullException(nameof(quotationType));
Recipient = recipient ?? throw new ArgumentNullException(nameof(recipient));
SalesRep = salesRep ?? throw new ArgumentNullException(nameof(salesRep));
TotalListprice = totalListprice;
AverageDiscount = totalDiscount;
TotalNet = totalNet;
VAT = vAT;
Warranty = warranty;
QuoteContains3PP = quoteContains3PP;
QuoteContainsRB = quoteContainsRB;
}
@ -36,12 +40,14 @@ namespace Gremlin.GremlinUI.ViewModels
public override string ToString()
{
return $"QuotationNumber: {QuotationNumber}\n"
+ $"QuotationType: {QuotationType}\n"
+ $"Recipient: {Recipient}\n"
+ $"SalesRep: {SalesRep}\n"
+ $"TotalListprice: {TotalListprice}\n"
+ $"AverageDiscount: {AverageDiscount}\n"
+ $"TotalNet: {TotalNet}\n"
+ $"VAT: {VAT}\n"
+ $"Warranty: {Warranty}\n"
+ $"QuoteContains3PP: {QuoteContains3PP}\n"
+ $"QuoteContainsRB: {QuoteContainsRB}";
}