quote
parent
ab95729a4a
commit
8ab7f52b24
@ -1,262 +1,262 @@
|
|||||||
using System.Diagnostics;
|
|
||||||
using System.Globalization;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Text;
|
|
||||||
using Blazorise;
|
using Blazorise;
|
||||||
using Gremlin_BlazorServer.Data.EntityClasses;
|
using Gremlin_BlazorServer.Data.EntityClasses;
|
||||||
using Gremlin_BlazorServer.Services;
|
using Gremlin_BlazorServer.Services;
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
using Microsoft.AspNetCore.Components.Authorization;
|
using Microsoft.AspNetCore.Components.Authorization;
|
||||||
using Microsoft.JSInterop;
|
using Microsoft.JSInterop;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Security.Claims;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
namespace Gremlin_BlazorServer.Pages.Quotes;
|
namespace Gremlin_BlazorServer.Pages.Quotes;
|
||||||
|
|
||||||
public partial class QuoteAdd
|
public partial class QuoteAdd
|
||||||
{
|
{
|
||||||
[CascadingParameter] private Task<AuthenticationState>? AuthenticationStateTask { get; set; }
|
[CascadingParameter] private Task<AuthenticationState>? AuthenticationStateTask { get; set; }
|
||||||
[Inject] public IModalService? ModalService { get; set; }
|
[Inject] public IModalService? ModalService { get; set; }
|
||||||
|
|
||||||
private IList<Contact>? contacts;
|
private IList<Contact>? contacts;
|
||||||
private Quote? quote;
|
private Quote? quote;
|
||||||
private Contact? selectedContact;
|
private Contact? selectedContact;
|
||||||
private readonly CultureInfo cultureInfo = new("de-DE");
|
private readonly CultureInfo cultureInfo = new("de-DE");
|
||||||
private bool pdfNotReady = true;
|
private bool pdfNotReady = true;
|
||||||
private bool isCreatingPdf;
|
private bool isCreatingPdf;
|
||||||
private bool texNotReady = true;
|
private bool texNotReady = true;
|
||||||
private bool isCreatingTex;
|
private bool isCreatingTex;
|
||||||
private bool lineItemsNotReady = true;
|
private bool lineItemsNotReady = true;
|
||||||
private string? url;
|
private string? url;
|
||||||
private readonly bool debug;
|
private readonly bool debug;
|
||||||
private List<CustomDescription>? suggestedCustomDescriptions;
|
private List<CustomDescription>? suggestedCustomDescriptions;
|
||||||
private CustomDescription? newCustomDescription;
|
private CustomDescription? newCustomDescription;
|
||||||
private LineItem? selectedLineItem;
|
private LineItem? selectedLineItem;
|
||||||
|
|
||||||
public Task ShowCustomDescriptionModal() =>
|
public Task ShowCustomDescriptionModal() =>
|
||||||
ModalService.Show<CustomDescriptionModal>(builder =>
|
ModalService.Show<CustomDescriptionModal>(builder =>
|
||||||
{
|
{
|
||||||
builder.Add(parameter => parameter.CustomDescription, newCustomDescription);
|
builder.Add(parameter => parameter.CustomDescription, newCustomDescription);
|
||||||
builder.Add(parameter => parameter.SuggestedCustomDescriptions, suggestedCustomDescriptions);
|
builder.Add(parameter => parameter.SuggestedCustomDescriptions, suggestedCustomDescriptions);
|
||||||
});
|
});
|
||||||
|
|
||||||
protected override async Task OnParametersSetAsync()
|
protected override async Task OnParametersSetAsync()
|
||||||
|
{
|
||||||
|
if (AuthenticationStateTask != null)
|
||||||
{
|
{
|
||||||
if (AuthenticationStateTask != null)
|
ClaimsPrincipal user = (await AuthenticationStateTask).User;
|
||||||
{
|
if (user.Identity is { IsAuthenticated: true })
|
||||||
ClaimsPrincipal user = (await AuthenticationStateTask).User;
|
{
|
||||||
if (user.Identity is { IsAuthenticated: true })
|
await ApplicationLoadingIndicatorService.Show();
|
||||||
{
|
contacts = await genericController.GetAllAsync<Contact>();
|
||||||
await ApplicationLoadingIndicatorService.Show();
|
await ApplicationLoadingIndicatorService.Hide();
|
||||||
contacts = await genericController.GetAllAsync<Contact>();
|
quote = await GenerateNewQuote(quote, "Woitschetzki");
|
||||||
await ApplicationLoadingIndicatorService.Hide();
|
}
|
||||||
quote = await GenerateNewQuote(quote, "Woitschetzki");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Quote> GenerateNewQuote(Quote? _quote, string salesRepLastName)
|
await base.OnInitializedAsync();
|
||||||
{
|
}
|
||||||
if (_quote == null)
|
|
||||||
{
|
|
||||||
_quote = new();
|
|
||||||
await genericController.InsertAsync(_quote);
|
|
||||||
}
|
|
||||||
|
|
||||||
_quote.SalesRep = await genericController.GetAsync<Contact>(c => c.LastName == salesRepLastName);
|
|
||||||
if (_quote.SalesRep != null)
|
|
||||||
//Read Account seperatly to avoid new creation of account
|
|
||||||
_quote.SalesRep.Account = await genericController.GetAsync<Account>(a => a.AccountId == _quote.SalesRep.AccountId);
|
|
||||||
|
|
||||||
Quote? lastQuote = genericController.GetLast<Quote>();
|
|
||||||
_quote.QuoteId = lastQuote != null ? lastQuote.QuoteId + 1 : 1;
|
|
||||||
|
|
||||||
_quote.QuotationNumber = _quote.SalesRep != null ? _quote.SalesRep.LastName switch
|
private async Task<Quote> GenerateNewQuote(Quote? _quote, string salesRepLastName)
|
||||||
{
|
{
|
||||||
"Woitschetzki" => $"DE-83PE89-{DateTime.Now:My}-{_quote.QuoteId}",
|
if (_quote == null)
|
||||||
"Welsch" => $"DE-83RE32-{DateTime.Now:My}-{_quote.QuoteId}",
|
{
|
||||||
_ => $"DE-XXYYXX-{DateTime.Now:My}-{_quote.QuoteId}"
|
_quote = new();
|
||||||
}
|
_ = await genericController.InsertAsync(_quote);
|
||||||
: $"DE-XXYYXX-{DateTime.Now:My}-{_quote.QuoteId}";
|
}
|
||||||
|
|
||||||
_quote.Description = "Gerät";
|
_quote.SalesRep = await genericController.GetAsync<Contact>(c => c.LastName == salesRepLastName);
|
||||||
TryToSaveQuote(_quote);
|
if (_quote.SalesRep != null)
|
||||||
|
//Read Account seperatly to avoid new creation of account
|
||||||
|
_quote.SalesRep.Account = await genericController.GetAsync<Account>(a => a.AccountId == _quote.SalesRep.AccountId);
|
||||||
|
|
||||||
return _quote;
|
Quote? lastQuote = genericController.GetLast<Quote>();
|
||||||
}
|
_quote.QuoteId = lastQuote != null ? lastQuote.QuoteId + 1 : 1;
|
||||||
|
|
||||||
private async Task TryToSaveQuote(Quote _quote)
|
_quote.QuotationNumber = _quote.SalesRep != null ? _quote.SalesRep.LastName switch
|
||||||
{
|
{
|
||||||
if (await genericController.UpdateAsync(_quote) > 0)
|
"Woitschetzki" => $"DE-83PE89-{DateTime.Now:My}-{_quote.QuoteId}",
|
||||||
Debug.WriteLine("Speichern der Quote erfolgreich.");
|
"Welsch" => $"DE-83RE32-{DateTime.Now:My}-{_quote.QuoteId}",
|
||||||
else
|
_ => $"DE-XXYYXX-{DateTime.Now:My}-{_quote.QuoteId}"
|
||||||
Debug.WriteLine("Fehler beim Speichern der Quote!");
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
: $"DE-XXYYXX-{DateTime.Now:My}-{_quote.QuoteId}";
|
||||||
private async Task SelectQuoteOnChanged(FileChangedEventArgs e)
|
|
||||||
|
_quote.Description = "Gerät";
|
||||||
|
_ = TryToSaveQuote(_quote);
|
||||||
|
|
||||||
|
return _quote;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task TryToSaveQuote(Quote _quote)
|
||||||
|
{
|
||||||
|
if (await genericController.UpdateAsync(_quote) > 0)
|
||||||
|
Debug.WriteLine("Speichern der Quote erfolgreich.");
|
||||||
|
else
|
||||||
|
Debug.WriteLine("Fehler beim Speichern der Quote!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SelectQuoteOnChanged(FileChangedEventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
try
|
foreach (IFileEntry? file in e.Files)
|
||||||
|
{
|
||||||
|
using MemoryStream stream = new();
|
||||||
|
await file.WriteToStreamAsync(stream);
|
||||||
|
_ = stream.Seek(0, SeekOrigin.Begin);
|
||||||
|
using StreamReader reader = new(stream);
|
||||||
|
string fileContent = await reader.ReadToEndAsync();
|
||||||
|
quote = QuoteHandling.ReadLineItems(quote, fileContent);
|
||||||
|
if (quote.Recipient?.Account?.AccountName != null) quote = hostingService.SetPath(quote);
|
||||||
|
if (quote.LineItems == null) return;
|
||||||
|
|
||||||
|
FileService.WriteQuoteToTsv(fileContent, quote);
|
||||||
|
|
||||||
|
//TODO Load all relevant CustomDescriptions upfront
|
||||||
|
for (int i = 0; i < quote.LineItems.Count; i++)
|
||||||
{
|
{
|
||||||
foreach (IFileEntry? file in e.Files)
|
newCustomDescription = await genericController.GetAsync<CustomDescription>(
|
||||||
|
newCustomDescription => newCustomDescription.ProductNumber.Equals(quote.LineItems[i].ProductNumber, StringComparison.Ordinal)
|
||||||
|
&& newCustomDescription.OptionNumber.Equals(quote.LineItems[i].OptionNumber, StringComparison.Ordinal)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (newCustomDescription == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Keine CustomDescription für {quote.LineItems[i].ProductNumber}#{quote.LineItems[i].OptionNumber} verfügbar!");
|
||||||
|
suggestedCustomDescriptions = await SuggestCustomDescriptions(quote.LineItems[i]);
|
||||||
|
newCustomDescription = new()
|
||||||
{
|
{
|
||||||
using MemoryStream stream = new();
|
ProductNumber = quote.LineItems[i].ProductNumber,
|
||||||
await file.WriteToStreamAsync(stream);
|
OptionNumber = quote.LineItems[i].OptionNumber,
|
||||||
_ = stream.Seek(0, SeekOrigin.Begin);
|
Heading = quote.LineItems[i].SapShortDescription,
|
||||||
using StreamReader reader = new(stream);
|
DescriptionText = quote.LineItems[i].SapLongDescription
|
||||||
string fileContent = await reader.ReadToEndAsync();
|
};
|
||||||
quote = QuoteHandling.ReadLineItems(quote, fileContent);
|
|
||||||
if (quote.Recipient?.Account?.AccountName != null) quote = hostingService.SetPath(quote);
|
//Show windows to edit new cD
|
||||||
if (quote.LineItems == null) return;
|
await ShowCustomDescriptionModal();
|
||||||
|
//TODO need to wait for modal!
|
||||||
FileService.WriteQuoteToTsv(fileContent, quote);
|
|
||||||
|
//Insert new CustomDescription to db
|
||||||
//TODO Load all relevant CustomDescriptions upfront
|
newCustomDescription.AccountId = 1;
|
||||||
for (int i = 0; i < quote.LineItems.Count; i++)
|
_ = await genericController.InsertAsync(newCustomDescription);
|
||||||
{
|
}
|
||||||
newCustomDescription = await genericController.GetAsync<CustomDescription>(
|
|
||||||
newCustomDescription => newCustomDescription.ProductNumber.Equals(quote.LineItems[i].ProductNumber, StringComparison.Ordinal)
|
//read cD form db to cleanup ChangeTracker
|
||||||
&& newCustomDescription.OptionNumber.Equals(quote.LineItems[i].OptionNumber, StringComparison.Ordinal)
|
quote.LineItems[i].CustomDescription = await genericController.GetAsync<CustomDescription>(cD => cD.CustomDescriptionId.Equals(newCustomDescription.CustomDescriptionId));
|
||||||
);
|
|
||||||
|
|
||||||
if (newCustomDescription == null)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Keine CustomDescription für {quote.LineItems[i].ProductNumber}#{quote.LineItems[i].OptionNumber} verfügbar!");
|
|
||||||
suggestedCustomDescriptions = await SuggestCustomDescriptions(quote.LineItems[i]);
|
|
||||||
newCustomDescription = new()
|
|
||||||
{
|
|
||||||
ProductNumber = quote.LineItems[i].ProductNumber,
|
|
||||||
OptionNumber = quote.LineItems[i].OptionNumber,
|
|
||||||
Heading = quote.LineItems[i].SapShortDescription,
|
|
||||||
DescriptionText = quote.LineItems[i].SapLongDescription
|
|
||||||
};
|
|
||||||
|
|
||||||
//Show windows to edit new cD
|
|
||||||
await ShowCustomDescriptionModal();
|
|
||||||
//TODO need to wait for modal!
|
|
||||||
|
|
||||||
//Insert new CustomDescription to db
|
|
||||||
newCustomDescription.AccountId = 1;
|
|
||||||
_ = await genericController.InsertAsync(newCustomDescription);
|
|
||||||
}
|
|
||||||
|
|
||||||
//read cD form db to cleanup ChangeTracker
|
|
||||||
quote.LineItems[i].CustomDescription = await genericController.GetAsync<CustomDescription>(cD => cD.CustomDescriptionId.Equals(newCustomDescription.CustomDescriptionId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception exc)
|
}
|
||||||
{
|
|
||||||
Console.WriteLine(exc.Message);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (quote.Recipient != null) lineItemsNotReady = false;
|
|
||||||
StateHasChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<List<CustomDescription>?> SuggestCustomDescriptions(LineItem lineItem)
|
|
||||||
{
|
|
||||||
//IList<CustomDescription>? fromProductNumber = await genericController.GetAllAsync<CustomDescription>(cD => cD.ProductNumber.Equals(lineItem.ProductNumber, StringComparison.Ordinal));
|
|
||||||
IList<CustomDescription>? fromOptionNumber = new List<CustomDescription>();
|
|
||||||
if (lineItem.OptionNumber != "")
|
|
||||||
fromOptionNumber = await genericController.GetAllAsync<CustomDescription>(cD => cD.OptionNumber.Equals(lineItem.OptionNumber, StringComparison.Ordinal));
|
|
||||||
//if (fromOptionNumber == null && fromProductNumber == null) return null;
|
|
||||||
//if (fromOptionNumber == null) return fromProductNumber.ToList();
|
|
||||||
//if (fromProductNumber == null) return fromOptionNumber.ToList();
|
|
||||||
//return fromProductNumber.Union(fromOptionNumber).ToList();
|
|
||||||
return fromOptionNumber.ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void SelectQuoteOnWritten(FileWrittenEventArgs e) =>
|
|
||||||
Console.WriteLine($"File: {e.File.Name} Position: {e.Position} Data: {Convert.ToBase64String(e.Data)}");
|
|
||||||
|
|
||||||
private static void SelectQuoteOnProgressed(FileProgressedEventArgs e) =>
|
|
||||||
Console.WriteLine($"File: {e.File.Name} Progress: {e.Percentage}");
|
|
||||||
|
|
||||||
private async Task OnSelectedContactChanged(Contact _selectedContact)
|
|
||||||
{
|
|
||||||
if (quote == null) return;
|
|
||||||
quote.Recipient = await genericController.GetAsync<Contact>(c => c.ContactId.Equals(_selectedContact.ContactId));
|
|
||||||
|
|
||||||
if (quote.Recipient != null)
|
|
||||||
//Read account seperatly to avoid new generation
|
|
||||||
quote.Recipient.Account = await genericController.GetAsync<Account>(a => a.AccountId.Equals(quote.Recipient.AccountId));
|
|
||||||
|
|
||||||
if (quote.LineItems != null && quote.Recipient != null && quote.Recipient.Account != null) lineItemsNotReady = false;
|
|
||||||
|
|
||||||
selectedContact = _selectedContact;
|
|
||||||
}
|
}
|
||||||
|
catch (Exception exc)
|
||||||
private async Task OnSave()
|
|
||||||
{
|
{
|
||||||
//HACK Try to avoid new generation of FKs
|
Console.WriteLine(exc.Message);
|
||||||
// quote.Recipient = new() { Account = new() };
|
|
||||||
// quote.SalesRep = new() { Account = new() };
|
|
||||||
// quote.LineItems = null;
|
|
||||||
|
|
||||||
if (await genericController.UpdateAsync(quote) > 0)
|
|
||||||
navigationManager.NavigateTo("Quotes/QuoteIndex");
|
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
private async Task OnCreateTex()
|
|
||||||
{
|
{
|
||||||
isCreatingTex = true;
|
if (quote.Recipient != null) lineItemsNotReady = false;
|
||||||
StringBuilder? tex = await QuoteHandling.CreateTexAsync(quote);
|
StateHasChanged();
|
||||||
|
|
||||||
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()
|
|
||||||
|
private async Task<List<CustomDescription>?> SuggestCustomDescriptions(LineItem lineItem)
|
||||||
|
{
|
||||||
|
//IList<CustomDescription>? fromProductNumber = await genericController.GetAllAsync<CustomDescription>(cD => cD.ProductNumber.Equals(lineItem.ProductNumber, StringComparison.Ordinal));
|
||||||
|
IList<CustomDescription>? fromOptionNumber = new List<CustomDescription>();
|
||||||
|
if (lineItem.OptionNumber != "")
|
||||||
|
fromOptionNumber = await genericController.GetAllAsync<CustomDescription>(cD => cD.OptionNumber.Equals(lineItem.OptionNumber, StringComparison.Ordinal));
|
||||||
|
//if (fromOptionNumber == null && fromProductNumber == null) return null;
|
||||||
|
//if (fromOptionNumber == null) return fromProductNumber.ToList();
|
||||||
|
//if (fromProductNumber == null) return fromOptionNumber.ToList();
|
||||||
|
//return fromProductNumber.Union(fromOptionNumber).ToList();
|
||||||
|
return fromOptionNumber.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SelectQuoteOnWritten(FileWrittenEventArgs e) =>
|
||||||
|
Console.WriteLine($"File: {e.File.Name} Position: {e.Position} Data: {Convert.ToBase64String(e.Data)}");
|
||||||
|
|
||||||
|
private static void SelectQuoteOnProgressed(FileProgressedEventArgs e) =>
|
||||||
|
Console.WriteLine($"File: {e.File.Name} Progress: {e.Percentage}");
|
||||||
|
|
||||||
|
private async Task OnSelectedContactChanged(Contact _selectedContact)
|
||||||
|
{
|
||||||
|
if (quote == null) return;
|
||||||
|
quote.Recipient = await genericController.GetAsync<Contact>(c => c.ContactId.Equals(_selectedContact.ContactId));
|
||||||
|
|
||||||
|
if (quote.Recipient != null)
|
||||||
|
//Read account seperatly to avoid new generation
|
||||||
|
quote.Recipient.Account = await genericController.GetAsync<Account>(a => a.AccountId.Equals(quote.Recipient.AccountId));
|
||||||
|
|
||||||
|
if (quote.LineItems != null && quote.Recipient != null && quote.Recipient.Account != null) lineItemsNotReady = false;
|
||||||
|
|
||||||
|
selectedContact = _selectedContact;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task OnSave()
|
||||||
|
{
|
||||||
|
//HACK Try to avoid new generation of FKs
|
||||||
|
// quote.Recipient = new() { Account = new() };
|
||||||
|
// quote.SalesRep = new() { Account = new() };
|
||||||
|
// quote.LineItems = null;
|
||||||
|
|
||||||
|
if (await genericController.UpdateAsync(quote) > 0)
|
||||||
|
navigationManager.NavigateTo("Quotes/QuoteIndex");
|
||||||
|
}
|
||||||
|
|
||||||
|
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()
|
||||||
|
{
|
||||||
|
isCreatingPdf = true;
|
||||||
|
if (await PdfService.CreatePdf(quote))
|
||||||
{
|
{
|
||||||
isCreatingPdf = true;
|
pdfNotReady = false;
|
||||||
if (await PdfService.CreatePdf(quote))
|
isCreatingPdf = false;
|
||||||
{
|
Console.WriteLine("PDF successfull written.");
|
||||||
pdfNotReady = false;
|
url = HostingService.GetPdfUrl(quote);
|
||||||
isCreatingPdf = false;
|
Console.WriteLine($"URL to PDF is {url}");
|
||||||
Console.WriteLine("PDF successfull written.");
|
|
||||||
url = HostingService.GetPdfUrl(quote);
|
|
||||||
Console.WriteLine($"URL to PDF is {url}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void OnOpenPdfApp() => PdfService.OpenPdfWithOkular(quote);
|
private void OnOpenPdfApp() => PdfService.OpenPdfWithOkular(quote);
|
||||||
|
|
||||||
private async Task OnOpenPdfNewTab() =>
|
private async Task OnOpenPdfNewTab() =>
|
||||||
await jSRuntime.InvokeVoidAsync("OpenNewTab", $"quotes/{url}");
|
await jSRuntime.InvokeVoidAsync("OpenNewTab", $"quotes/{url}");
|
||||||
|
|
||||||
private void OnDescriptionChanged(string description) => quote.Description = description;
|
private void OnDescriptionChanged(string description) => quote.Description = description;
|
||||||
|
|
||||||
private void OnQuotationNumberChanged(string quotationNumber) =>
|
private void OnQuotationNumberChanged(string quotationNumber) =>
|
||||||
quote.QuotationNumber = quotationNumber;
|
quote.QuotationNumber = quotationNumber;
|
||||||
|
|
||||||
private void OnValidForChanged(string validFor) => quote.ValidFor = byte.Parse(validFor);
|
private void OnValidForChanged(string validFor) => quote.ValidFor = byte.Parse(validFor);
|
||||||
|
|
||||||
private void OnVATChanged(string vat) => quote.Vat = float.Parse(vat);
|
private void OnVATChanged(string vat) => quote.Vat = float.Parse(vat);
|
||||||
|
|
||||||
private void OnIsPriceInformationChanged(bool isPriceInformation) =>
|
private void OnIsPriceInformationChanged(bool isPriceInformation) =>
|
||||||
quote.IsPriceInformation = isPriceInformation;
|
quote.IsPriceInformation = isPriceInformation;
|
||||||
|
|
||||||
private void OnShowBruttoChanged(bool onShowBrutto) => quote.ShowBrutto = onShowBrutto;
|
private void OnShowBruttoChanged(bool onShowBrutto) => quote.ShowBrutto = onShowBrutto;
|
||||||
|
|
||||||
private void OnShowDiscountsChanged(bool showDiscount) => quote.ShowDiscounts = showDiscount;
|
private void OnShowDiscountsChanged(bool showDiscount) => quote.ShowDiscounts = showDiscount;
|
||||||
|
|
||||||
private void OnShowSinglePricesChanged(bool showSinglePrices) =>
|
private void OnShowSinglePricesChanged(bool showSinglePrices) =>
|
||||||
quote.ShowSinglePrices = showSinglePrices;
|
quote.ShowSinglePrices = showSinglePrices;
|
||||||
|
|
||||||
private void OnSelectedLineItemChanged(LineItem _selectedLineItem) =>
|
private void OnSelectedLineItemChanged(LineItem _selectedLineItem) =>
|
||||||
selectedLineItem = _selectedLineItem;
|
selectedLineItem = _selectedLineItem;
|
||||||
|
|
||||||
private void OnWarrantyChanged(string warranty) => quote.Warranty = int.Parse(warranty);
|
private void OnWarrantyChanged(string warranty) => quote.Warranty = int.Parse(warranty);
|
||||||
|
|
||||||
private void OnCancel() => navigationManager.NavigateTo("Quotes/QuoteIndex");
|
private void OnCancel() => navigationManager.NavigateTo("Quotes/QuoteIndex");
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@ -1,16 +1,2 @@
|
|||||||
# 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
|
# 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 G7110B 29 1260 Infinity II isokratische Pumpe 1 8908 0 0 45 4899.4 4899.4 45 0 0 0 ISL100P1 Pumps
|
1 G3560A AZ Waermeleitfaehigkeitsdetektor mit EPC 1 6994 0 0 20 5595.2 5595.2 20 0 0 0 ISG100G190 GC Accessories
|
||||||
2 G7110B 001 29 HPLC System Tool Kit 1260 Infinity II 1 400 0 0 45 220 220 45 0 0 0
|
|
||||||
3 G7110B 094 29 Poroshell 120 EC-C18 3,0x150mm, 2,7um 1 1 0 0 45 0.55 0.55 45 0 0 0
|
|
||||||
4 G7116A 29 1260 Infinity II Therm. f. mehr. Saeulen 1 6494 0 0 45 3571.7 3571.7 45 0 0 0 ISL100LC1 LC Hardware
|
|
||||||
5 G7129A 29 1260 Inf. II Fluessigprobengeber 1 19905 0 0 45 10947.75 10947.75 45 0 0 0 ISL100A1 Autosamplers
|
|
||||||
6 G7129A 010 29 Standard-Schublade (6x11 Probenflaschen) 1 375 0 0 45 206.25 206.25 45 0 0 0
|
|
||||||
7 G7162A 29 1260 Infinity II Brechungsindexdetektor 1 13989 0 0 45 7693.95 7693.95 45 0 0 0 ISL100D1 Detectors
|
|
||||||
8 G7114A 29 1260 Infinity II VW-Detektor 1 9307 0 0 45 5118.85 5118.85 45 0 0 0 ISL100D1 Detectors
|
|
||||||
9 G7114A 018 29 Standarddurchflusszelle VWD 1 1612 0 0 45 886.6 886.6 45 0 0 0
|
|
||||||
10 G7850AA 29 Agilent GPC/SEC-Software 1 14789 0 0 45 8133.95 8133.95 45 0 0 0 ISL230L230 Special LC
|
|
||||||
11 PL1110-6125 BC PLgel 10um 500A 300 x 7.5 mm 2 1806 0 0 45 993.3 1986.6 45 0 0 0 CSCV27C04L GPC/SEC - PLgel
|
|
||||||
12 PL1110-6120 BC PLgel 10um 100A 300 x 7.5 mm 2 1806 0 0 45 993.3 1986.6 45 0 0 0 CSCV27C04L GPC/SEC - PLgel
|
|
||||||
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 2C9 74 Einweisung zum ersten Methodenlauf 1 1034 0 0 20 827.2 827.2 20 0 0 0 TSSTRN Training Services
|
|
||||||
15 SYS-LC-1260II 8R1 74 CrossLab Silver - 1J, kompl. 1 2688 0 0 20 2150.4 2150.4 20 0 0 0 TSSYS1 Serviced As Systems - 1 YR
|
|
||||||
|
|||||||
|
Loading…
Reference in New Issue