ProductLines

pull/1/head
DJh2o2 2023-03-01 15:47:46 +07:00
parent c26031ca46
commit 94337de56c
7 changed files with 372 additions and 119 deletions

@ -1,16 +1,24 @@
@page "/"
<PageTitle>Gremlin BlazorServer</PageTitle>
<h1>Gremlin BlazorServer</h1>
<h2>Welcome to new App!</h2>
<AuthorizeView>
<Authorized>
@if (context.User.Identity != null) {
<h3>You are logged in as @context.User.Identity.Name</h3>
}
</Authorized>
<NotAuthorized>
<h3>Authentication Failure!</h3>
<p>You're not signed in. Please click on the upper right to either register or log in.</p>
</NotAuthorized>
</AuthorizeView>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is4">Gremlin BlazorServer</Heading>
<Heading Size="HeadingSize.Is5">Welcome to new App!</Heading>
<Paragraph>
<AuthorizeView>
<Authorized>
@if (context.User.Identity != null) {
<Heading Size="HeadingSize.Is6">You are logged in as @context.User.Identity.Name</Heading>
}
</Authorized>
<NotAuthorized>
<Heading Size="HeadingSize.Is6">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</NotAuthorized>
</AuthorizeView>
</Paragraph>
</Div>

@ -2,76 +2,126 @@
@using Gremlin_BlazorServer.Services
@using Gremlin_BlazorServer.Data.EntityClasses
@inject GenericController GenericController
@inject GenericController genericController
@inject ILoadingIndicatorService ApplicationLoadingIndicatorService
<AuthorizeView>
<Authorized Context="Auth">
<h1>ProductLines</h1>
<DataGrid TItem="ProductLine"
Data="@productLines"
SelectedRow="@selectedProductLine"
SelectedRowChanged="@OnSelectedProductLineChanged"
UseValidation Narrow FixedHeader Editable ShowPager Bordered Hoverable Sortable Filterable Striped Responsive>
<DataGridColumns>
<DataGridCommandColumn NewCommandAllowed="false" EditCommandAllowed="false" DeleteCommandAllowed="false">
<SaveCommandTemplate>
<Button ElementId="btnSave" Type="ButtonType.Submit" PreventDefaultOnSubmit Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</SaveCommandTemplate>
<CancelCommandTemplate>
<Button ElementId="btnCancel" Color="Color.Secondary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</CancelCommandTemplate>
</DataGridCommandColumn>
<DataGridColumn Field="@nameof(ProductLine.ProductLineCode)" Caption="ProductLineCode" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(ProductLine.ProductLineDescription)" Caption="ProductLineDescription" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(ProductLine.DataStatus)" Caption="DataStatus" Filterable Sortable Editable/>
</DataGridColumns>
<ButtonRowTemplate>
<Button Color="Color.Success" Clicked="context.NewCommand.Clicked">New</Button>
<Button Color="Color.Primary" Disabled="selectedProductLine is null" Clicked="context.EditCommand.Clicked">Edit</Button>
<Button Color="Color.Danger" Disabled="selectedProductLine is null" Clicked="context.DeleteCommand.Clicked">Delete</Button>
<Button Color="Color.Secondary" Clicked="context.ClearFilterCommand.Clicked">Clear Filter</Button>
</ButtonRowTemplate>
</DataGrid>
@if (selectedProductLine?.Products != null) {
<h2>@selectedProductLine.ProductLineCode: @selectedProductLine.ProductLineDescription</h2>
<DataGrid TItem="Product" Data="@selectedProductLine.Products" Narrow FixedHeader ShowPager Bordered Hoverable Sortable Filterable Striped Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(Product.ProductNumber)" Caption="ProductNumber" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Product.OptionNumber)" Caption="OptionNumber" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Product.SapShortDescription)" Caption="SapShortDescription" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Product.SapLongDescription)" Caption="SapLongDescription" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Product.ProductLine.ProductLineCode)" Caption="ProductLineCode" Filterable Sortable Editable/>
</DataGrid>
}
</Authorized>
<NotAuthorized>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is3">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
<Authorized Context="Auth">
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is4">ProductLines</Heading>
<Paragraph>
<DataGrid TItem="ProductLine"
Data="@productLines"
SelectedRow="@selectedProductLine"
SelectedRowChanged="@OnSelectedProductLineChanged"
RowInserted="@OnRowInsertedAsync"
RowUpdated="@OnRowUpdatedAsync"
RowRemoved="@OnRowRemovedAsync"
CommandMode="DataGridCommandMode.ButtonRow"
EditMode="DataGridEditMode.Popup"
UseValidation Narrow Editable ShowPager Bordered Hoverable Sortable Filterable Striped Responsive FixedHeader>
<DataGridColumns>
<DataGridCommandColumn NewCommandAllowed="false" EditCommandAllowed="false" DeleteCommandAllowed="false">
<SaveCommandTemplate>
<Button ElementId="btnSave" Type="ButtonType.Submit" PreventDefaultOnSubmit Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</SaveCommandTemplate>
<CancelCommandTemplate>
<Button ElementId="btnCancel" Color="Color.Secondary" Clicked="@context.Clicked">@context.LocalizationString</Button>
</CancelCommandTemplate>
</DataGridCommandColumn>
<DataGridColumn Field="@nameof(ProductLine.ProductLineCode)" Caption="ProductLineCode" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(ProductLine.ProductLineDescription)" Caption="ProductLineDescription" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(ProductLine.DataStatus)" Caption="DataStatus" Filterable Sortable Editable/>
</DataGridColumns>
<ButtonRowTemplate>
<Button Color="Color.Primary" Clicked="context.NewCommand.Clicked">New</Button>
<Button Color="Color.Warning" Disabled="selectedProductLine is null" Clicked="context.EditCommand.Clicked">Edit</Button>
<Button Color="Color.Danger" Disabled="selectedProductLine is null" Clicked="context.DeleteCommand.Clicked">Delete</Button>
<Button Color="Color.Secondary" Clicked="context.ClearFilterCommand.Clicked">Clear Filter</Button>
</ButtonRowTemplate>
</DataGrid>
</Paragraph>
</Div>
@* @if (selectedProductLine?.Products != null)
{
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is4">Products in PL @selectedProductLine.ProductLineCode</Heading>
<Paragraph>
<h2>@selectedProductLine.ProductLineCode: @selectedProductLine.ProductLineDescription</h2>
<DataGrid TItem="Product" Data="@selectedProductLine.Products" Narrow FixedHeader ShowPager Bordered Hoverable Sortable Filterable Striped Responsive>
<DataGridCommandColumn/>
<DataGridColumn Field="@nameof(Product.ProductNumber)" Caption="ProductNumber" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Product.OptionNumber)" Caption="OptionNumber" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Product.SapShortDescription)" Caption="SapShortDescription" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Product.SapLongDescription)" Caption="SapLongDescription" Filterable Sortable Editable/>
<DataGridColumn Field="@nameof(Product.ProductLine.ProductLineCode)" Caption="ProductLineCode" Filterable Sortable Editable/>
</DataGrid>
</Paragraph>
</Div>
}*@
</Authorized>
<NotAuthorized>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is3">Authentication Failure!</Heading>
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
</AuthorizeView>
@code {
private IList<ProductLine>? productLines;
private ProductLine? selectedProductLine;
private IList<ProductLine>? productLines;
private ProductLine? selectedProductLine;
protected override async Task OnParametersSetAsync() {
productLines = await genericController.GetAllAsync<ProductLine>();
}
private async Task OnSelectedProductLineChanged(ProductLine _selectedProductLine) {
selectedProductLine = _selectedProductLine;
//await ApplicationLoadingIndicatorService.Show();
//selectedProductLine.Products = await genericController.GetAllAsync<Product>(p => p.ProductLine.ProductLineCode.Equals(selectedProductLine.ProductLineCode));
//await ApplicationLoadingIndicatorService.Hide();
}
private async Task OnRowInsertedAsync(SavedRowItem<ProductLine, Dictionary<string, object>> productLine) {
ProductLine newProductLine = await ResolveProductAsync(productLine.Item);
if (newProductLine.ProductLineCode == null) return;
int count = await genericController.InsertAsync(newProductLine);
Console.WriteLine($"Inserted {count} properties for new ProductLine {newProductLine.ProductLineCode}.");
}
protected override Task OnParametersSetAsync() {
productLines = GenericController.GetAll<ProductLine>();
return Task.CompletedTask;
}
private async Task OnRowUpdatedAsync(SavedRowItem<ProductLine, Dictionary<string, object>> productLine) {
ProductLine newProductLine = await ResolveProductAsync(productLine.Item);
if (newProductLine.ProductLineCode == null) return;
int count = await genericController.UpdateAsync(productLine.Item);
Console.WriteLine($"Updated {count} properties in ProductLine {newProductLine.ProductLineCode}.");
}
private Task OnSelectedProductLineChanged(ProductLine pL) {
selectedProductLine = pL;
selectedProductLine.Products = GenericController.GetAll<Product>(p => p.ProductLine.ProductLineCode == selectedProductLine.ProductLineCode);
return Task.CompletedTask;
}
private async Task OnRowRemovedAsync(ProductLine productLine) {
int count = await genericController.RemoveAsync(productLine);
Console.WriteLine($"Removed {count} properties and ProductLine {productLine.ProductLineCode}.");
}
private async Task<ProductLine> ResolveProductAsync(ProductLine newProductLine) {
newProductLine.DataModificationByUser = "Gremlin Blazor Server GUI";
newProductLine.DataVersionNumber++;
newProductLine.Products = await genericController.GetAllAsync<Product>(p => p.ProductLineCode.Equals(newProductLine.ProductLineCode));
return newProductLine;
}
}

@ -3,6 +3,7 @@
@using Gremlin_BlazorServer.Data.EntityClasses
@using System.Globalization
@using System.Security.Claims;
@using System.Text;
@inject GenericController genericController
@inject NavigationManager navigationManager
@ -383,7 +384,7 @@
Console.WriteLine(exc.Message);
}
finally {
lineItemsNotReady = false;
if (quote.Recipient != null) lineItemsNotReady = false;
StateHasChanged();
}
}
@ -400,25 +401,27 @@
selectedContact = _selectedContact;
quote.Recipient = selectedContact;
quote.Recipient.Account = await genericController.GetAsync<Account>(account => account.AccountId.Equals(quote.Recipient.AccountId));
return;
if (quote.LineItems != null) lineItemsNotReady = false;
}
private async Task OnSave() {
if (await genericController.InsertAsync(quote) > 0)
navigationManager.NavigateTo("Quotes/QuoteIndex");
private async Task OnSave() {
if (await genericController.InsertAsync(quote) > 0)
navigationManager.NavigateTo("Quotes/QuoteIndex");
return;
}
private async Task OnCreateTex() {
isCreatingTex = true;
quote.Tex = (await QuoteHandling.CreateTexAsync(quote))?.ToString();
if (quote.Tex == null) return;
await FileService.WriteTexFile(quote);
isCreatingTex = false;
Console.WriteLine("Tex file succesfull created.");
texNotReady = false;
return;
}
private async Task OnCreateTex() {
isCreatingTex = true;
StringBuilder? tex = await QuoteHandling.CreateTexAsync(quote);
if (tex == null) return;
quote.Tex = tex.ToString();
if (quote.Tex == null) return;
await FileService.WriteTexFile(quote);
isCreatingTex = false;
Console.WriteLine("Tex file succesfull created.");
texNotReady = false;
}
private async Task OnCreatePdf()
@ -432,75 +435,73 @@
url = HostingService.GetPdfUrl(quote);
Console.WriteLine($"URL to PDF is {url}");
}
return;
}
private Task OnOpenPdfApp()
private void OnOpenPdfApp()
{
PdfService.OpenPdfWithOkular(quote);
return Task.CompletedTask;
}
private async Task OnOpenPdfNewTab() {
await jSRuntime.InvokeVoidAsync("OpenNewTab", $"quotes/{url}");
return;
}
private Task OnDescriptionChanged(string description) {
private void OnDescriptionChanged(string description) {
quote.Description = description;
return Task.CompletedTask;
}
private Task OnQuotationNumberChanged(string quotationNumber) {
private void OnQuotationNumberChanged(string quotationNumber) {
quote.QuotationNumber = quotationNumber;
return Task.CompletedTask;
}
private Task OnValidForChanged(string validFor) {
private void OnValidForChanged(string validFor) {
quote.ValidFor = byte.Parse(validFor);
return Task.CompletedTask;
}
private Task OnVATChanged(string vat) {
private void OnVATChanged(string vat) {
quote.Vat = float.Parse(vat);
return Task.CompletedTask;
}
private Task OnIsPriceInformationChanged(bool isPriceInformation) {
private void OnIsPriceInformationChanged(bool isPriceInformation) {
quote.IsPriceInformation = isPriceInformation;
return Task.CompletedTask;
}
private Task OnShowBruttoChanged(bool onShowBrutto) {
private void OnShowBruttoChanged(bool onShowBrutto) {
quote.ShowBrutto = onShowBrutto;
return Task.CompletedTask;
}
private Task OnShowDiscountsChanged(bool showDiscount) {
private void OnShowDiscountsChanged(bool showDiscount) {
quote.ShowDiscounts = showDiscount;
return Task.CompletedTask;
}
private Task OnShowSinglePricesChanged(bool showSinglePrices) {
private void OnShowSinglePricesChanged(bool showSinglePrices) {
quote.ShowSinglePrices = showSinglePrices;
return Task.CompletedTask;
}
private Task OnWarrantyChanged(string warranty) {
quote.Warranty = int.Parse(warranty);
return Task.CompletedTask;
private void OnWarrantyChanged(string warranty) {
quote.Warranty = int.Parse(warranty);
}
private Task OnCancel() {
private void OnCancel() {
navigationManager.NavigateTo("Quotes/QuoteIndex");
return Task.CompletedTask;
}
private async Task OnSelectedLineItemChanged(LineItem lI) {
selectedLineItem = lI;
customDescriptionOfSelectedLineItem =
await genericController.GetAsync<CustomDescription>(cD => cD.ProductNumber.Equals(lI.ProductNumber) && cD.OptionNumber.Equals(lI.OptionNumber));
return;
}
}

@ -86,6 +86,7 @@ public class GenericController
return null;
}
}
public async Task<IList<TResult>?> GetAllAsync<TResult>(string include1, string include2) where TResult : class, IMetadata
{
try
@ -119,6 +120,22 @@ public class GenericController
}
}
public async Task<IList<TResult>?> GetAllAsync<TResult>(Predicate<TResult> search, string include) where TResult : class, IMetadata
{
try
{
using (GremlinDb gremlinDb = new())
{
return await Task.Run(() => gremlinDb.Set<TResult>().Include(include).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
{
try

@ -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-323-223}
\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-323-223\\
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}
}\\
Frau Martina Pohl
\\
Forschungszentrum Jülich GmbH
\\
Wilhelm-Johnen-Str.
\\
52425 Jülich
\\
&\\
&\\
\end{tabular}
\vspace{1cm}\par
Sehr geehrte Frau Pohl,\par
nachfolgend erhalten Sie Ihr gewünschtes Angebot über ein(e) Gerät.\\
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}\\
\textbf{Umsatzsteuer (19\%)} & \SI{11368.0173}{\sieuro}\\
\textbf{Gesamtsumme brutto} & \SI{71199.6873}{\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