Percentage DisplayFormat

pull/1/head
DJh2o2 2023-02-28 09:58:21 +07:00
parent 5cf114cf82
commit 82a7eca9b7
14 changed files with 1133 additions and 507 deletions

@ -17,7 +17,7 @@
UseValidation Narrow FixedHeader Editable ShowPager Bordered Hoverable Sortable Filterable Striped Responsive> UseValidation Narrow FixedHeader Editable ShowPager Bordered Hoverable Sortable Filterable Striped Responsive>
<DataGridColumns> <DataGridColumns>
<DataGridCommandColumn NewCommandAllowed="false" EditCommandAllowed="false" DeleteCommandAllowed="false"> <DataGridCommandColumn NewCommandAllowed="true" EditCommandAllowed="true" DeleteCommandAllowed="true">
<SaveCommandTemplate> <SaveCommandTemplate>
<Button ElementId="btnSave" Type="ButtonType.Submit" PreventDefaultOnSubmit Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button> <Button ElementId="btnSave" Type="ButtonType.Submit" PreventDefaultOnSubmit Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</SaveCommandTemplate> </SaveCommandTemplate>
@ -45,8 +45,13 @@
@if (selectedContact != null) { @if (selectedContact != null) {
<h2>Quotes for SelectedContact: @selectedContact.FirstName @selectedContact.LastName</h2> <h2>Quotes for SelectedContact: @selectedContact.FirstName @selectedContact.LastName</h2>
<DataGrid TItem="Quote" Data="@selectedContact.Quotes" SelectedRow="@selectedQuote" SelectedRowChanged="@OnSelectedQuoteChanged" Narrow FixedHeader Bordered Hoverable Filterable Striped Responsive> <DataGrid TItem="Quote"
Data="@selectedContact.Quotes"
SelectedRow="@selectedQuote"
SelectedRowChanged="@OnSelectedQuoteChanged"
Narrow FixedHeader Bordered Hoverable Filterable Striped Responsive>
<DataGridCommandColumn/> <DataGridCommandColumn/>
<DataGridColumn Field="@nameof(Quote.QuoteId)" Caption="#" Filterable Sortable/> <DataGridColumn Field="@nameof(Quote.QuoteId)" Caption="#" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuotationNumber)" Caption="QuotationNumber" Filterable Sortable/> <DataGridColumn Field="@nameof(Quote.QuotationNumber)" Caption="QuotationNumber" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuotationDate)" Caption="Date" Filterable Sortable/> <DataGridColumn Field="@nameof(Quote.QuotationDate)" Caption="Date" Filterable Sortable/>
@ -56,6 +61,20 @@
<DataGridColumn Field="@nameof(Quote.QuoteContains3Pp)" Caption="3PP" Filterable Sortable/> <DataGridColumn Field="@nameof(Quote.QuoteContains3Pp)" Caption="3PP" Filterable Sortable/>
<DataGridColumn Field="@nameof(Quote.QuoteContainsRb)" Caption="RB" Filterable Sortable/> <DataGridColumn Field="@nameof(Quote.QuoteContainsRb)" Caption="RB" Filterable Sortable/>
</DataGrid> </DataGrid>
@if (selectedQuote?.LineItems != null) {
<h2>LineItems in SelectedQuote: @selectedQuote.QuotationNumber</h2>
<DataGrid TItem="LineItem" Data="@selectedQuote.LineItems" ShowPager Bordered Hoverable Striped Responsive>
<DataGridCommandColumn />
<DataGridColumn Field="@nameof(LineItem.Position)" Caption="Position" />
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount" />
<DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber" />
<DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber" />
<DataGridColumn Field="@nameof(LineItem.SapShortDescription)" Caption="SapShortDescription" />
<DataGridColumn Field="@nameof(LineItem.ListPrice)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="ListPrice" />
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" DisplayFormat="{0:n2}%" Caption="TotalDiscount" />
<DataGridColumn Field="@nameof(LineItem.Total)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="Total" />
</DataGrid>
}
} }
</Authorized> </Authorized>
<NotAuthorized> <NotAuthorized>
@ -64,40 +83,35 @@
</NotAuthorized> </NotAuthorized>
</AuthorizeView> </AuthorizeView>
@if (selectedQuote?.LineItems != null) {
<h2>LineItems in SelectedQuote: @selectedQuote.QuotationNumber</h2>
<DataGrid TItem="LineItem" Data="@selectedQuote.LineItems" ShowPager Bordered Hoverable Striped Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount"/>
<DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber"/>
<DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber"/>
<DataGridColumn Field="@nameof(LineItem.ListPrice)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="ListPrice"/>
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" Caption="TotalDiscount" DisplayFormat="{0.00%}." DisplayFormatProvider=cultureInfo/>
<DataGridColumn Field="@nameof(LineItem.Total)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="Total"/>
</DataGrid>
}
@code { @code {
private IList<Contact>? contacts; private IList<Contact>? contacts;
private Contact? selectedContact; private Contact? selectedContact;
private Quote? selectedQuote; private Quote? selectedQuote;
private readonly CultureInfo cultureInfo = new("de-DE"); private readonly CultureInfo cultureInfo = new("de-DE");
protected override Task OnInitializedAsync() { protected override Task OnInitializedAsync() {
contacts = GenericController.GetAll<Contact>(); contacts = GenericController.GetAll<Contact>();
return base.OnInitializedAsync(); return base.OnInitializedAsync();
} }
private Task OnSelectedContactChanged(Contact sC) { private Task OnSelectedContactChanged(Contact _selectedContact) {
selectedContact = sC; if (_selectedContact != null)
selectedContact.Quotes = GenericController.GetAll<Quote>(q => q.ContactId == selectedContact.ContactId); {
return Task.CompletedTask; selectedContact = _selectedContact;
selectedContact.Quotes = GenericController.GetAll<Quote>(q => q.ContactId.Equals(selectedContact.ContactId));
} }
return Task.CompletedTask;
}
private Task OnSelectedQuoteChanged(Quote sQ) { private Task OnSelectedQuoteChanged(Quote _selectedQuote) {
selectedQuote = sQ; if (_selectedQuote != null)
selectedQuote.LineItems = GenericController.GetAll<LineItem>(lI => lI.QuoteId == selectedQuote.QuoteId); {
return Task.CompletedTask; selectedQuote = _selectedQuote;
selectedQuote.LineItems = GenericController.GetAll<LineItem>(lI => lI.QuoteId.Equals(selectedQuote.QuoteId));
} }
return Task.CompletedTask;
}
} }

@ -2,34 +2,46 @@
@using Gremlin_BlazorServer.Services @using Gremlin_BlazorServer.Services
@using Gremlin_BlazorServer.Data.EntityClasses @using Gremlin_BlazorServer.Data.EntityClasses
@using System.Security.Claims @using System.Security.Claims
@using System.Globalization;
@inject GenericController GenericController @inject GenericController GenericController
icController
<AuthorizeView> <AuthorizeView>
<Authorized> <Authorized Context="Auth">
<h1>LineItems</h1> <h1>LineItems</h1>
<DataGrid TItem="LineItem" Data="@lineItems" SelectedRow="@selectedLineItem" SelectedRowChanged="@OnSelectedLineItemChanged" Editable ShowPager Bordered Hoverable Sortable Filterable Striped Responsive> <DataGrid TItem="LineItem"
<DataGridCommandColumn/> Data="@lineItems"
<DataGridColumn Field="@nameof(LineItem.LineItemId)" Caption="LineItemId" Filterable Sortable Editable/> SelectedRow="@selectedLineItem"
<DataGridColumn Field="@nameof(LineItem.QuoteId)" Caption="QuoteId" Filterable Sortable Editable/> SelectedRowChanged="@OnSelectedLineItemChanged"
<DataGridColumn Field="@nameof(LineItem.Position)" Caption="Position" Filterable Sortable Editable/> CommandMode="DataGridCommandMode.ButtonRow"
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount" Filterable Sortable Editable/> EditMode="DataGridEditMode.Popup"
<DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="LineItemId" Filterable Sortable Editable/> UseValidation Narrow FixedHeader Editable ShowPager Bordered Hoverable Sortable Filterable Striped Responsive>
<DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="QuoteId" Filterable Sortable Editable/> <DataGridColumns>
<DataGridColumn Field="@nameof(LineItem.SapShortDescription)" Caption="Position" Filterable Sortable Editable/> <DataGridCommandColumn NewCommandAllowed="true" EditCommandAllowed="true" DeleteCommandAllowed="true">
<DataGridColumn Field="@nameof(LineItem.SapLongDescription)" Caption="Amount" Filterable Sortable Editable/> <SaveCommandTemplate>
<DataGridColumn Field="@nameof(LineItem.ProductLine)" Caption="ProductLine" Filterable Sortable Editable/> <Button ElementId="btnSave" Type="ButtonType.Submit" PreventDefaultOnSubmit Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button>
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" Caption="TotalDiscount" Filterable Sortable Editable/> </SaveCommandTemplate>
<DataGridColumn Field="@nameof(LineItem.SalesDiscount)" Caption="SalesDiscount" Filterable Sortable Editable/> <CancelCommandTemplate>
<DataGridColumn Field="@nameof(LineItem.PromotionalDiscount)" Caption="PromotionalDiscount" Filterable Sortable Editable/> <Button ElementId="btnCancel" Color="Color.Secondary" Clicked="@context.Clicked">@context.LocalizationString</Button>
<DataGridColumn Field="@nameof(LineItem.ContractualDiscount)" Caption="ContractualDiscount" Filterable Sortable Editable/> </CancelCommandTemplate>
<DataGridColumn Field="@nameof(LineItem.DemoDiscount)" Caption="DemoDiscount" Filterable Sortable Editable/> </DataGridCommandColumn>
<DataGridColumn Field="@nameof(LineItem.ListPrice)" Caption="ListPrice" Filterable Sortable Editable/> <DataGridColumn Field="@nameof(LineItem.QuoteId)" Caption="QuoteId" />
<DataGridColumn Field="@nameof(LineItem.ExtendedListPrice)" Caption="ExtendedListPrice" Filterable Sortable Editable/> <DataGridColumn Field="@nameof(LineItem.Position)" Caption="Position" />
<DataGridColumn Field="@nameof(LineItem.NetPrice)" Caption="NetPrice" Filterable Sortable Editable/> <DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount" />
<DataGridColumn Field="@nameof(LineItem.Total)" Caption="Total" Filterable Sortable Editable/> <DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber" />
</DataGrid> <DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber" />
<DataGridColumn Field="@nameof(LineItem.SapShortDescription)" Caption="SapShortDescription" />
<DataGridColumn Field="@nameof(LineItem.ListPrice)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="ListPrice" />
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" DisplayFormat="{0:n2}%" Caption="TotalDiscount" />
<DataGridColumn Field="@nameof(LineItem.Total)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="Total" />
</DataGridColumns>
<ButtonRowTemplate>
<Button Color="Color.Success" Clicked="context.NewCommand.Clicked">New</Button>
<Button Color="Color.Primary" Disabled="selectedLineItem is null" Clicked="context.EditCommand.Clicked">Edit</Button>
<Button Color="Color.Danger" Disabled="selectedLineItem is null" Clicked="context.DeleteCommand.Clicked">Delete</Button>
<Button Color="Color.Secondary" Clicked="context.ClearFilterCommand.Clicked">Clear Filter</Button>
</ButtonRowTemplate>
</DataGrid>
</Authorized> </Authorized>
<NotAuthorized> <NotAuthorized>
<h3>Authentication Failure!</h3> <h3>Authentication Failure!</h3>
@ -44,6 +56,7 @@ icController
private IList<LineItem>? lineItems; private IList<LineItem>? lineItems;
private LineItem? selectedLineItem; private LineItem? selectedLineItem;
private readonly CultureInfo cultureInfo = new("de-DE");
protected override async Task OnInitializedAsync() { protected override async Task OnInitializedAsync() {
if (AuthenticationStateTask != null) { if (AuthenticationStateTask != null) {
@ -55,8 +68,8 @@ icController
} }
} }
private void OnSelectedLineItemChanged(LineItem sCd) { private void OnSelectedLineItemChanged(LineItem _selectedLineItem) {
selectedLineItem = sCd; selectedLineItem = _selectedLineItem;
} }
} }

@ -116,13 +116,19 @@
@if (quote.LineItems != null) { @if (quote.LineItems != null) {
<h2>LineItems</h2> <h2>LineItems</h2>
<DataGrid TItem="LineItem" Data="@quote.LineItems" SelectedRow="@selectedLineItem" SelectedRowChanged="@OnSelectedLineItemChanged" Bordered Hoverable Striped ShowPager Responsive> <DataGrid TItem="LineItem"
<DataGridCommandColumn/> Data="@quote.LineItems"
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount"/> SelectedRow="@selectedLineItem"
SelectedRowChanged="@OnSelectedLineItemChanged"
Bordered Hoverable Striped ShowPager Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(LineItem.Position)" Caption="Position" />
<DataGridColumn Field="@nameof(LineItem.Amount)" Caption="Amount" />
<DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber"/> <DataGridColumn Field="@nameof(LineItem.ProductNumber)" Caption="ProductNumber"/>
<DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber"/> <DataGridColumn Field="@nameof(LineItem.OptionNumber)" Caption="OptionNumber"/>
<DataGridColumn Field="@nameof(LineItem.ListPrice)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="ListPrice"/> <DataGridColumn Field="@nameof(LineItem.SapShortDescription)" Caption="SapShortDescription" />
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" Caption="TotalDiscount"/> <DataGridColumn Field="@nameof(LineItem.ListPrice)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="ListPrice" />
<DataGridColumn Field="@nameof(LineItem.TotalDiscount)" DisplayFormat="{0:n2}%" Caption="TotalDiscount" />
<DataGridColumn Field="@nameof(LineItem.Total)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="Total"/> <DataGridColumn Field="@nameof(LineItem.Total)" DisplayFormat="{0:C}" DisplayFormatProvider=cultureInfo Caption="Total"/>
</DataGrid> </DataGrid>

@ -1,47 +1,109 @@
using Gremlin_BlazorServer.Data.DBClasses; using Gremlin_BlazorServer.Data.DBClasses;
using Gremlin_BlazorServer.Data.EntityClasses; using Gremlin_BlazorServer.Data.EntityClasses;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
namespace Gremlin_BlazorServer.Services; namespace Gremlin_BlazorServer.Services;
public class GenericController { public class GenericController
{
private readonly GremlinDb gremlinDb = new(); private readonly GremlinDb gremlinDb = new();
public IList<TResult> GetAll<TResult>() where TResult : class, IMetadata { public IList<TResult>? GetAll<TResult>() where TResult : class, IMetadata
return gremlinDb.Set<TResult>().ToList(); {
try
{
return gremlinDb.Set<TResult>().ToList();
}
catch (Exception exception)
{
Console.WriteLine(exception.InnerException);
return null;
}
} }
public IList<TResult> GetAll<TResult>(string include) where TResult : class, IMetadata { public IList<TResult>? GetAll<TResult>(string include) where TResult : class, IMetadata
return gremlinDb.Set<TResult>().Include(include).ToList(); {
try
{
return gremlinDb.Set<TResult>().Include(include).ToList();
}
catch (Exception exception)
{
Console.WriteLine(exception.InnerException);
return null;
}
} }
public IList<TResult> GetAll<TResult>(Predicate<TResult> search) where TResult : class, IMetadata { public IList<TResult>? GetAll<TResult>(Predicate<TResult> search) where TResult : class, IMetadata
return gremlinDb.Set<TResult>().AsEnumerable().Where(t => search(t)).ToList(); {
try
{
return gremlinDb.Set<TResult>().AsEnumerable().Where(t => search(t)).ToList();
}
catch (Exception exception)
{
Console.WriteLine(exception.InnerException);
return null;
}
} }
public IList<TResult> GetAll<TResult>(Predicate<TResult> search, string include) where TResult : class, IMetadata { public IList<TResult>? GetAll<TResult>(Predicate<TResult> search, string include) where TResult : class, IMetadata
return gremlinDb.Set<TResult>().Include(include).AsEnumerable().Where(t => search(t)).ToList(); {
try
{
return gremlinDb.Set<TResult>().Include(include).AsEnumerable().Where(t => search(t)).ToList();
}
catch (Exception exception)
{
Console.WriteLine(exception.InnerException);
return null;
}
} }
public TResult? Get<TResult>(Predicate<TResult> search) where TResult : class, IMetadata { public TResult? Get<TResult>(Predicate<TResult> search) where TResult : class, IMetadata
return gremlinDb.Set<TResult>().AsEnumerable().FirstOrDefault(t => search(t)); {
try
{
return gremlinDb.Set<TResult>().AsEnumerable().FirstOrDefault(t => search(t));
}
catch (Exception exception)
{
Console.WriteLine(exception.InnerException);
return null;
}
} }
public TResult? Get<TResult>(Predicate<TResult> search, string include) where TResult : class, IMetadata { public TResult? Get<TResult>(Predicate<TResult> search, string include) where TResult : class, IMetadata
return gremlinDb.Set<TResult>().Include(include).AsEnumerable().FirstOrDefault(t => search(t)); {
try
{
return gremlinDb.Set<TResult>().Include(include).AsEnumerable().FirstOrDefault(t => search(t));
}
catch (Exception exception)
{
Console.WriteLine(exception.InnerException);
return null;
}
} }
public TResult GetLast<TResult>() where TResult : class, IMetadata { public TResult? GetLast<TResult>() where TResult : class, IMetadata
return gremlinDb.Set<TResult>().AsEnumerable().Last(); {
try
{
return gremlinDb.Set<TResult>().AsEnumerable().Last();
}
catch (Exception exception)
{
Console.WriteLine(exception.InnerException);
return null;
}
} }
public int Insert<T>(T entity) where T : class, IMetadata public int Insert<T>(T entity) where T : class, IMetadata
{ {
try try
{ {
gremlinDb.Set<T>().Add(entity); _ = gremlinDb.Set<T>().Add(entity);
return gremlinDb.SaveChanges(); return gremlinDb.SaveChanges();
} }
catch (Exception exception) catch (Exception exception)
@ -67,14 +129,22 @@ public class GenericController {
public bool IsExisting<T>(Predicate<T> search) where T : class, IMetadata public bool IsExisting<T>(Predicate<T> search) where T : class, IMetadata
{ {
return gremlinDb.Set<T>().AsEnumerable().Any(t => search(t)); try
{
return gremlinDb.Set<T>().AsEnumerable().Any(t => search(t));
}
catch (Exception exception)
{
Console.WriteLine(exception.InnerException);
return false;
}
} }
public int Update<T>(T entity) where T : class, IMetadata public int Update<T>(T entity) where T : class, IMetadata
{ {
try try
{ {
gremlinDb.Set<T>().Update(entity); _ = gremlinDb.Set<T>().Update(entity);
return gremlinDb.SaveChanges(); return gremlinDb.SaveChanges();
} }
catch (Exception exception) catch (Exception exception)

@ -8,432 +8,432 @@ namespace Gremlin_BlazorServer.Services;
public abstract class TexService public abstract class TexService
{ {
private static readonly GenericController genericController = new(); private static readonly GenericController genericController = new();
public static async Task<StringBuilder?> CreateTex(Quote quote) public static async Task<StringBuilder?> CreateTex(Quote quote)
{ {
StringBuilder? texStringBuilder = await Task.Run(() => CreateTexFile(quote)); StringBuilder? texStringBuilder = await Task.Run(() => CreateTexFile(quote));
if (texStringBuilder == null) if (texStringBuilder == null)
return null; return null;
string correctedTex = await Task.Run(() => Replace(texStringBuilder.ToString())); string correctedTex = await Task.Run(() => Replace(texStringBuilder.ToString()));
return new(correctedTex); return new(correctedTex);
} }
private static StringBuilder? CreateBriefkopf(Contact recipient, bool tex = false) private static StringBuilder? CreateBriefkopf(Contact recipient, bool tex = false)
{ {
if (recipient.Account?.AccountName == null) if (recipient.Account?.AccountName == null)
return null; return null;
StringBuilder briefkopf = new(); StringBuilder briefkopf = new();
if (recipient.Gender == (byte)Gender.Male) if (recipient.Gender == (byte)Gender.Male)
{ {
briefkopf.AppendLine($"Herr {recipient.FirstName} {recipient.LastName}"); briefkopf.AppendLine($"Herr {recipient.FirstName} {recipient.LastName}");
} }
else else
{ {
briefkopf.AppendLine($"Frau {recipient.FirstName} {recipient.LastName}"); briefkopf.AppendLine($"Frau {recipient.FirstName} {recipient.LastName}");
} }
if (tex) if (tex)
briefkopf.AppendLine("\\\\"); briefkopf.AppendLine("\\\\");
//AccountNamen mit "&" im Namen abfangen //AccountNamen mit "&" im Namen abfangen
string accountName = recipient.Account.AccountName.Replace("&", "\\&"); string accountName = recipient.Account.AccountName.Replace("&", "\\&");
briefkopf.AppendLine($"{accountName}"); briefkopf.AppendLine($"{accountName}");
if (tex) if (tex)
briefkopf.AppendLine("\\\\"); briefkopf.AppendLine("\\\\");
briefkopf.AppendLine($"{recipient.Account.Street}"); briefkopf.AppendLine($"{recipient.Account.Street}");
if (tex) if (tex)
briefkopf.AppendLine("\\\\"); briefkopf.AppendLine("\\\\");
briefkopf.AppendLine($"{recipient.Account.Zip} {recipient.Account.City}"); briefkopf.AppendLine($"{recipient.Account.Zip} {recipient.Account.City}");
if (tex) if (tex)
briefkopf.AppendLine("\\\\"); briefkopf.AppendLine("\\\\");
return briefkopf; return briefkopf;
} }
private static StringBuilder? CreateTexFile(Quote quote) private static StringBuilder? CreateTexFile(Quote quote)
{ {
if (quote.Recipient == null || quote.LineItems == null) if (quote.Recipient == null || quote.LineItems == null)
return null; return null;
const string rand = "2"; //RUSettingModel.GetSettingValue(Properties.Settings.Default.userSettingID, "texRand"); const string rand = "2"; //RUSettingModel.GetSettingValue(Properties.Settings.Default.userSettingID, "texRand");
StringBuilder texFile = StringBuilder texFile =
new( new(
"\\documentclass[a4paper,ngerman,parskip,10pt]{scrlttr2}\n" "\\documentclass[a4paper,ngerman,parskip,10pt]{scrlttr2}\n"
+ "\\usepackage{lmodern}\n" + "\\usepackage{lmodern}\n"
+ "\\usepackage[T1]{fontenc}\n" + "\\usepackage[T1]{fontenc}\n"
+ "\\usepackage[utf8]{inputenc}\n" + "\\usepackage[utf8]{inputenc}\n"
+ "\\usepackage{babel}\n" + "\\usepackage{babel}\n"
+ "\\usepackage[hidelinks]{hyperref}\n" + "\\usepackage[hidelinks]{hyperref}\n"
); );
texFile.AppendLine( texFile.AppendLine(
$"\\usepackage[left={rand}cm, right={rand}cm, top={rand}cm, bottom={rand}cm]{{geometry}}\n" $"\\usepackage[left={rand}cm, right={rand}cm, top={rand}cm, bottom={rand}cm]{{geometry}}\n"
); );
texFile.AppendLine( texFile.AppendLine(
"\\usepackage[table]{xcolor}\n" "\\usepackage[table]{xcolor}\n"
+ "\\usepackage[right]{{eurosym}}\n" + "\\usepackage[right]{{eurosym}}\n"
+ "\\usepackage[locale=DE]{{siunitx}}\n" + "\\usepackage[locale=DE]{{siunitx}}\n"
+ "\\usepackage{{scrlayer-scrpage}}\n" + "\\usepackage{{scrlayer-scrpage}}\n"
+ "\\usepackage{{lastpage}}\n" + "\\usepackage{{lastpage}}\n"
+ "\\usepackage{{graphicx}}\n" + "\\usepackage{{graphicx}}\n"
+ "\\usepackage{{multirow}}\n" + "\\usepackage{{multirow}}\n"
+ "\\usepackage{{longtable}}\n" + "\\usepackage{{longtable}}\n"
+ "\\usepackage{{enumitem}}\n" + "\\usepackage{{enumitem}}\n"
+ "\\usepackage{{fp, xstring, spreadtab, numprint}}\n" + "\\usepackage{{fp, xstring, spreadtab, numprint}}\n"
+ "\\DeclareSIUnit{{\\sieuro}}{{\\mbox{{\\euro}}}}" + "\\DeclareSIUnit{{\\sieuro}}{{\\mbox{{\\euro}}}}"
); );
texFile.AppendLine($"\\rohead{{{quote.QuotationNumber}}}"); texFile.AppendLine($"\\rohead{{{quote.QuotationNumber}}}");
texFile.AppendLine( texFile.AppendLine(
"\\cfoot{Seite \\thepage/\\pageref{LastPage}}\n" "\\cfoot{Seite \\thepage/\\pageref{LastPage}}\n"
+ "\\sisetup{round-integer-to-decimal,round-precision=2,round-mode=places}" + "\\sisetup{round-integer-to-decimal,round-precision=2,round-mode=places}"
+ "\n\\newcommand{\\produkttitel}[1]{\\textsc{#1}}" + "\n\\newcommand{\\produkttitel}[1]{\\textsc{#1}}"
+ "\n\\renewcommand{\\arraystretch}{1.2}\n\\definecolor{AgilentBlau}{HTML}{0085d5}" + "\n\\renewcommand{\\arraystretch}{1.2}\n\\definecolor{AgilentBlau}{HTML}{0085d5}"
+ "\n\\setlist{noitemsep}\n\\begin{document}" + "\n\\setlist{noitemsep}\n\\begin{document}"
+ "\n\\begin{tabular}{p{0.4\\hsize}p{0.5\\hsize}}" + "\n\\begin{tabular}{p{0.4\\hsize}p{0.5\\hsize}}"
+ "\n\\multirow{4}{*}{\\includegraphics[width=0.9\\hsize]{agilentLogo.png}}" + "\n\\multirow{4}{*}{\\includegraphics[width=0.9\\hsize]{agilentLogo.png}}"
+ "\n&\\normalsize{Agilent Technologies Deutschland GmbH}\\\\" + "\n&\\normalsize{Agilent Technologies Deutschland GmbH}\\\\"
+ "\n&\\normalsize{Life Sciences \\& Chemical Analysis}\\\\" + "\n&\\normalsize{Life Sciences \\& Chemical Analysis}\\\\"
+ "\n&\\normalsize{Hewlett-Packard-Str. 8}\\\\" + "\n&\\normalsize{Hewlett-Packard-Str. 8}\\\\"
+ "\n&\\normalsize{D-76337 Waldbronn}" + "\n&\\normalsize{D-76337 Waldbronn}"
+ "\n\\end{tabular}" + "\n\\end{tabular}"
+ "\n\\par\n\\begin{flushright}" + "\n\\par\n\\begin{flushright}"
); );
if (quote.IsPriceInformation) if (quote.IsPriceInformation)
texFile.AppendLine( texFile.AppendLine(
"\n\\colorbox{AgilentBlau}{\\textcolor{white}{\\textsc{\\Huge{Preisinformation}}}}\n\\end{flushright}\n\\begin{tabular}{p{0.4\\hsize}p{0.6\\hsize}}" "\n\\colorbox{AgilentBlau}{\\textcolor{white}{\\textsc{\\Huge{Preisinformation}}}}\n\\end{flushright}\n\\begin{tabular}{p{0.4\\hsize}p{0.6\\hsize}}"
); );
else else
texFile.AppendLine( texFile.AppendLine(
"\n\\colorbox{AgilentBlau}{\\textcolor{white}{\\textsc{\\Huge{Angebot}}}}\n\\end{flushright}\n\\begin{tabular}{p{0.4\\hsize}p{0.6\\hsize}}" "\n\\colorbox{AgilentBlau}{\\textcolor{white}{\\textsc{\\Huge{Angebot}}}}\n\\end{flushright}\n\\begin{tabular}{p{0.4\\hsize}p{0.6\\hsize}}"
); );
texFile.AppendLine("\n &\n\\multirow{4}{*}{" + "\n\\begin{tabular}{|ll|}" + "\n\\hline"); texFile.AppendLine("\n &\n\\multirow{4}{*}{" + "\n\\begin{tabular}{|ll|}" + "\n\\hline");
texFile.AppendLine($"\\textbf{{Angebotsnummer:}}&{quote.QuotationNumber}\\\\"); texFile.AppendLine($"\\textbf{{Angebotsnummer:}}&{quote.QuotationNumber}\\\\");
texFile.Append($"Angebotdatum:&\\today\\\\\nAngebotsgültigkeit:&{quote.ValidFor} Tage\\\\"); texFile.Append($"Angebotdatum:&\\today\\\\\nAngebotsgültigkeit:&{quote.ValidFor} Tage\\\\");
if (quote.SalesRep != null) if (quote.SalesRep != null)
{ {
texFile.AppendLine( texFile.AppendLine(
$"\\textbf{{Ansprechpartner:}}&{quote.SalesRep.FirstName} {quote.SalesRep.LastName}\\\\" $"\\textbf{{Ansprechpartner:}}&{quote.SalesRep.FirstName} {quote.SalesRep.LastName}\\\\"
); );
texFile.AppendLine($"Telefon: &{quote.SalesRep.PhoneNumber}\\\\"); texFile.AppendLine($"Telefon: &{quote.SalesRep.PhoneNumber}\\\\");
texFile.AppendLine($"Mobil:&{quote.SalesRep.MobileNumber}\\\\"); texFile.AppendLine($"Mobil:&{quote.SalesRep.MobileNumber}\\\\");
texFile.AppendLine( texFile.AppendLine(
$"E-Mail:&\\href{{mailto:{quote.SalesRep.EMail}}}{{{quote.SalesRep.EMail}}}\\\\" $"E-Mail:&\\href{{mailto:{quote.SalesRep.EMail}}}{{{quote.SalesRep.EMail}}}\\\\"
); );
} }
texFile.AppendLine( texFile.AppendLine(
"\\textbf{Auftragsannahme:}&\\href{mailto:salesservices\\_germany@agilent.com}{salesservices\\_germany@agilent.com}\\\\\n\\hline\n\\end{tabular}\n}\\\\" "\\textbf{Auftragsannahme:}&\\href{mailto:salesservices\\_germany@agilent.com}{salesservices\\_germany@agilent.com}\\\\\n\\hline\n\\end{tabular}\n}\\\\"
); );
texFile.Append(CreateBriefkopf(quote.Recipient, true)); texFile.Append(CreateBriefkopf(quote.Recipient, true));
texFile.AppendLine("&\\\\\n&\\\\\n\\end{tabular}\n\\vspace{1cm}\\par "); texFile.AppendLine("&\\\\\n&\\\\\n\\end{tabular}\n\\vspace{1cm}\\par ");
//Anrede //Anrede
if (quote.Recipient.Gender == (byte)Gender.Male) if (quote.Recipient.Gender == (byte)Gender.Male)
{ {
texFile.AppendLine($"Sehr geehrter Herr {quote.Recipient.LastName},\\par "); texFile.AppendLine($"Sehr geehrter Herr {quote.Recipient.LastName},\\par ");
} }
else else
{ {
texFile.AppendLine($"Sehr geehrte Frau {quote.Recipient.LastName},\\par "); texFile.AppendLine($"Sehr geehrte Frau {quote.Recipient.LastName},\\par ");
} }
//Anschreiben //Anschreiben
texFile.AppendLine(CreateCoverletter(quote)); texFile.AppendLine(CreateCoverletter(quote));
//RB-Disclaimer //RB-Disclaimer
if (quote.QuoteContainsRb) if (quote.QuoteContainsRb)
texFile.AppendLine(CreateRbDisclaimer(quote)); texFile.AppendLine(CreateRbDisclaimer(quote));
//Tabelle //Tabelle
texFile.AppendLine("\\begin{center}"); texFile.AppendLine("\\begin{center}");
texFile.AppendLine("\\begin{longtable}"); texFile.AppendLine("\\begin{longtable}");
if (quote.ShowSinglePrices) if (quote.ShowSinglePrices)
{ {
if (!quote.ShowDiscounts) if (!quote.ShowDiscounts)
{ {
//mit Einzelpreisen //mit Einzelpreisen
texFile.AppendLine("{| cp{0.71\\textwidth} cr |} \\hline"); texFile.AppendLine("{| cp{0.71\\textwidth} cr |} \\hline");
texFile.AppendLine( texFile.AppendLine(
@"\textbf{\#} & \textbf{Produktbeschreibung} (Produktnummer) & \textbf{Menge} & \textbf{Preis}\\ \hline \endhead" @"\textbf{\#} & \textbf{Produktbeschreibung} (Produktnummer) & \textbf{Menge} & \textbf{Preis}\\ \hline \endhead"
); );
} }
else if (quote.ShowDiscounts) else if (quote.ShowDiscounts)
{ {
//mit Einzelpreisen und Discounts //mit Einzelpreisen und Discounts
texFile.AppendLine("{| cp{0.595\\textwidth} crr |} \\hline"); texFile.AppendLine("{| cp{0.595\\textwidth} crr |} \\hline");
texFile.AppendLine( texFile.AppendLine(
@"\textbf{\#} & \textbf{Produktbeschreibung} (Produktnummer) & \textbf{Menge} & \textbf{Discount} & \textbf{Preis}\\ \hline \endhead" @"\textbf{\#} & \textbf{Produktbeschreibung} (Produktnummer) & \textbf{Menge} & \textbf{Discount} & \textbf{Preis}\\ \hline \endhead"
); );
} }
} }
else else
{ {
//ohne Einzelpreise //ohne Einzelpreise
texFile.AppendLine("{| cp{0.83\\textwidth} c |} \\hline"); texFile.AppendLine("{| cp{0.83\\textwidth} c |} \\hline");
texFile.AppendLine( texFile.AppendLine(
@"\textbf{\#} & \textbf{Produktbeschreibung} (Produktnummer) & \textbf{Menge}\\ \hline \endhead" @"\textbf{\#} & \textbf{Produktbeschreibung} (Produktnummer) & \textbf{Menge}\\ \hline \endhead"
); );
} }
foreach (LineItem lI in quote.LineItems) foreach (LineItem lI in quote.LineItems)
{ {
string lineItemTex = string.Empty; string lineItemTex = string.Empty;
CustomDescription cD = GetCustomDescription(lI); CustomDescription cD = GetCustomDescription(lI);
switch (quote.ShowSinglePrices) switch (quote.ShowSinglePrices)
{ {
case true when !quote.ShowDiscounts: case true when !quote.ShowDiscounts:
//mit Einzelpreisen //mit Einzelpreisen
lineItemTex = lineItemTex =
lI.OptionNumber != "" lI.OptionNumber != ""
? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}&{lI.Amount}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\" ? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}&{lI.Amount}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\"
: $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}&{lI.Amount}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\"; : $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}&{lI.Amount}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\";
break; break;
case true: case true:
{ {
if (quote.ShowDiscounts) if (quote.ShowDiscounts)
//mit Einzelpreisen und Discounts //mit Einzelpreisen und Discounts
lineItemTex = lineItemTex =
lI.OptionNumber != "" lI.OptionNumber != ""
? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}\\newline Listenpreis: \\SI{{{lI.ListPrice}}}{{\\sieuro}}&{lI.Amount}&\\SI{{{lI.TotalDiscount}}}{{\\%}}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\" ? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}\\newline Listenpreis: \\SI{{{lI.ListPrice}}}{{\\sieuro}}&{lI.Amount}&\\SI{{{lI.TotalDiscount}}}{{\\%}}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\"
: $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}\\newline Listenpreis: \\SI{{{lI.ListPrice}}}{{\\sieuro}}&{lI.Amount}&\\SI{{{lI.TotalDiscount}}}{{\\%}}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\"; : $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}\\newline Listenpreis: \\SI{{{lI.ListPrice}}}{{\\sieuro}}&{lI.Amount}&\\SI{{{lI.TotalDiscount}}}{{\\%}}&\\SI{{{lI.Total}}}{{\\sieuro}}\\\\";
break; break;
} }
case false: case false:
//ohne Einzelpreise //ohne Einzelpreise
lineItemTex = lineItemTex =
lI.OptionNumber != "" lI.OptionNumber != ""
? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}&{lI.Amount}\\\\" ? $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber}\\#{lI.OptionNumber})\\newline {cD.DescriptionText}&{lI.Amount}\\\\"
: $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}&{lI.Amount}\\\\"; : $"{lI.Position} &\\textbf{{{cD.Heading}}} ({lI.ProductNumber})\\newline {cD.DescriptionText}&{lI.Amount}\\\\";
break; break;
} }
texFile.Append(lineItemTex + "\n"); texFile.Append(lineItemTex + "\n");
} }
texFile.AppendLine("\\hline\n" + "\\end{longtable}\n" + "\\end{center}\n"); texFile.AppendLine("\\hline\n" + "\\end{longtable}\n" + "\\end{center}\n");
texFile.AppendLine( texFile.AppendLine(
"\\vspace{-2cm}\n" + "\\begin{flushright}\n\n" + "\\begin{tabular}{|rr|}\n" + "\\hline" "\\vspace{-2cm}\n" + "\\begin{flushright}\n\n" + "\\begin{tabular}{|rr|}\n" + "\\hline"
); );
//Summe netto //Summe netto
texFile.AppendLine($"\\textbf{{Summe netto}} & \\SI{{{quote.TotalNet}}}{{\\sieuro}}\\\\"); texFile.AppendLine($"\\textbf{{Summe netto}} & \\SI{{{quote.TotalNet}}}{{\\sieuro}}\\\\");
//Frachtkosten //Frachtkosten
texFile.AppendLine( texFile.AppendLine(
$"\\textbf{{Versand und Bereitstellungskosten ({quote.Freight}\\%)}} & \\SI{{{quote.TotalFreightOnly}}}{{\\sieuro}}\\\\" $"\\textbf{{Versand und Bereitstellungskosten ({quote.Freight}\\%)}} & \\SI{{{quote.TotalFreightOnly}}}{{\\sieuro}}\\\\"
); );
//Gesamtsumme netto //Gesamtsumme netto
texFile.AppendLine( texFile.AppendLine(
$"\\textbf{{Gesamtsumme netto}} & \\SI{{{quote.TotalFreight}}}{{\\sieuro}}\\\\" $"\\textbf{{Gesamtsumme netto}} & \\SI{{{quote.TotalFreight}}}{{\\sieuro}}\\\\"
); );
//mit Mehrwertsteuer //mit Mehrwertsteuer
if (quote.ShowBrutto) if (quote.ShowBrutto)
{ {
texFile.AppendLine( texFile.AppendLine(
$"\\textbf{{Umsatzsteuer ({quote.Vat}\\%)}} & \\SI{{{quote.TotalVat}}}{{\\sieuro}}\\\\" $"\\textbf{{Umsatzsteuer ({quote.Vat}\\%)}} & \\SI{{{quote.TotalVat}}}{{\\sieuro}}\\\\"
); );
texFile.AppendLine( texFile.AppendLine(
$"\\textbf{{Gesamtsumme brutto}} & \\SI{{{quote.TotalGross}}}{{\\sieuro}}\\\\" $"\\textbf{{Gesamtsumme brutto}} & \\SI{{{quote.TotalGross}}}{{\\sieuro}}\\\\"
); );
} }
texFile.Append( texFile.Append(
"\\hline\n\\end{tabular}\n\n\\end{flushright}\n\nDer Betrag versteht sich zzgl. der gesetzlichen Steuern.\\\\\nDiese werden im Rechnungszeitraum auf der Rechnung gesondert ausgewiesen.\\\\\nZahlungsbedingungen: 30 Tage netto ab Rechnungsdatum.\\\\\nIncoterm (2010) für Lieferungen innerhalb Deutschlands: DDP.\n\\begin{small}\n\n" "\\hline\n\\end{tabular}\n\n\\end{flushright}\n\nDer Betrag versteht sich zzgl. der gesetzlichen Steuern.\\\\\nDiese werden im Rechnungszeitraum auf der Rechnung gesondert ausgewiesen.\\\\\nZahlungsbedingungen: 30 Tage netto ab Rechnungsdatum.\\\\\nIncoterm (2010) für Lieferungen innerhalb Deutschlands: DDP.\n\\begin{small}\n\n"
); );
texFile.AppendLine( texFile.AppendLine(
$"\\textbf{{Gewährleistung:}}\\\\\nDie Gewährleistung für Zubehör und Ersatzteilprodukte und für Analytik-Hardwareprodukte beträgt {quote.Warranty} Monate.\n" $"\\textbf{{Gewährleistung:}}\\\\\nDie Gewährleistung für Zubehör und Ersatzteilprodukte und für Analytik-Hardwareprodukte beträgt {quote.Warranty} Monate.\n"
); );
//3PP-Disclaimer //3PP-Disclaimer
if (quote.QuoteContains3Pp) if (quote.QuoteContains3Pp)
texFile.AppendLine(Create3PpDisclaimer(quote)); texFile.AppendLine(Create3PpDisclaimer(quote));
texFile.AppendLine( texFile.AppendLine(
"\\textbf{Hinweis:}\\\\ \n" "\\textbf{Hinweis:}\\\\ \n"
+ "Fü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.\n" + "Fü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.\n"
+ "\\end{small}\n \n" + "\\end{small}\n \n"
+ "\\begin{scriptsize}\n" + "\\begin{scriptsize}\n"
+ "Agilent Technologies Deutschland GmbH, Hewlett-Packard-Str. 8, D-76337 Waldbronn\\\\\nTelefon +49 (0)7243-602-0\\\\\nUSt.-IdNr.: DE812729296, WEEE-Reg.-Nr. DE 86631749\\\\\nSitz der Gesellschaft: Waldbronn Amtsgericht Mannheim, HRB 723782\\\\\nGeschäftsführer: Dr. Andreas Kistner (Vorsitzender der Geschäftsführung), Armin Jehle, Norbert Sabatzki, Dr. Knut Wintergerst\\\\\n" + "Agilent Technologies Deutschland GmbH, Hewlett-Packard-Str. 8, D-76337 Waldbronn\\\\\nTelefon +49 (0)7243-602-0\\\\\nUSt.-IdNr.: DE812729296, WEEE-Reg.-Nr. DE 86631749\\\\\nSitz der Gesellschaft: Waldbronn Amtsgericht Mannheim, HRB 723782\\\\\nGeschäftsführer: Dr. Andreas Kistner (Vorsitzender der Geschäftsführung), Armin Jehle, Norbert Sabatzki, Dr. Knut Wintergerst\\\\\n"
+ "\\href{www.agilent.com}{www.agilent.com}\n\\end{scriptsize}\n\\end{document}" + "\\href{www.agilent.com}{www.agilent.com}\n\\end{scriptsize}\n\\end{document}"
); );
return texFile; return texFile;
} }
private static string CreateRbDisclaimer(Quote quote) private static string CreateRbDisclaimer(Quote quote)
{ {
if (quote.LineItems == null) if (quote.LineItems == null)
return Empty; return Empty;
string rbDisclaimer = string rbDisclaimer =
"\\textbf{Wichtiger Hinweis zur Bestellung von überholten Geräten}\\\\\n"; "\\textbf{Wichtiger Hinweis zur Bestellung von überholten Geräten}\\\\\n";
rbDisclaimer += rbDisclaimer +=
"Bitte beachten Sie, dass in der Regel nur wenige gebrauchte Geräte auf Lager sind und diese ohne die Möglichkeit einer Reservierung auf „first come, first serve“-Basis verkauft werden. Um lange Lieferzeiten zu vermeiden, sollte daher bei konkretem Interesse zunächst der Lagerstand überprüft werden. Die aktuellen Lagerbestände sind:\n"; "Bitte beachten Sie, dass in der Regel nur wenige gebrauchte Geräte auf Lager sind und diese ohne die Möglichkeit einer Reservierung auf „first come, first serve“-Basis verkauft werden. Um lange Lieferzeiten zu vermeiden, sollte daher bei konkretem Interesse zunächst der Lagerstand überprüft werden. Die aktuellen Lagerbestände sind:\n";
// List<LineItem> lineItemsWithRb = quote.LineItems.Where(lI => lI.ProductLine == "RB").ToList(); // List<LineItem> lineItemsWithRb = quote.LineItems.Where(lI => lI.ProductLine == "RB").ToList();
// rbDisclaimer += "\\begin{center}\n\\begin{tabular}{clc}\n"; // rbDisclaimer += "\\begin{center}\n\\begin{tabular}{clc}\n";
// rbDisclaimer += "\\textbf{Modul} & \\textbf{Beschreibung} &\\textbf{Bestand}\\\\ \\hline \n"; // rbDisclaimer += "\\textbf{Modul} & \\textbf{Beschreibung} &\\textbf{Bestand}\\\\ \\hline \n";
// foreach (LineItem lineItemWithRb in lineItemsWithRb) // foreach (LineItem lineItemWithRb in lineItemsWithRb)
// { // {
// CustomDescription customDescription = GetCoverletterRow(lineItemWithRb); // CustomDescription customDescription = GetCoverletterRow(lineItemWithRb);
// const int rbcount = 4; //TODO Get count of RB? // const int rbcount = 4; //TODO Get count of RB?
// rbDisclaimer += $"{lineItemWithRb.ProductNumber} & {customDescription.Heading} & {rbcount}\\\\ \n"; // rbDisclaimer += $"{lineItemWithRb.ProductNumber} & {customDescription.Heading} & {rbcount}\\\\ \n";
// } // }
// rbDisclaimer += "\\end{tabular}\n\\end{center}\n"; // rbDisclaimer += "\\end{tabular}\n\\end{center}\n";
return rbDisclaimer; return rbDisclaimer;
} }
private static string Create3PpDisclaimer(Quote quote) private static string Create3PpDisclaimer(Quote quote)
{ {
if (quote.LineItems == null) if (quote.LineItems == null)
return Empty; return Empty;
string dreipp = string dreipp =
"\\textbf{Hinweis zu Non-Agilent-Produkten}\\\\ \n" "\\textbf{Hinweis zu Non-Agilent-Produkten}\\\\ \n"
+ "Bitte beachten Sie, dass das/die o.g. Produkt/e "; + "Bitte beachten Sie, dass das/die o.g. Produkt/e ";
//List all 3PP product numbers //List all 3PP product numbers
List<LineItem> lineItemsWith3Pp = quote.LineItems List<LineItem> lineItemsWith3Pp = quote.LineItems
.Where(lI => lI.ProductLine == "3PP") .Where(lI => lI.ProductLine == "3PP")
.ToList(); .ToList();
for (int i = 0; i < lineItemsWith3Pp.Count; i++) for (int i = 0; i < lineItemsWith3Pp.Count; i++)
if (i < lineItemsWith3Pp.Count - 1) if (i < lineItemsWith3Pp.Count - 1)
{ {
dreipp += $"{lineItemsWith3Pp[i].ProductNumber}, "; dreipp += $"{lineItemsWith3Pp[i].ProductNumber}, ";
} }
else else
{ {
dreipp += $"{lineItemsWith3Pp[i].ProductNumber}"; dreipp += $"{lineItemsWith3Pp[i].ProductNumber}";
} }
//Get all 3PP Supplier //Get all 3PP Supplier
//List<Supllier> supllier3PP = lineItemWith3PP.ProductLine.Supplier; //List<Supllier> supllier3PP = lineItemWith3PP.ProductLine.Supplier;
dreipp += dreipp +=
" nicht von Agilent Technologies hergestellt wird/werden. Agilent Technologies lehnt daher jede Art der Haftung für Leistung, Qualität, Zuverlässigkeitund Lieferung für dieses/r Produkt/e ab.\\\\\n" " nicht von Agilent Technologies hergestellt wird/werden. Agilent Technologies lehnt daher jede Art der Haftung für Leistung, Qualität, Zuverlässigkeitund Lieferung für dieses/r Produkt/e ab.\\\\\n"
+ "Die Standardgewährleistung, einschließlich Schadensersatz für die Rechtsverletzung von intellektuellem Eigentum, liegt beim Hersteller bzw. Lieferanten des/r Produkt/e, solange nichts anders im Angebot von Agilent Technologies spezifiziert wird.\n"; + "Die Standardgewährleistung, einschließlich Schadensersatz für die Rechtsverletzung von intellektuellem Eigentum, liegt beim Hersteller bzw. Lieferanten des/r Produkt/e, solange nichts anders im Angebot von Agilent Technologies spezifiziert wird.\n";
//dreipp += "\\textbf{Hersteller:}"; //dreipp += "\\textbf{Hersteller:}";
//supllier3PP //supllier3PP
return dreipp; return dreipp;
} }
private static string GetCoverletterRow(LineItem lineItem) private static string GetCoverletterRow(LineItem lineItem)
{ {
CustomDescription customDescription = GetCustomDescription(lineItem); CustomDescription customDescription = GetCustomDescription(lineItem);
if (customDescription.CoverletterText == "") if (customDescription.CoverletterText == "")
{ {
return customDescription == null return customDescription == null
? Empty ? Empty
: $"\\item {customDescription.Heading} (\\#{lineItem.Position})\n"; : $"\\item {customDescription.Heading} (\\#{lineItem.Position})\n";
} }
else else
{ {
return customDescription == null return customDescription == null
? Empty ? Empty
: $"\\item {customDescription.CoverletterText} (\\#{lineItem.Position})\n"; : $"\\item {customDescription.CoverletterText} (\\#{lineItem.Position})\n";
} }
} }
private static string CreateCoverletter(Quote quote) private static string CreateCoverletter(Quote quote)
{ {
bool subitem = false; bool subitem = false;
string coverLetter = string coverLetter =
$"nachfolgend erhalten Sie Ihr gewünschtes Angebot über ein(e) {quote.Description}.\\\\\n" $"nachfolgend erhalten Sie Ihr gewünschtes Angebot über ein(e) {quote.Description}.\\\\\n"
+ "Es umfasst im Einzelnen:\n" + "Es umfasst im Einzelnen:\n"
+ "\\begin{itemize}\n"; + "\\begin{itemize}\n";
if (quote.LineItems == null) if (quote.LineItems == null)
return Empty; return Empty;
foreach (LineItem lineItem in quote.LineItems) foreach (LineItem lineItem in quote.LineItems)
{ {
if (lineItem.OptionNumber == "") if (lineItem.OptionNumber == "")
{ {
//Hauptitem //Hauptitem
if (subitem) if (subitem)
{ {
//vorheriges Subitem schließen //vorheriges Subitem schließen
coverLetter += "\\end{itemize}\n"; coverLetter += "\\end{itemize}\n";
subitem = false; subitem = false;
} }
} }
else else
{ {
if (!subitem) if (!subitem)
{ {
//neues Subitem //neues Subitem
subitem = true; subitem = true;
coverLetter += "\\begin{itemize}\n"; coverLetter += "\\begin{itemize}\n";
} }
} }
coverLetter += GetCoverletterRow(lineItem); coverLetter += GetCoverletterRow(lineItem);
} }
if (subitem) if (subitem)
//wenn das letzte Item ein Subitem war //wenn das letzte Item ein Subitem war
coverLetter += "\\end{itemize}\n"; coverLetter += "\\end{itemize}\n";
coverLetter += coverLetter +=
"\\end{itemize}\n" "\\end{itemize}\n"
+ "Für Rückfragen und Änderungswünsche stehe ich Ihnen gerne zur Verfügung.\\par\n" + "Für Rückfragen und Änderungswünsche stehe ich Ihnen gerne zur Verfügung.\\par\n"
+ "Mit freundlichen Grüßen\\\\\n" + "Mit freundlichen Grüßen\\\\\n"
+ "\\includegraphics[width = 5cm]{signWoitschetzki.png}\n" + "\\includegraphics[width = 5cm]{signWoitschetzki.png}\n"
+ "\\vspace{1cm} \\\\ \n"; + "\\vspace{1cm} \\\\ \n";
return coverLetter; return coverLetter;
} }
private static string Replace(string text) private static string Replace(string text)
{ {
if (text == "") if (text == "")
return text; return text;
//text = text.Contains(" & ") ? text.Replace(" & ", " \\& ") : text; //text = text.Contains(" & ") ? text.Replace(" & ", " \\& ") : text;
text = text.Contains("<Shift-Enter>") ? text.Replace("<Shift-Enter>", "\\newline ") : text; text = text.Contains("<Shift-Enter>") ? text.Replace("<Shift-Enter>", "\\newline ") : text;
return text; return text;
} }
private static CustomDescription GetCustomDescription(LineItem lineItem) private static CustomDescription GetCustomDescription(LineItem lineItem)
{ {
CustomDescription? customDescription = genericController.Get<CustomDescription>( CustomDescription? customDescription = genericController.Get<CustomDescription>(
cD => cD =>
cD.ProductNumber.Equals(lineItem.ProductNumber) cD.ProductNumber.Equals(lineItem.ProductNumber)
&& cD.OptionNumber.Equals(lineItem.OptionNumber) && cD.OptionNumber.Equals(lineItem.OptionNumber)
); );
if (customDescription == null) if (customDescription == null)
{ {
Console.WriteLine( Console.WriteLine(
$"Keine CustomDescription für {lineItem.ProductNumber}#{lineItem.OptionNumber} verfügbar! Verwende SarShortDescription..." $"Keine CustomDescription für {lineItem.ProductNumber}#{lineItem.OptionNumber} verfügbar! Verwende SarShortDescription..."
); );
//TODO generate new CustomDescription //TODO generate new CustomDescription
customDescription = new() customDescription = new()
{ {
Heading = lineItem.SapShortDescription, Heading = lineItem.SapShortDescription,
CoverletterText = lineItem.SapShortDescription, CoverletterText = lineItem.SapShortDescription,
DescriptionText = lineItem.SapLongDescription DescriptionText = lineItem.SapLongDescription
}; };
} }
return customDescription; return customDescription;
} }
} }

@ -0,0 +1,161 @@
\documentclass[a4paper,ngerman,parskip,10pt]{scrlttr2}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage[hidelinks]{hyperref}
\usepackage[left=2cm, right=2cm, top=2cm, bottom=2cm]{geometry}
\usepackage[table]{xcolor}
\usepackage[right]{{eurosym}}
\usepackage[locale=DE]{{siunitx}}
\usepackage{{scrlayer-scrpage}}
\usepackage{{lastpage}}
\usepackage{{graphicx}}
\usepackage{{multirow}}
\usepackage{{longtable}}
\usepackage{{enumitem}}
\usepackage{{fp, xstring, spreadtab, numprint}}
\DeclareSIUnit{{\sieuro}}{{\mbox{{\euro}}}}
\rohead{DE-83PE89-223-220}
\cfoot{Seite \thepage/\pageref{LastPage}}
\sisetup{round-integer-to-decimal,round-precision=2,round-mode=places}
\newcommand{\produkttitel}[1]{\textsc{#1}}
\renewcommand{\arraystretch}{1.2}
\definecolor{AgilentBlau}{HTML}{0085d5}
\setlist{noitemsep}
\begin{document}
\begin{tabular}{p{0.4\hsize}p{0.5\hsize}}
\multirow{4}{*}{\includegraphics[width=0.9\hsize]{agilentLogo.png}}
&\normalsize{Agilent Technologies Deutschland GmbH}\\
&\normalsize{Life Sciences \& Chemical Analysis}\\
&\normalsize{Hewlett-Packard-Str. 8}\\
&\normalsize{D-76337 Waldbronn}
\end{tabular}
\par
\begin{flushright}
\colorbox{AgilentBlau}{\textcolor{white}{\textsc{\Huge{Angebot}}}}
\end{flushright}
\begin{tabular}{p{0.4\hsize}p{0.6\hsize}}
&
\multirow{4}{*}{
\begin{tabular}{|ll|}
\hline
\textbf{Angebotsnummer:}&DE-83PE89-223-220\\
Angebotdatum:&\today\\
Angebotsgültigkeit:&60 Tage\\\textbf{Ansprechpartner:}&Sascha Woitschetzki\\
Telefon: &+49 208 74129134\\
Mobil:&+49 176 22285334\\
E-Mail:&\href{mailto:sascha.woitschetzki@non.agilent.com}{sascha.woitschetzki@non.agilent.com}\\
\textbf{Auftragsannahme:}&\href{mailto:salesservices\_germany@agilent.com}{salesservices\_germany@agilent.com}\\
\hline
\end{tabular}
}\\
Herr Thomas Bürgel
\\
Grünenthal GmbH
\\
Zieglerstr. 6
\\
52078 Aachen
\\
&\\
&\\
\end{tabular}
\vspace{1cm}\par
Sehr geehrter Herr Bürgel,\par
nachfolgend erhalten Sie Ihr gewünschtes Angebot über ein(e) HPLC.\\
Es umfasst im Einzelnen:
\begin{itemize}
\item Binäre Pumpe (\#1)
\begin{itemize}
\item Werkzeugsatz (\#2)
\item Kit für maximal Betriebszeit (\#3)
\item Aktive Kolbenhinterspülung (\#4)
\item Säule (\#5)
\end{itemize}
\item Vialsampler (\#6)
\begin{itemize}
\item Classic Probenträger-Kit (\#7)
\item Ohne Gerätetreiber (\#8)
\item Probenthermostat (4 40 °C) (\#9)
\end{itemize}
\item Säulenthermostat (\#10)
\item UV/VIS-Detektor (\#11)
\begin{itemize}
\item Standardflusszelle (\#12)
\end{itemize}
\item Diodenarraydetektor High Sensitivity (\#13)
\item 1260 Infinity II HPLC-System (\#14)
\begin{itemize}
\item Einführung (\#15)
\item Installation and Operational Qualification (\#16)
\end{itemize}
\end{itemize}
Für Rückfragen und Änderungswünsche stehe ich Ihnen gerne zur Verfügung.\par
Mit freundlichen Grüßen\\
\includegraphics[width = 5cm]{signWoitschetzki.png}
\vspace{1cm} \\
\begin{center}
\begin{longtable}
{| cp{0.595\textwidth} crr |} \hline
\textbf{\#} & \textbf{Produktbeschreibung} (Produktnummer) & \textbf{Menge} & \textbf{Discount} & \textbf{Preis}\\ \hline \endhead
1 &\textbf{Binäre Pumpe} (G7112B)\newline 1260 Infinity II Binäre Pumpe, Maximaldruck: 600 bar. \newline Mit integriertem 2-Kanal-Entgaser, vergünstigter Säule, Verbindungskapillaren, Lösemittelwanne, Lösemittelflaschen und CAN-Kabel.\newline Listenpreis: \SI{30307}{\sieuro}&1&\SI{30}{\%}&\SI{21214.9}{\sieuro}\\
2 &\textbf{Werkzeugsatz} (G7112B\#001)\newline Werkzeugsatz für Agilent 1260/1290 Infinity II LC-Systeme.\newline Listenpreis: \SI{390}{\sieuro}&1&\SI{30}{\%}&\SI{273}{\sieuro}\\
3 &\textbf{Kit für maximal Betriebszeit} (G7112B\#007)\newline Für Agilent 1260 Infinity II HPLC. Enthält u. a. Edelstahl-Kapillaren, PEEK-Schläuche, PEEK-Fittinge, Schneidewerkzeug, PTFE-Fritten, Lösemittelansaugfilter.\newline Listenpreis: \SI{1783}{\sieuro}&1&\SI{30}{\%}&\SI{1248.1}{\sieuro}\\
4 &\textbf{Aktive Kolbenhinterspülung} (G7112B\#030)\newline Automatische Reinigung und Pflege der Pumpenköpfe, -dichtungen und -ventile für maximale Lebensdauer. Besonders empfohlen bei salzhaltigen Analyten oder Puffern.\newline Listenpreis: \SI{1982}{\sieuro}&1&\SI{30}{\%}&\SI{1387.4}{\sieuro}\\
5 &\textbf{Säule} (G7112B\#094)\newline InfinityLab Poroshell 120 EC-C18 3.0 x 150 mm, 2.7 µm.\newline Listenpreis: \SI{1}{\sieuro}&1&\SI{30}{\%}&\SI{0.7}{\sieuro}\\
6 &\textbf{Vialsampler} (G7129A)\newline 1260 Infinity II automatischer Flüssigprobengeber zur Verwendung bei bis zu 600 bar. Mit integriertem Nadelspülanschluss zur Minimierung der Verschleppung, 100 µl Dosiereinheit und 100 µl Probenschleife. Inklusive Gerätetreiber für ein LC-System (2D-UV).\newline Listenpreis: \SI{19905}{\sieuro}&1&\SI{30}{\%}&\SI{13933.5}{\sieuro}\\
7 &\textbf{Classic Probenträger-Kit} (G7129A\#012)\newline 2 Probenträger mit je 5x 10 Probenplätzen für 2,0 ml Vials.\newline Listenpreis: \SI{525}{\sieuro}&1&\SI{30}{\%}&\SI{367.5}{\sieuro}\\
8 &\textbf{Ohne Gerätetreiber} (G7129A\#060)\newline Es wird ein vorhandener Gerätetreiber verwendet oder mit der Software angeboten.\newline Listenpreis: \SI{-1793}{\sieuro}&1&\SI{30}{\%}&\SI{-1255.1}{\sieuro}\\
9 &\textbf{Probenthermostat} (G7129A\#101)\newline Agilent InfinityLab Thermostat zur Probentemperierung zwischen 4 °C und 40 °C.\newline Listenpreis: \SI{6077}{\sieuro}&1&\SI{30}{\%}&\SI{4253.9}{\sieuro}\\
10 &\textbf{Säulenthermostat} (G7116A)\newline 1260 Infinity II Thermostat für bis zu vier 30 cm Säulen, Temperaturbereich: 10° unter Raumtemperatur (min. 4 °C) bis max. 85 °C, inkl. Säulenidentifikations-Kit. Ventilantrieb optional.\newline Listenpreis: \SI{6494}{\sieuro}&1&\SI{30}{\%}&\SI{4545.8}{\sieuro}\\
11 &\textbf{UV/VIS-Detektor} (G7114A)\newline 1260 Infinity II variabler Wellenlängendetektor (190 600 nm). Für schnelle programmierbare Einzel- (bis zu 120 Hz) und Doppelwellenlängen-Detektion. RFID-Tags für Durchflusszellen und UV-Lampe.\newline Listenpreis: \SI{9307}{\sieuro}&1&\SI{30}{\%}&\SI{6514.9}{\sieuro}\\
12 &\textbf{Standardflusszelle} (G7114A\#018)\newline Standarddurchflusszelle VWD aus Edelstahl mit RFID-Tag zur Identifizierung, 10 mm, 14 µl.\newline Listenpreis: \SI{1612}{\sieuro}&1&\SI{30}{\%}&\SI{1128.4}{\sieuro}\\
13 &\textbf{Diodenarraydetektor HS} (G7117C)\newline 1260 Infinity II Diodenarray-Detektor high sensitivity für höchste Empfindlichkeit, 120 Hz Datenrate für schnelle Multiwellenlängen- und Spektralanalysen. Messbereich 190 640 nm, RFID-Tags für Zelle und Lampe. Inklusive Standard-Max-Light-Flusszelle (10 mm, V = 1 µl, max. 70 bar).\newline Listenpreis: \SI{24906}{\sieuro}&1&\SI{30}{\%}&\SI{17434.2}{\sieuro}\\
14 &\textbf{1260 Infinity II HPLC-System} (SYS-LC-1260II)\newline \newline Listenpreis: \SI{0}{\sieuro}&1&\SI{20}{\%}&\SI{0}{\sieuro}\\
15 &\textbf{Einführung} (SYS-LC-1260II\#2A9)\newline Standardeinweisung für neue Anwender im Rahmen der Installation.\newline Listenpreis: \SI{1034}{\sieuro}&1&\SI{20}{\%}&\SI{827.2}{\sieuro}\\
16 &\textbf{Installation and Operational Qualification} (SYS-LC-1260II\#6H9)\newline Gerätequalifizierung (IQ/OQ) im Rahmen der Installation.\newline Listenpreis: \SI{4561}{\sieuro}&1&\SI{20}{\%}&\SI{3648.8}{\sieuro}\\
\hline
\end{longtable}
\end{center}
\vspace{-2cm}
\begin{flushright}
\begin{tabular}{|rr|}
\hline
\textbf{Summe netto} & \SI{75523.2}{\sieuro}\\
\textbf{Versand und Bereitstellungskosten (3\%)} & \SI{2265.696}{\sieuro}\\
\textbf{Gesamtsumme netto} & \SI{77788.896}{\sieuro}\\
\hline
\end{tabular}
\end{flushright}
Der Betrag versteht sich zzgl. der gesetzlichen Steuern.\\
Diese werden im Rechnungszeitraum auf der Rechnung gesondert ausgewiesen.\\
Zahlungsbedingungen: 30 Tage netto ab Rechnungsdatum.\\
Incoterm (2010) für Lieferungen innerhalb Deutschlands: DDP.
\begin{small}
\textbf{Gewährleistung:}\\
Die Gewährleistung für Zubehör und Ersatzteilprodukte und für Analytik-Hardwareprodukte beträgt 12 Monate.
\textbf{Hinweis:}\\
Fü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.
\end{small}
\begin{scriptsize}
Agilent Technologies Deutschland GmbH, Hewlett-Packard-Str. 8, D-76337 Waldbronn\\
Telefon +49 (0)7243-602-0\\
USt.-IdNr.: DE812729296, WEEE-Reg.-Nr. DE 86631749\\
Sitz der Gesellschaft: Waldbronn Amtsgericht Mannheim, HRB 723782\\
Geschäftsführer: Dr. Andreas Kistner (Vorsitzender der Geschäftsführung), Armin Jehle, Norbert Sabatzki, Dr. Knut Wintergerst\\
\href{www.agilent.com}{www.agilent.com}
\end{scriptsize}
\end{document}

@ -0,0 +1,17 @@
# Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
1 G7112B 29 1260 Infinity II Binaere Pumpe 1 30307 0 0 30 21214.9 21214.9 30 0 0 0 ISL100P1 Pumps
2 G7112B 001 29 HPLC Sys.-Tool-K. Agil. 1260 Infinity II 1 390 0 0 30 273 273 30 0 0 0
3 G7112B 007 29 Kit fuer Maximale Betriebszeit 1 1783 0 0 30 1248.1 1248.1 30 0 0 0
4 G7112B 030 29 Aktive Kolbenhinterspuelung 1 1982 0 0 30 1387.4 1387.4 30 0 0 0
5 G7112B 094 29 Poroshell 120 EC-C18 3,0 x 150mm, 2,7 um 1 1 0 0 30 0.7 0.7 30 0 0 0
6 G7129A 29 1260 Inf. II Fluessigprobengeber 1 19905 0 0 30 13933.5 13933.5 30 0 0 0 ISL100A1 Autosamplers
7 G7129A 012 29 Klass. Schubladenkit (10 x 10 Pr.-Fl.) 1 525 0 0 30 367.5 367.5 30 0 0 0
8 G7129A 060 29 Nutzung vorhandene Lizenz 1 -1793 0 0 30 -1255.1 -1255.1 30 0 0 0
9 G7129A 101 29 Agilent InfinityLab Proben-Thermostat 1 6077 0 0 30 4253.9 4253.9 30 0 0 0
10 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6494 0 0 30 4545.8 4545.8 30 0 0 0 ISL100LC1 LC Hardware
11 G7114A 29 1260 Infinity II VW-Detektor 1 9307 0 0 30 6514.9 6514.9 30 0 0 0 ISL100D1 Detectors
12 G7114A 018 29 Standarddurchflusszelle VWD 1 1612 0 0 30 1128.4 1128.4 30 0 0 0
13 G7117C 29 1260 Infinity II Diodenarray-Detektor HS 1 24906 0 0 30 17434.2 17434.2 30 0 0 0 ISL100D1 Detectors
14 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
15 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 1034 0 0 20 827.2 827.2 20 0 0 0 TSSTRN Training Services
16 SYS-LC-1260II 6H9 74 Analysegeraet-Qualifizierung-auf Wunsch 1 4561 0 0 20 3648.8 3648.8 20 0 0 0 TSSYS1 Serviced As Systems - 1 YR
1 # Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
2 1 G7112B 29 1260 Infinity II Binaere Pumpe 1 30307 0 0 30 21214.9 21214.9 30 0 0 0 ISL100P1 Pumps
3 2 G7112B 001 29 HPLC Sys.-Tool-K. Agil. 1260 Infinity II 1 390 0 0 30 273 273 30 0 0 0
4 3 G7112B 007 29 Kit fuer Maximale Betriebszeit 1 1783 0 0 30 1248.1 1248.1 30 0 0 0
5 4 G7112B 030 29 Aktive Kolbenhinterspuelung 1 1982 0 0 30 1387.4 1387.4 30 0 0 0
6 5 G7112B 094 29 Poroshell 120 EC-C18 3,0 x 150mm, 2,7 um 1 1 0 0 30 0.7 0.7 30 0 0 0
7 6 G7129A 29 1260 Inf. II Fluessigprobengeber 1 19905 0 0 30 13933.5 13933.5 30 0 0 0 ISL100A1 Autosamplers
8 7 G7129A 012 29 Klass. Schubladenkit (10 x 10 Pr.-Fl.) 1 525 0 0 30 367.5 367.5 30 0 0 0
9 8 G7129A 060 29 Nutzung vorhandene Lizenz 1 -1793 0 0 30 -1255.1 -1255.1 30 0 0 0
10 9 G7129A 101 29 Agilent InfinityLab Proben-Thermostat 1 6077 0 0 30 4253.9 4253.9 30 0 0 0
11 10 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6494 0 0 30 4545.8 4545.8 30 0 0 0 ISL100LC1 LC Hardware
12 11 G7114A 29 1260 Infinity II VW-Detektor 1 9307 0 0 30 6514.9 6514.9 30 0 0 0 ISL100D1 Detectors
13 12 G7114A 018 29 Standarddurchflusszelle VWD 1 1612 0 0 30 1128.4 1128.4 30 0 0 0
14 13 G7117C 29 1260 Infinity II Diodenarray-Detektor HS 1 24906 0 0 30 17434.2 17434.2 30 0 0 0 ISL100D1 Detectors
15 14 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
16 15 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 1034 0 0 20 827.2 827.2 20 0 0 0 TSSTRN Training Services
17 16 SYS-LC-1260II 6H9 74 Analysegeraet-Qualifizierung-auf Wunsch 1 4561 0 0 20 3648.8 3648.8 20 0 0 0 TSSYS1 Serviced As Systems - 1 YR

@ -0,0 +1,155 @@
\documentclass[a4paper,ngerman,parskip,10pt]{scrlttr2}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage[hidelinks]{hyperref}
\usepackage[left=2cm, right=2cm, top=2cm, bottom=2cm]{geometry}
\usepackage[table]{xcolor}
\usepackage[right]{{eurosym}}
\usepackage[locale=DE]{{siunitx}}
\usepackage{{scrlayer-scrpage}}
\usepackage{{lastpage}}
\usepackage{{graphicx}}
\usepackage{{multirow}}
\usepackage{{longtable}}
\usepackage{{enumitem}}
\usepackage{{fp, xstring, spreadtab, numprint}}
\DeclareSIUnit{{\sieuro}}{{\mbox{{\euro}}}}
\rohead{DE-83PE89-223-221}
\cfoot{Seite \thepage/\pageref{LastPage}}
\sisetup{round-integer-to-decimal,round-precision=2,round-mode=places}
\newcommand{\produkttitel}[1]{\textsc{#1}}
\renewcommand{\arraystretch}{1.2}
\definecolor{AgilentBlau}{HTML}{0085d5}
\setlist{noitemsep}
\begin{document}
\begin{tabular}{p{0.4\hsize}p{0.5\hsize}}
\multirow{4}{*}{\includegraphics[width=0.9\hsize]{agilentLogo.png}}
&\normalsize{Agilent Technologies Deutschland GmbH}\\
&\normalsize{Life Sciences \& Chemical Analysis}\\
&\normalsize{Hewlett-Packard-Str. 8}\\
&\normalsize{D-76337 Waldbronn}
\end{tabular}
\par
\begin{flushright}
\colorbox{AgilentBlau}{\textcolor{white}{\textsc{\Huge{Angebot}}}}
\end{flushright}
\begin{tabular}{p{0.4\hsize}p{0.6\hsize}}
&
\multirow{4}{*}{
\begin{tabular}{|ll|}
\hline
\textbf{Angebotsnummer:}&DE-83PE89-223-221\\
Angebotdatum:&\today\\
Angebotsgültigkeit:&60 Tage\\\textbf{Ansprechpartner:}&Sascha Woitschetzki\\
Telefon: &+49 208 74129134\\
Mobil:&+49 176 22285334\\
E-Mail:&\href{mailto:sascha.woitschetzki@non.agilent.com}{sascha.woitschetzki@non.agilent.com}\\
\textbf{Auftragsannahme:}&\href{mailto:salesservices\_germany@agilent.com}{salesservices\_germany@agilent.com}\\
\hline
\end{tabular}
}\\
Herr Thomas Bürgel
\\
Grünenthal GmbH
\\
Zieglerstr. 6
\\
52078 Aachen
\\
&\\
&\\
\end{tabular}
\vspace{1cm}\par
Sehr geehrter Herr Bürgel,\par
nachfolgend erhalten Sie Ihr gewünschtes Angebot über ein(e) HPLC mit DAD.\\
Es umfasst im Einzelnen:
\begin{itemize}
\item Binäre Pumpe (\#1)
\begin{itemize}
\item Werkzeugsatz (\#2)
\item Kit für maximal Betriebszeit (\#3)
\item Aktive Kolbenhinterspülung (\#4)
\item Säule (\#5)
\end{itemize}
\item Vialsampler (\#6)
\begin{itemize}
\item Classic Probenträger-Kit (\#7)
\item Ohne Gerätetreiber (\#8)
\item Probenthermostat (4 40 °C) (\#9)
\end{itemize}
\item Säulenthermostat (\#10)
\item Diodenarraydetektor High Sensitivity (\#11)
\item 1260 Infinity II HPLC-System (\#12)
\begin{itemize}
\item Einführung (\#13)
\item Installation and Operational Qualification (\#14)
\end{itemize}
\end{itemize}
Für Rückfragen und Änderungswünsche stehe ich Ihnen gerne zur Verfügung.\par
Mit freundlichen Grüßen\\
\includegraphics[width = 5cm]{signWoitschetzki.png}
\vspace{1cm} \\
\begin{center}
\begin{longtable}
{| cp{0.595\textwidth} crr |} \hline
\textbf{\#} & \textbf{Produktbeschreibung} (Produktnummer) & \textbf{Menge} & \textbf{Discount} & \textbf{Preis}\\ \hline \endhead
1 &\textbf{Binäre Pumpe} (G7112B)\newline 1260 Infinity II Binäre Pumpe, Maximaldruck: 600 bar. \newline Mit integriertem 2-Kanal-Entgaser, vergünstigter Säule, Verbindungskapillaren, Lösemittelwanne, Lösemittelflaschen und CAN-Kabel.\newline Listenpreis: \SI{30307}{\sieuro}&1&\SI{30}{\%}&\SI{21214.9}{\sieuro}\\
2 &\textbf{Werkzeugsatz} (G7112B\#001)\newline Werkzeugsatz für Agilent 1260/1290 Infinity II LC-Systeme.\newline Listenpreis: \SI{390}{\sieuro}&1&\SI{30}{\%}&\SI{273}{\sieuro}\\
3 &\textbf{Kit für maximal Betriebszeit} (G7112B\#007)\newline Für Agilent 1260 Infinity II HPLC. Enthält u. a. Edelstahl-Kapillaren, PEEK-Schläuche, PEEK-Fittinge, Schneidewerkzeug, PTFE-Fritten, Lösemittelansaugfilter.\newline Listenpreis: \SI{1783}{\sieuro}&1&\SI{30}{\%}&\SI{1248.1}{\sieuro}\\
4 &\textbf{Aktive Kolbenhinterspülung} (G7112B\#030)\newline Automatische Reinigung und Pflege der Pumpenköpfe, -dichtungen und -ventile für maximale Lebensdauer. Besonders empfohlen bei salzhaltigen Analyten oder Puffern.\newline Listenpreis: \SI{1982}{\sieuro}&1&\SI{30}{\%}&\SI{1387.4}{\sieuro}\\
5 &\textbf{Säule} (G7112B\#094)\newline InfinityLab Poroshell 120 EC-C18 3.0 x 150 mm, 2.7 µm.\newline Listenpreis: \SI{1}{\sieuro}&1&\SI{30}{\%}&\SI{0.7}{\sieuro}\\
6 &\textbf{Vialsampler} (G7129A)\newline 1260 Infinity II automatischer Flüssigprobengeber zur Verwendung bei bis zu 600 bar. Mit integriertem Nadelspülanschluss zur Minimierung der Verschleppung, 100 µl Dosiereinheit und 100 µl Probenschleife. Inklusive Gerätetreiber für ein LC-System (2D-UV).\newline Listenpreis: \SI{19905}{\sieuro}&1&\SI{30}{\%}&\SI{13933.5}{\sieuro}\\
7 &\textbf{Classic Probenträger-Kit} (G7129A\#012)\newline 2 Probenträger mit je 5x 10 Probenplätzen für 2,0 ml Vials.\newline Listenpreis: \SI{525}{\sieuro}&1&\SI{30}{\%}&\SI{367.5}{\sieuro}\\
8 &\textbf{Ohne Gerätetreiber} (G7129A\#060)\newline Es wird ein vorhandener Gerätetreiber verwendet oder mit der Software angeboten.\newline Listenpreis: \SI{-1793}{\sieuro}&1&\SI{30}{\%}&\SI{-1255.1}{\sieuro}\\
9 &\textbf{Probenthermostat} (G7129A\#101)\newline Agilent InfinityLab Thermostat zur Probentemperierung zwischen 4 °C und 40 °C.\newline Listenpreis: \SI{6077}{\sieuro}&1&\SI{30}{\%}&\SI{4253.9}{\sieuro}\\
10 &\textbf{Säulenthermostat} (G7116A)\newline 1260 Infinity II Thermostat für bis zu vier 30 cm Säulen, Temperaturbereich: 10° unter Raumtemperatur (min. 4 °C) bis max. 85 °C, inkl. Säulenidentifikations-Kit. Ventilantrieb optional.\newline Listenpreis: \SI{6494}{\sieuro}&1&\SI{30}{\%}&\SI{4545.8}{\sieuro}\\
11 &\textbf{Diodenarraydetektor HS} (G7117C)\newline 1260 Infinity II Diodenarray-Detektor high sensitivity für höchste Empfindlichkeit, 120 Hz Datenrate für schnelle Multiwellenlängen- und Spektralanalysen. Messbereich 190 640 nm, RFID-Tags für Zelle und Lampe. Inklusive Standard-Max-Light-Flusszelle (10 mm, V = 1 µl, max. 70 bar).\newline Listenpreis: \SI{24906}{\sieuro}&1&\SI{30}{\%}&\SI{17434.2}{\sieuro}\\
12 &\textbf{1260 Infinity II HPLC-System} (SYS-LC-1260II)\newline \newline Listenpreis: \SI{0}{\sieuro}&1&\SI{20}{\%}&\SI{0}{\sieuro}\\
13 &\textbf{Einführung} (SYS-LC-1260II\#2A9)\newline Standardeinweisung für neue Anwender im Rahmen der Installation.\newline Listenpreis: \SI{1034}{\sieuro}&1&\SI{20}{\%}&\SI{827.2}{\sieuro}\\
14 &\textbf{Installation and Operational Qualification} (SYS-LC-1260II\#6H9)\newline Gerätequalifizierung (IQ/OQ) im Rahmen der Installation.\newline Listenpreis: \SI{4561}{\sieuro}&1&\SI{20}{\%}&\SI{3648.8}{\sieuro}\\
\hline
\end{longtable}
\end{center}
\vspace{-2cm}
\begin{flushright}
\begin{tabular}{|rr|}
\hline
\textbf{Summe netto} & \SI{67879.9}{\sieuro}\\
\textbf{Versand und Bereitstellungskosten (3\%)} & \SI{2036.397}{\sieuro}\\
\textbf{Gesamtsumme netto} & \SI{69916.297}{\sieuro}\\
\hline
\end{tabular}
\end{flushright}
Der Betrag versteht sich zzgl. der gesetzlichen Steuern.\\
Diese werden im Rechnungszeitraum auf der Rechnung gesondert ausgewiesen.\\
Zahlungsbedingungen: 30 Tage netto ab Rechnungsdatum.\\
Incoterm (2010) für Lieferungen innerhalb Deutschlands: DDP.
\begin{small}
\textbf{Gewährleistung:}\\
Die Gewährleistung für Zubehör und Ersatzteilprodukte und für Analytik-Hardwareprodukte beträgt 12 Monate.
\textbf{Hinweis:}\\
Fü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.
\end{small}
\begin{scriptsize}
Agilent Technologies Deutschland GmbH, Hewlett-Packard-Str. 8, D-76337 Waldbronn\\
Telefon +49 (0)7243-602-0\\
USt.-IdNr.: DE812729296, WEEE-Reg.-Nr. DE 86631749\\
Sitz der Gesellschaft: Waldbronn Amtsgericht Mannheim, HRB 723782\\
Geschäftsführer: Dr. Andreas Kistner (Vorsitzender der Geschäftsführung), Armin Jehle, Norbert Sabatzki, Dr. Knut Wintergerst\\
\href{www.agilent.com}{www.agilent.com}
\end{scriptsize}
\end{document}

@ -0,0 +1,15 @@
# Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
1 G7112B 29 1260 Infinity II Binaere Pumpe 1 30307 0 0 30 21214.9 21214.9 30 0 0 0 ISL100P1 Pumps
2 G7112B 001 29 HPLC Sys.-Tool-K. Agil. 1260 Infinity II 1 390 0 0 30 273 273 30 0 0 0
3 G7112B 007 29 Kit fuer Maximale Betriebszeit 1 1783 0 0 30 1248.1 1248.1 30 0 0 0
4 G7112B 030 29 Aktive Kolbenhinterspuelung 1 1982 0 0 30 1387.4 1387.4 30 0 0 0
5 G7112B 094 29 Poroshell 120 EC-C18 3,0 x 150mm, 2,7 um 1 1 0 0 30 0.7 0.7 30 0 0 0
6 G7129A 29 1260 Inf. II Fluessigprobengeber 1 19905 0 0 30 13933.5 13933.5 30 0 0 0 ISL100A1 Autosamplers
7 G7129A 012 29 Klass. Schubladenkit (10 x 10 Pr.-Fl.) 1 525 0 0 30 367.5 367.5 30 0 0 0
8 G7129A 060 29 Nutzung vorhandene Lizenz 1 -1793 0 0 30 -1255.1 -1255.1 30 0 0 0
9 G7129A 101 29 Agilent InfinityLab Proben-Thermostat 1 6077 0 0 30 4253.9 4253.9 30 0 0 0
10 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6494 0 0 30 4545.8 4545.8 30 0 0 0 ISL100LC1 LC Hardware
11 G7117C 29 1260 Infinity II Diodenarray-Detektor HS 1 24906 0 0 30 17434.2 17434.2 30 0 0 0 ISL100D1 Detectors
12 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
13 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 1034 0 0 20 827.2 827.2 20 0 0 0 TSSTRN Training Services
14 SYS-LC-1260II 6H9 74 Analysegeraet-Qualifizierung-auf Wunsch 1 4561 0 0 20 3648.8 3648.8 20 0 0 0 TSSYS1 Serviced As Systems - 1 YR
1 # Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
2 1 G7112B 29 1260 Infinity II Binaere Pumpe 1 30307 0 0 30 21214.9 21214.9 30 0 0 0 ISL100P1 Pumps
3 2 G7112B 001 29 HPLC Sys.-Tool-K. Agil. 1260 Infinity II 1 390 0 0 30 273 273 30 0 0 0
4 3 G7112B 007 29 Kit fuer Maximale Betriebszeit 1 1783 0 0 30 1248.1 1248.1 30 0 0 0
5 4 G7112B 030 29 Aktive Kolbenhinterspuelung 1 1982 0 0 30 1387.4 1387.4 30 0 0 0
6 5 G7112B 094 29 Poroshell 120 EC-C18 3,0 x 150mm, 2,7 um 1 1 0 0 30 0.7 0.7 30 0 0 0
7 6 G7129A 29 1260 Inf. II Fluessigprobengeber 1 19905 0 0 30 13933.5 13933.5 30 0 0 0 ISL100A1 Autosamplers
8 7 G7129A 012 29 Klass. Schubladenkit (10 x 10 Pr.-Fl.) 1 525 0 0 30 367.5 367.5 30 0 0 0
9 8 G7129A 060 29 Nutzung vorhandene Lizenz 1 -1793 0 0 30 -1255.1 -1255.1 30 0 0 0
10 9 G7129A 101 29 Agilent InfinityLab Proben-Thermostat 1 6077 0 0 30 4253.9 4253.9 30 0 0 0
11 10 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6494 0 0 30 4545.8 4545.8 30 0 0 0 ISL100LC1 LC Hardware
12 11 G7117C 29 1260 Infinity II Diodenarray-Detektor HS 1 24906 0 0 30 17434.2 17434.2 30 0 0 0 ISL100D1 Detectors
13 12 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
14 13 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 1034 0 0 20 827.2 827.2 20 0 0 0 TSSTRN Training Services
15 14 SYS-LC-1260II 6H9 74 Analysegeraet-Qualifizierung-auf Wunsch 1 4561 0 0 20 3648.8 3648.8 20 0 0 0 TSSYS1 Serviced As Systems - 1 YR

@ -0,0 +1,159 @@
\documentclass[a4paper,ngerman,parskip,10pt]{scrlttr2}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage[hidelinks]{hyperref}
\usepackage[left=2cm, right=2cm, top=2cm, bottom=2cm]{geometry}
\usepackage[table]{xcolor}
\usepackage[right]{{eurosym}}
\usepackage[locale=DE]{{siunitx}}
\usepackage{{scrlayer-scrpage}}
\usepackage{{lastpage}}
\usepackage{{graphicx}}
\usepackage{{multirow}}
\usepackage{{longtable}}
\usepackage{{enumitem}}
\usepackage{{fp, xstring, spreadtab, numprint}}
\DeclareSIUnit{{\sieuro}}{{\mbox{{\euro}}}}
\rohead{DE-83PE89-223-220}
\cfoot{Seite \thepage/\pageref{LastPage}}
\sisetup{round-integer-to-decimal,round-precision=2,round-mode=places}
\newcommand{\produkttitel}[1]{\textsc{#1}}
\renewcommand{\arraystretch}{1.2}
\definecolor{AgilentBlau}{HTML}{0085d5}
\setlist{noitemsep}
\begin{document}
\begin{tabular}{p{0.4\hsize}p{0.5\hsize}}
\multirow{4}{*}{\includegraphics[width=0.9\hsize]{agilentLogo.png}}
&\normalsize{Agilent Technologies Deutschland GmbH}\\
&\normalsize{Life Sciences \& Chemical Analysis}\\
&\normalsize{Hewlett-Packard-Str. 8}\\
&\normalsize{D-76337 Waldbronn}
\end{tabular}
\par
\begin{flushright}
\colorbox{AgilentBlau}{\textcolor{white}{\textsc{\Huge{Angebot}}}}
\end{flushright}
\begin{tabular}{p{0.4\hsize}p{0.6\hsize}}
&
\multirow{4}{*}{
\begin{tabular}{|ll|}
\hline
\textbf{Angebotsnummer:}&DE-83PE89-223-220\\
Angebotdatum:&\today\\
Angebotsgültigkeit:&60 Tage\\\textbf{Ansprechpartner:}&Sascha Woitschetzki\\
Telefon: &+49 208 74129134\\
Mobil:&+49 176 22285334\\
E-Mail:&\href{mailto:sascha.woitschetzki@non.agilent.com}{sascha.woitschetzki@non.agilent.com}\\
\textbf{Auftragsannahme:}&\href{mailto:salesservices\_germany@agilent.com}{salesservices\_germany@agilent.com}\\
\hline
\end{tabular}
}\\
Herr Thomas Bürgel
\\
Grünenthal GmbH
\\
Zieglerstr. 6
\\
52078 Aachen
\\
&\\
&\\
\end{tabular}
\vspace{1cm}\par
Sehr geehrter Herr Bürgel,\par
nachfolgend erhalten Sie Ihr gewünschtes Angebot über ein(e) HPLC mit VWD.\\
Es umfasst im Einzelnen:
\begin{itemize}
\item Binäre Pumpe (\#1)
\begin{itemize}
\item Werkzeugsatz (\#2)
\item Kit für maximal Betriebszeit (\#3)
\item Aktive Kolbenhinterspülung (\#4)
\item Säule (\#5)
\end{itemize}
\item Vialsampler (\#6)
\begin{itemize}
\item Classic Probenträger-Kit (\#7)
\item Ohne Gerätetreiber (\#8)
\item Probenthermostat (4 40 °C) (\#9)
\end{itemize}
\item Säulenthermostat (\#10)
\item UV/VIS-Detektor (\#11)
\begin{itemize}
\item Standardflusszelle (\#12)
\end{itemize}
\item 1260 Infinity II HPLC-System (\#13)
\begin{itemize}
\item Einführung (\#14)
\item Installation and Operational Qualification (\#15)
\end{itemize}
\end{itemize}
Für Rückfragen und Änderungswünsche stehe ich Ihnen gerne zur Verfügung.\par
Mit freundlichen Grüßen\\
\includegraphics[width = 5cm]{signWoitschetzki.png}
\vspace{1cm} \\
\begin{center}
\begin{longtable}
{| cp{0.595\textwidth} crr |} \hline
\textbf{\#} & \textbf{Produktbeschreibung} (Produktnummer) & \textbf{Menge} & \textbf{Discount} & \textbf{Preis}\\ \hline \endhead
1 &\textbf{Binäre Pumpe} (G7112B)\newline 1260 Infinity II Binäre Pumpe, Maximaldruck: 600 bar. \newline Mit integriertem 2-Kanal-Entgaser, vergünstigter Säule, Verbindungskapillaren, Lösemittelwanne, Lösemittelflaschen und CAN-Kabel.\newline Listenpreis: \SI{30307}{\sieuro}&1&\SI{30}{\%}&\SI{21214.9}{\sieuro}\\
2 &\textbf{Werkzeugsatz} (G7112B\#001)\newline Werkzeugsatz für Agilent 1260/1290 Infinity II LC-Systeme.\newline Listenpreis: \SI{390}{\sieuro}&1&\SI{30}{\%}&\SI{273}{\sieuro}\\
3 &\textbf{Kit für maximal Betriebszeit} (G7112B\#007)\newline Für Agilent 1260 Infinity II HPLC. Enthält u. a. Edelstahl-Kapillaren, PEEK-Schläuche, PEEK-Fittinge, Schneidewerkzeug, PTFE-Fritten, Lösemittelansaugfilter.\newline Listenpreis: \SI{1783}{\sieuro}&1&\SI{30}{\%}&\SI{1248.1}{\sieuro}\\
4 &\textbf{Aktive Kolbenhinterspülung} (G7112B\#030)\newline Automatische Reinigung und Pflege der Pumpenköpfe, -dichtungen und -ventile für maximale Lebensdauer. Besonders empfohlen bei salzhaltigen Analyten oder Puffern.\newline Listenpreis: \SI{1982}{\sieuro}&1&\SI{30}{\%}&\SI{1387.4}{\sieuro}\\
5 &\textbf{Säule} (G7112B\#094)\newline InfinityLab Poroshell 120 EC-C18 3.0 x 150 mm, 2.7 µm.\newline Listenpreis: \SI{1}{\sieuro}&1&\SI{30}{\%}&\SI{0.7}{\sieuro}\\
6 &\textbf{Vialsampler} (G7129A)\newline 1260 Infinity II automatischer Flüssigprobengeber zur Verwendung bei bis zu 600 bar. Mit integriertem Nadelspülanschluss zur Minimierung der Verschleppung, 100 µl Dosiereinheit und 100 µl Probenschleife. Inklusive Gerätetreiber für ein LC-System (2D-UV).\newline Listenpreis: \SI{19905}{\sieuro}&1&\SI{30}{\%}&\SI{13933.5}{\sieuro}\\
7 &\textbf{Classic Probenträger-Kit} (G7129A\#012)\newline 2 Probenträger mit je 5x 10 Probenplätzen für 2,0 ml Vials.\newline Listenpreis: \SI{525}{\sieuro}&1&\SI{30}{\%}&\SI{367.5}{\sieuro}\\
8 &\textbf{Ohne Gerätetreiber} (G7129A\#060)\newline Es wird ein vorhandener Gerätetreiber verwendet oder mit der Software angeboten.\newline Listenpreis: \SI{-1793}{\sieuro}&1&\SI{30}{\%}&\SI{-1255.1}{\sieuro}\\
9 &\textbf{Probenthermostat} (G7129A\#101)\newline Agilent InfinityLab Thermostat zur Probentemperierung zwischen 4 °C und 40 °C.\newline Listenpreis: \SI{6077}{\sieuro}&1&\SI{30}{\%}&\SI{4253.9}{\sieuro}\\
10 &\textbf{Säulenthermostat} (G7116A)\newline 1260 Infinity II Thermostat für bis zu vier 30 cm Säulen, Temperaturbereich: 10° unter Raumtemperatur (min. 4 °C) bis max. 85 °C, inkl. Säulenidentifikations-Kit. Ventilantrieb optional.\newline Listenpreis: \SI{6494}{\sieuro}&1&\SI{30}{\%}&\SI{4545.8}{\sieuro}\\
11 &\textbf{UV/VIS-Detektor} (G7114A)\newline 1260 Infinity II variabler Wellenlängendetektor (190 600 nm). Für schnelle programmierbare Einzel- (bis zu 120 Hz) und Doppelwellenlängen-Detektion. RFID-Tags für Durchflusszellen und UV-Lampe.\newline Listenpreis: \SI{9307}{\sieuro}&1&\SI{30}{\%}&\SI{6514.9}{\sieuro}\\
12 &\textbf{Standardflusszelle} (G7114A\#018)\newline Standarddurchflusszelle VWD aus Edelstahl mit RFID-Tag zur Identifizierung, 10 mm, 14 µl.\newline Listenpreis: \SI{1612}{\sieuro}&1&\SI{30}{\%}&\SI{1128.4}{\sieuro}\\
13 &\textbf{1260 Infinity II HPLC-System} (SYS-LC-1260II)\newline \newline Listenpreis: \SI{0}{\sieuro}&1&\SI{20}{\%}&\SI{0}{\sieuro}\\
14 &\textbf{Einführung} (SYS-LC-1260II\#2A9)\newline Standardeinweisung für neue Anwender im Rahmen der Installation.\newline Listenpreis: \SI{1034}{\sieuro}&1&\SI{20}{\%}&\SI{827.2}{\sieuro}\\
15 &\textbf{Installation and Operational Qualification} (SYS-LC-1260II\#6H9)\newline Gerätequalifizierung (IQ/OQ) im Rahmen der Installation.\newline Listenpreis: \SI{4561}{\sieuro}&1&\SI{20}{\%}&\SI{3648.8}{\sieuro}\\
\hline
\end{longtable}
\end{center}
\vspace{-2cm}
\begin{flushright}
\begin{tabular}{|rr|}
\hline
\textbf{Summe netto} & \SI{58089.0}{\sieuro}\\
\textbf{Versand und Bereitstellungskosten (3\%)} & \SI{1742.67}{\sieuro}\\
\textbf{Gesamtsumme netto} & \SI{59831.67}{\sieuro}\\
\hline
\end{tabular}
\end{flushright}
Der Betrag versteht sich zzgl. der gesetzlichen Steuern.\\
Diese werden im Rechnungszeitraum auf der Rechnung gesondert ausgewiesen.\\
Zahlungsbedingungen: 30 Tage netto ab Rechnungsdatum.\\
Incoterm (2010) für Lieferungen innerhalb Deutschlands: DDP.
\begin{small}
\textbf{Gewährleistung:}\\
Die Gewährleistung für Zubehör und Ersatzteilprodukte und für Analytik-Hardwareprodukte beträgt 12 Monate.
\textbf{Hinweis:}\\
Fü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.
\end{small}
\begin{scriptsize}
Agilent Technologies Deutschland GmbH, Hewlett-Packard-Str. 8, D-76337 Waldbronn\\
Telefon +49 (0)7243-602-0\\
USt.-IdNr.: DE812729296, WEEE-Reg.-Nr. DE 86631749\\
Sitz der Gesellschaft: Waldbronn Amtsgericht Mannheim, HRB 723782\\
Geschäftsführer: Dr. Andreas Kistner (Vorsitzender der Geschäftsführung), Armin Jehle, Norbert Sabatzki, Dr. Knut Wintergerst\\
\href{www.agilent.com}{www.agilent.com}
\end{scriptsize}
\end{document}

@ -0,0 +1,16 @@
# Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
1 G7112B 29 1260 Infinity II Binaere Pumpe 1 30307 0 0 30 21214.9 21214.9 30 0 0 0 ISL100P1 Pumps
2 G7112B 001 29 HPLC Sys.-Tool-K. Agil. 1260 Infinity II 1 390 0 0 30 273 273 30 0 0 0
3 G7112B 007 29 Kit fuer Maximale Betriebszeit 1 1783 0 0 30 1248.1 1248.1 30 0 0 0
4 G7112B 030 29 Aktive Kolbenhinterspuelung 1 1982 0 0 30 1387.4 1387.4 30 0 0 0
5 G7112B 094 29 Poroshell 120 EC-C18 3,0 x 150mm, 2,7 um 1 1 0 0 30 0.7 0.7 30 0 0 0
6 G7129A 29 1260 Inf. II Fluessigprobengeber 1 19905 0 0 30 13933.5 13933.5 30 0 0 0 ISL100A1 Autosamplers
7 G7129A 012 29 Klass. Schubladenkit (10 x 10 Pr.-Fl.) 1 525 0 0 30 367.5 367.5 30 0 0 0
8 G7129A 060 29 Nutzung vorhandene Lizenz 1 -1793 0 0 30 -1255.1 -1255.1 30 0 0 0
9 G7129A 101 29 Agilent InfinityLab Proben-Thermostat 1 6077 0 0 30 4253.9 4253.9 30 0 0 0
10 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6494 0 0 30 4545.8 4545.8 30 0 0 0 ISL100LC1 LC Hardware
11 G7114A 29 1260 Infinity II VW-Detektor 1 9307 0 0 30 6514.9 6514.9 30 0 0 0 ISL100D1 Detectors
12 G7114A 018 29 Standarddurchflusszelle VWD 1 1612 0 0 30 1128.4 1128.4 30 0 0 0
13 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
14 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 1034 0 0 20 827.2 827.2 20 0 0 0 TSSTRN Training Services
15 SYS-LC-1260II 6H9 74 Analysegeraet-Qualifizierung-auf Wunsch 1 4561 0 0 20 3648.8 3648.8 20 0 0 0 TSSYS1 Serviced As Systems - 1 YR
1 # Part Number Opt PL Description Qty Price EUR Breaks EUR Uplift % Total Discount % Net EUR Total EUR Sales Discount YA9% Contractual Discount Y99% Promotion Discount Y07% Demo Discount Y04% PH Code PH Description YMax
2 1 G7112B 29 1260 Infinity II Binaere Pumpe 1 30307 0 0 30 21214.9 21214.9 30 0 0 0 ISL100P1 Pumps
3 2 G7112B 001 29 HPLC Sys.-Tool-K. Agil. 1260 Infinity II 1 390 0 0 30 273 273 30 0 0 0
4 3 G7112B 007 29 Kit fuer Maximale Betriebszeit 1 1783 0 0 30 1248.1 1248.1 30 0 0 0
5 4 G7112B 030 29 Aktive Kolbenhinterspuelung 1 1982 0 0 30 1387.4 1387.4 30 0 0 0
6 5 G7112B 094 29 Poroshell 120 EC-C18 3,0 x 150mm, 2,7 um 1 1 0 0 30 0.7 0.7 30 0 0 0
7 6 G7129A 29 1260 Inf. II Fluessigprobengeber 1 19905 0 0 30 13933.5 13933.5 30 0 0 0 ISL100A1 Autosamplers
8 7 G7129A 012 29 Klass. Schubladenkit (10 x 10 Pr.-Fl.) 1 525 0 0 30 367.5 367.5 30 0 0 0
9 8 G7129A 060 29 Nutzung vorhandene Lizenz 1 -1793 0 0 30 -1255.1 -1255.1 30 0 0 0
10 9 G7129A 101 29 Agilent InfinityLab Proben-Thermostat 1 6077 0 0 30 4253.9 4253.9 30 0 0 0
11 10 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6494 0 0 30 4545.8 4545.8 30 0 0 0 ISL100LC1 LC Hardware
12 11 G7114A 29 1260 Infinity II VW-Detektor 1 9307 0 0 30 6514.9 6514.9 30 0 0 0 ISL100D1 Detectors
13 12 G7114A 018 29 Standarddurchflusszelle VWD 1 1612 0 0 30 1128.4 1128.4 30 0 0 0
14 13 SYS-LC-1260II 74 LC 1260 Infinity II System 1 0 0 0 20 0 0 20 0 0 0 TSSYS0SYLC Service Systems - Liquid Chromatography
15 14 SYS-LC-1260II 2A9 74 Standard-Einweisung 1 1034 0 0 20 827.2 827.2 20 0 0 0 TSSTRN Training Services
16 15 SYS-LC-1260II 6H9 74 Analysegeraet-Qualifizierung-auf Wunsch 1 4561 0 0 20 3648.8 3648.8 20 0 0 0 TSSYS1 Serviced As Systems - 1 YR