QuoteDebug

pull/1/head
Sascha Woitschetzki 2023-06-23 15:48:04 +07:00
parent 2b9a3ae16b
commit 1393e45fd4
10 changed files with 250 additions and 30 deletions

@ -108,7 +108,7 @@ public class QuoteConfiguration : IEntityTypeConfiguration<Quote> {
// quoteEntity.HasOne(e => e.Recipient).WithMany(c => c.Quotes).HasForeignKey(fk => fk.RecipientId);
// quoteEntity.HasOne(e => e.SalesRep).WithMany(sR => sR.Quotes).HasForeignKey(fk => fk.SalesRepId);
// quoteEntity.HasMany(d => d.LineItems).WithOne(p => p.Quote).HasForeignKey(fk => fk.QuoteId);
quoteEntity.HasMany(q => q.LineItems).WithOne(lI => lI.Quote).HasForeignKey(fk => fk.QuoteId);
quoteEntity.Property(e => e.QuotationNumber).HasColumnType("VARCHAR(255)").ValueGeneratedOnAdd();
quoteEntity.Property(e => e.QuotationDate).ValueGeneratedOnAdd();
@ -138,7 +138,7 @@ public class LineItemConfiguration : IEntityTypeConfiguration<LineItem> {
public void Configure(EntityTypeBuilder<LineItem> lineItemEntity) {
lineItemEntity.HasKey(e => e.LineItemId);
// lineItemEntity.HasOne(p => p.Quote).WithMany(d => d.LineItems).HasForeignKey(fk => fk.QuoteId);
lineItemEntity.HasOne(p => p.Quote).WithMany(d => d.LineItems).HasForeignKey(fk => fk.QuoteId);
// lineItemEntity.HasOne(lI => lI.CustomDescription).WithMany(d => d.LineItems).HasForeignKey(fk => fk.CustomDescriptionId);
// lineItemEntity.HasOne(lI => lI.Product).WithMany(p => p.LineItems).HasForeignKey(fK => fK.LineItemId);

@ -5,12 +5,12 @@ public class LineItem : IMetadata {
public uint LineItemId { get; set; }
//foreign keys:
// public uint QuoteId { get; set; }
public uint QuoteId { get; set; }
// public uint? ProductId { get; set; }
public uint CustomDescriptionId { get; set; }
//navigation properties:
// public Quote? Quote { get; set; }
public Quote Quote { get; set; }
// public Product? Product { get; set; }
// public CustomDescription? CustomDescription { get; set; }
@ -41,4 +41,10 @@ public class LineItem : IMetadata {
public DateTime DataValidUntil { get; set; } = DateTime.MaxValue;
public string? DataVersionComment { get; set; }
public uint DataVersionNumber { get; set; }
//Constructor
public LineItem(Quote quote) {
QuoteId = quote.QuoteId;
Quote = quote;
}
}

@ -8,14 +8,13 @@ public class Quote : IMetadata {
//foreign keys:
public uint RecipientId { get; set; }
public uint SalesRepId { get; set; }
// public uint ProductId { get; set; }
//navigation properties:
public Contact? Recipient { get; set; }
public SalesRep? SalesRep { get; set; }
public IList<LineItem>? LineItems { get; set; }
public IList<LineItem> LineItems { get; set; } = new List<LineItem>();
//class properties:
public string? QuotationNumber { get; set; }

@ -12,7 +12,7 @@ public partial class LineItems {
private readonly CultureInfo cultureInfo = new("de-DE");
private readonly IList<LineItem> lineItems=new List<LineItem>();
private LineItem selectedLineItem = new();
private LineItem? selectedLineItem;
[CascadingParameter] private Task<AuthenticationState>? AuthenticationStateTask { get; set; }
protected override async Task OnInitializedAsync() {

@ -2,7 +2,6 @@
@using Gremlin_BlazorServer.Services
@using Gremlin_BlazorServer.Data.EntityClasses
@inject GenericController GenericController
@inject ILoadingIndicatorService ApplicationLoadingIndicatorService
<AuthorizeView>

@ -1,12 +1,177 @@
@page "/QuoteDebug"
@using Gremlin_BlazorServer.Services
@using System.Globalization
@using Gremlin_BlazorServer.Data.EntityClasses
@inject NavigationManager NavigationManager
<AuthorizeView>
<Authorized>
@if (debug) {
<Button Color="Color.Success" Clicked="@OnSave">Save</Button>
}
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">Quote Debug</Heading>
<Paragraph>
@if (debug) {
<Button Color="Color.Success" Clicked="@OnSave">Save</Button>
}
</Paragraph>
</Div>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">Quote Details</Heading>
<Paragraph>
<Row>
<Column ColumnSize="ColumnSize.Is4">
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsname</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Description" TextChanged="@OnDescriptionChanged"/>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsnummer</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.QuotationNumber" TextChanged="@OnQuotationNumberChanged"/>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotspfad</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.Path"/>"
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Gewährleistung (Monate)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Warranty.ToString()" TextChanged="@OnWarrantyChanged"/>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Angebotsgültigkeit (Tage)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.ValidFor.ToString()" TextChanged="@OnValidForChanged"/>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer (%)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Vat.ToString(CultureInfo.CurrentCulture)" TextChanged="@OnVATChanged"/>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten (%)</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit Text="@quote.Freight.ToString(CultureInfo.CurrentCulture)"/>
</FieldBody>
</Field>
</Column>
@if (quote.Recipient is not null) {
<Column ColumnSize="ColumnSize.Is3">
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">FirstName</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.FirstName</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">LastName</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.LastName</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">AccountName</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.Account.AccountName</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Street</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.Account.Street</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">Zip</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.Account.Zip.ToString()</FieldBody>
</Field>
<Field >
<FieldLabel ColumnSize="ColumnSize.Is4">City</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">@quote.Recipient.Account.City</FieldBody>
</Field>
</Column>
}
<Column ColumnSize="ColumnSize.Is2">
<Check TValue="bool" Checked="@quote.IsPriceInformation" CheckedChanged="@OnIsPriceInformationChanged">Preisinformation</Check>
<Check TValue="bool" Checked="@quote.ShowBrutto" CheckedChanged="@OnShowBruttoChanged">Bruttopreise anzeigen</Check>
<Check TValue="bool" Checked="@quote.ShowSinglePrices" CheckedChanged="@OnShowSinglePricesChanged">Einzelpreise ausweisen</Check>
<Check TValue="bool" Checked="@quote.ShowDiscounts" CheckedChanged="@OnShowDiscountsChanged">Discounts ausweisen</Check>
</Column>
<Column ColumnSize="ColumnSize.Is3">
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Listenpreis netto</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalListprice.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Summe netto</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalNet.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Versandkosten</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalFreightOnly.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme netto</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalFreight.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Mehrwertsteuer</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalVat.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
<Field>
<FieldLabel ColumnSize="ColumnSize.Is4">Gesamtsumme brutto</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is6">
<TextEdit ReadOnly Text="@quote.TotalGross.ToString("C", CultureInfo.CurrentCulture)"></TextEdit>
</FieldBody>
</Field>
</Column>
</Row>
</Paragraph>
</Div>
<Div Margin="Margin.Is3"
Border="Border.Dark.OnAll"
Padding="Padding.Is3"
style="box-shadow: 10px 10px #343A40">
<Heading Size="HeadingSize.Is5">LineItems</Heading>
<Paragraph>
<DataGrid TItem="LineItem"
Data="@quote.LineItems"
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.OptionNumber)" Caption="OptionNumber"/>
<DataGridColumn Field="@nameof(LineItem.SapShortDescription)" Caption="SapShortDescription"/>
<DataGridColumn Field="@nameof(LineItem.CustomDescriptionId)" Caption="CustomDescriptionId"/>
<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>
</Paragraph>
</Div>
</Authorized>
<NotAuthorized>
@ -19,14 +184,4 @@
<Paragraph>You're not signed in. Please click on the upper right to either register or log in.</Paragraph>
</Div>
</NotAuthorized>
</AuthorizeView>
@code {
private const bool debug = true;
private Quote quote = new();
private async Task OnSave() {
if (await GenericController.InsertAsync(quote) > 0)
NavigationManager.NavigateTo("Quotes/QuoteIndex");
}
}
</AuthorizeView>

@ -0,0 +1,54 @@
using System.Diagnostics;
using System.Globalization;
using System.Security.Claims;
using Gremlin_BlazorServer.Data.EntityClasses;
using Gremlin_BlazorServer.Services;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
namespace Gremlin_BlazorServer.Pages;
public partial class QuoteDebug {
[CascadingParameter] private Task<AuthenticationState>? AuthenticationStateTask { get; set; }
private const bool debug = true;
private readonly CultureInfo cultureInfo = new("de-DE");
private readonly Quote quote = new(){
Recipient = GenericController.Get<Contact>(c => c.ContactId == 1),
SalesRep = GenericController.Get<SalesRep>(sR => sR.SalesRepId == 15),
};
private LineItem? selectedLineItem;
protected override async Task OnParametersSetAsync() {
if (AuthenticationStateTask is not null) {
ClaimsPrincipal user = (await AuthenticationStateTask).User;
if (user.Identity is { IsAuthenticated: true })
quote.LineItems.Add(new(quote));
}
await base.OnInitializedAsync();
}
private async Task OnSave() => Debug.WriteLine(await GenericController.InsertAsync(quote) > 0 ? "Wrote Quote to db." : "Error on writing Quote to db!");
private Task OnDescriptionChanged() => throw new NotImplementedException();
private Task OnQuotationNumberChanged() => throw new NotImplementedException();
private Task OnWarrantyChanged() => throw new NotImplementedException();
private Task OnValidForChanged() => throw new NotImplementedException();
private Task OnVATChanged() => throw new NotImplementedException();
private Task OnIsPriceInformationChanged() => throw new NotImplementedException();
private Task OnShowBruttoChanged() => throw new NotImplementedException();
private Task OnShowSinglePricesChanged() => throw new NotImplementedException();
private Task OnShowDiscountsChanged() => throw new NotImplementedException();
private Task OnSelectedLineItemChanged() => throw new NotImplementedException();
}

@ -26,7 +26,7 @@ public partial class QuoteAdd {
private Quote quote = new();
private Contact recipient = new();
private SalesRep salesRep = new();
private LineItem selectedLineItem = new();
private LineItem? selectedLineItem;
// private List<CustomDescription>? suggestedCustomDescriptions;
private bool texNotReady = true;

@ -22,7 +22,7 @@ public class QuoteHandling {
try {
quote = ResetTotals(quote);
quote.LineItems = ReadLineItemsFromClipboard(clipboard);
quote.LineItems = ReadLineItemsFromClipboard(quote, clipboard);
quote.QuoteContains3Pp = DoesContains(quote, "3PP");
quote.QuoteContainsRb = DoesContains(quote, "RB");
@ -53,15 +53,15 @@ public class QuoteHandling {
}
}
private static List<LineItem> ReadLineItemsFromClipboard(string clipboard) {
private static List<LineItem> ReadLineItemsFromClipboard(Quote quote, string clipboard) {
//Zeilen aufteilen
IEnumerable<string> clipboardLines = clipboard.Split(Environment.NewLine.ToCharArray());
List<string[]> clipboardList = (from clipboardLine in clipboardLines where clipboardLine != "" select clipboardLine.Split('\t')).ToList();
List<LineItem> lineItems = ParseClipboardList(clipboardList).Result;
List<LineItem> lineItems = ParseClipboardList(quote, clipboardList).Result;
return lineItems;
}
private static Task<List<LineItem>> ParseClipboardList(List<string[]> lineItemStrings) {
private static Task<List<LineItem>> ParseClipboardList(Quote quote, List<string[]> lineItemStrings) {
List<LineItem> lineItems = new();
CultureInfo cultureInfoUs = new("en-US");
@ -73,7 +73,7 @@ public class QuoteHandling {
if (lineItemString[0] == "#") continue;
//Dateiinhalt in Klasse schreiben
LineItem lineItem = new() {
LineItem lineItem = new(quote) {
Position = ushort.Parse(lineItemString[0]),
ProductNumber = lineItemString[1],
OptionNumber = lineItemString[2],

@ -87,6 +87,13 @@
LineItems
</BarLink>
</BarItem>
<BarItem>
<BarLink To="/QuoteDebug">
<BarIcon IconName="IconName.Laptop"/>
QuoteDebug
</BarLink>
</BarItem>
</BarStart>
</BarMenu>