Gremlin/Gremlin_BlazorServer/Pages/Quotes/QuoteAdd.razor.cs

263 lines
11 KiB
C#

using System.Diagnostics;
using System.Globalization;
using System.Security.Claims;
using System.Text;
using Blazorise;
using Gremlin_BlazorServer.Data.EntityClasses;
using Gremlin_BlazorServer.Services;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.JSInterop;
namespace Gremlin_BlazorServer.Pages.Quotes;
public partial class QuoteAdd
{
[CascadingParameter] private Task<AuthenticationState>? AuthenticationStateTask { get; set; }
[Inject] public IModalService? ModalService { get; set; }
private IList<Contact>? contacts;
private Quote? quote;
private Contact? selectedContact;
private readonly CultureInfo cultureInfo = new("de-DE");
private bool pdfNotReady = true;
private bool isCreatingPdf;
private bool texNotReady = true;
private bool isCreatingTex;
private bool lineItemsNotReady = true;
private string? url;
private readonly bool debug;
private List<CustomDescription>? suggestedCustomDescriptions;
private CustomDescription? newCustomDescription;
private LineItem? selectedLineItem;
public Task ShowCustomDescriptionModal() =>
ModalService.Show<CustomDescriptionModal>(builder =>
{
builder.Add(parameter => parameter.CustomDescription, newCustomDescription);
builder.Add(parameter => parameter.SuggestedCustomDescriptions, suggestedCustomDescriptions);
});
protected override async Task OnParametersSetAsync()
{
if (AuthenticationStateTask != null)
{
ClaimsPrincipal user = (await AuthenticationStateTask).User;
if (user.Identity is { IsAuthenticated: true })
{
await ApplicationLoadingIndicatorService.Show();
contacts = await genericController.GetAllAsync<Contact>();
await ApplicationLoadingIndicatorService.Hide();
quote = await GenerateNewQuote(quote, "Woitschetzki");
}
}
await base.OnInitializedAsync();
}
private async Task<Quote> GenerateNewQuote(Quote? _quote, string salesRepLastName)
{
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
{
"Woitschetzki" => $"DE-83PE89-{DateTime.Now:My}-{_quote.QuoteId}",
"Welsch" => $"DE-83RE32-{DateTime.Now:My}-{_quote.QuoteId}",
_ => $"DE-XXYYXX-{DateTime.Now:My}-{_quote.QuoteId}"
}
: $"DE-XXYYXX-{DateTime.Now:My}-{_quote.QuoteId}";
_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
{
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++)
{
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()
{
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;
}
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))
{
pdfNotReady = false;
isCreatingPdf = false;
Console.WriteLine("PDF successfull written.");
url = HostingService.GetPdfUrl(quote);
Console.WriteLine($"URL to PDF is {url}");
}
}
private void OnOpenPdfApp() => PdfService.OpenPdfWithOkular(quote);
private async Task OnOpenPdfNewTab() =>
await jSRuntime.InvokeVoidAsync("OpenNewTab", $"quotes/{url}");
private void OnDescriptionChanged(string description) => quote.Description = description;
private void OnQuotationNumberChanged(string quotationNumber) =>
quote.QuotationNumber = quotationNumber;
private void OnValidForChanged(string validFor) => quote.ValidFor = byte.Parse(validFor);
private void OnVATChanged(string vat) => quote.Vat = float.Parse(vat);
private void OnIsPriceInformationChanged(bool isPriceInformation) =>
quote.IsPriceInformation = isPriceInformation;
private void OnShowBruttoChanged(bool onShowBrutto) => quote.ShowBrutto = onShowBrutto;
private void OnShowDiscountsChanged(bool showDiscount) => quote.ShowDiscounts = showDiscount;
private void OnShowSinglePricesChanged(bool showSinglePrices) =>
quote.ShowSinglePrices = showSinglePrices;
private void OnSelectedLineItemChanged(LineItem _selectedLineItem) =>
selectedLineItem = _selectedLineItem;
private void OnWarrantyChanged(string warranty) => quote.Warranty = int.Parse(warranty);
private void OnCancel() => navigationManager.NavigateTo("Quotes/QuoteIndex");
}