diff --git a/Elwig/Helpers/ClientParameters.cs b/Elwig/Helpers/ClientParameters.cs index 9eaec57..e249d95 100644 --- a/Elwig/Helpers/ClientParameters.cs +++ b/Elwig/Helpers/ClientParameters.cs @@ -56,6 +56,10 @@ namespace Elwig.Helpers { public string? EmailAddress; public string? Website; + public bool EnableMemberHistory; + public int ModeBusinessShares; + public bool HasRedWhite => ModeBusinessShares == 1; + public int ModeDeliveryNoteStats; public int ModeWineQualityStatistics; public int OrderingMemberList; @@ -112,6 +116,15 @@ namespace Elwig.Helpers { Iban = parameters.GetValueOrDefault("CLIENT_IBAN"); OrganicAuthority = parameters.GetValueOrDefault("CLIENT_ORGANIC_AUTHORITY"); + EnableMemberHistory = (parameters.GetValueOrDefault("ENABLE_MEMBERHISTORY")?.ToUpper()) switch { + "1" or "TRUE" or "YES" or "JA" => true, + _ => false, + }; + + switch (parameters.GetValueOrDefault("MODE_BUSINESSSHARES", "SIMPLE")?.ToUpper()) { + case "SIMPLE": ModeBusinessShares = 0; break; + case "RED_WHITE": ModeBusinessShares = 1; break; + } switch (parameters.GetValueOrDefault("MODE_DELIVERYNOTE_STATS", "SHORT")?.ToUpper()) { case "NONE": ModeDeliveryNoteStats = 0; break; case "GA_ONLY": ModeDeliveryNoteStats = 1; break; @@ -189,6 +202,11 @@ namespace Elwig.Helpers { } private IEnumerable<(string, string?)> GetParamValues() { + string businessShares = "SIMPLE"; + switch (ModeBusinessShares) { + case 0: businessShares = "SIMPLE"; break; + case 1: businessShares = "RED_WHITE"; break; + } string deliveryNoteStats = "SHORT"; switch (ModeDeliveryNoteStats) { case 0: deliveryNoteStats = "NONE"; break; @@ -256,6 +274,8 @@ namespace Elwig.Helpers { ("CLIENT_BIC", Bic), ("CLIENT_IBAN", Iban), ("CLIENT_ORGANIC_AUTHORITY", OrganicAuthority), + ("ENABLE_MEMBERHISTORY", EnableMemberHistory ? "YES" : "NO"), + ("MODE_BUSINESSSHARES", businessShares), ("MODE_DELIVERYNOTE_STATS", deliveryNoteStats), ("MODE_WINEQUALITYSTATISTICS", modeWineQualityStatistics), ("ORDERING_MEMBERLIST", orderingMemberList), diff --git a/Elwig/Models/Dtos/OverUnderDeliveryData.cs b/Elwig/Models/Dtos/OverUnderDeliveryData.cs index cc0240d..2c1ad9e 100644 --- a/Elwig/Models/Dtos/OverUnderDeliveryData.cs +++ b/Elwig/Models/Dtos/OverUnderDeliveryData.cs @@ -53,11 +53,11 @@ namespace Elwig.Models.Dtos { } public OverUnderDeliveryData(IEnumerable rows, int year, string mode) : - base($"Über-Unterlieferungen", $"Über- und Unterlieferungen laut gezeichneten Geschäftsanteilen {(mode == "R" ? "rot" : "weiß")} {year}", rows, + base($"Über-Unterlieferungen-{(mode == "R" ? "rot" : "weiß")}", $"Über- und Unterlieferungen laut gezeichneten Geschäftsanteilen {(mode == "R" ? "rot" : "weiß")} {year}", rows, mode == "R" ? FieldNamesRed : FieldNamesWhite) { } - public static async Task ForSeason(DbSet table, int year) { + public static async Task<(OverUnderDeliveryData Total, OverUnderDeliveryData Red, OverUnderDeliveryData White)> ForSeason(DbSet table, int year) { var rows = await table.FromSql($""" SELECT m.mgnr, m.name AS name_1, COALESCE(m.prefix || ' ', '') || m.given_name || @@ -80,7 +80,7 @@ namespace Elwig.Models.Dtos { WHERE s.year = {year} AND (m.active = TRUE OR d.weight_total > 0) ORDER BY 100.0 * weight_total / (max_kg + max_kg_red + max_kg_white), m.mgnr """).ToListAsync(); - return new OverUnderDeliveryData(rows, year); + return (new OverUnderDeliveryData(rows, year), new OverUnderDeliveryData(rows, year, "R"), new OverUnderDeliveryData(rows, year, "W")); } } diff --git a/Elwig/Services/MemberService.cs b/Elwig/Services/MemberService.cs index cca978b..4275151 100644 --- a/Elwig/Services/MemberService.cs +++ b/Elwig/Services/MemberService.cs @@ -126,7 +126,15 @@ namespace Elwig.Services { vm.EntryDate = (m.EntryDateString != null) ? string.Join(".", m.EntryDateString.Split("-").Reverse()) : null; vm.ExitDate = (m.ExitDateString != null) ? string.Join(".", m.ExitDateString.Split("-").Reverse()) : null; - vm.BusinessShares = m.Shares; + if (App.Client.HasRedWhite) { + vm.BusinessShares1 = m.SharesRed; + vm.BusinessShares2 = m.SharesWhite; + vm.BusinessShares3 = m.SharesDormant + m.Shares; + } else { + vm.BusinessShares1 = m.Shares; + vm.BusinessShares2 = m.SharesDormant + m.SharesRed + m.SharesWhite; + vm.BusinessShares3 = 0; + } vm.AccountingNr = m.AccountingNr; vm.Branch = (Branch?)ControlUtils.GetItemFromSourceWithPk(vm.BranchSource, m.ZwstId); vm.DefaultKg = (AT_Kg?)ControlUtils.GetItemFromSourceWithPk(vm.DefaultKgSource, m.DefaultKgNr); @@ -549,7 +557,10 @@ namespace Elwig.Services { EntryDateString = string.IsNullOrEmpty(vm.EntryDate) ? null : string.Join("-", vm.EntryDate.Split(".").Reverse()), ExitDateString = string.IsNullOrEmpty(vm.ExitDate) ? null : string.Join("-", vm.ExitDate.Split(".").Reverse()), - Shares = (int)vm.BusinessShares!, + Shares = App.Client.HasRedWhite ? 0 : vm.BusinessShares1 ?? 0, + SharesRed = App.Client.HasRedWhite ? vm.BusinessShares1 ?? 0 : 0, + SharesWhite = App.Client.HasRedWhite ? vm.BusinessShares2 ?? 0 : 0, + SharesDormant = App.Client.HasRedWhite ? vm.BusinessShares3 ?? 0 : vm.BusinessShares2 ?? 0, AccountingNr = string.IsNullOrEmpty(vm.AccountingNr) ? null : vm.AccountingNr, IsActive = vm.IsActive, IsVollLieferant = vm.IsVollLieferant, diff --git a/Elwig/ViewModels/MemberAdminViewModel.cs b/Elwig/ViewModels/MemberAdminViewModel.cs index 4fffc85..54f4bc7 100644 --- a/Elwig/ViewModels/MemberAdminViewModel.cs +++ b/Elwig/ViewModels/MemberAdminViewModel.cs @@ -124,10 +124,22 @@ namespace Elwig.ViewModels { [ObservableProperty] private string? _exitDate; [ObservableProperty] - private string? _businessSharesString; - public int? BusinessShares { - get => int.TryParse(BusinessSharesString, out var shares) ? shares : null; - set => BusinessSharesString = $"{value}"; + private string? _businessShares1String; + public int? BusinessShares1 { + get => int.TryParse(BusinessShares1String, out var shares) ? shares : null; + set => BusinessShares1String = $"{value}"; + } + [ObservableProperty] + private string? _businessShares2String; + public int? BusinessShares2 { + get => int.TryParse(BusinessShares2String, out var shares) ? shares : null; + set => BusinessShares2String = $"{value}"; + } + [ObservableProperty] + private string? _businessShares3String; + public int? BusinessShares3 { + get => int.TryParse(BusinessShares3String, out var shares) ? shares : null; + set => BusinessShares3String = $"{value}"; } [ObservableProperty] private string? _accountingNr; diff --git a/Elwig/Windows/BaseDataWindow.xaml b/Elwig/Windows/BaseDataWindow.xaml index 057dea6..43ad785 100644 --- a/Elwig/Windows/BaseDataWindow.xaml +++ b/Elwig/Windows/BaseDataWindow.xaml @@ -541,6 +541,20 @@ + + + + 0) s.VatFlatrate = double.Parse(SeasonVatFlatrateInput.Text) / 100; - if (SeasonMinKgPerShareInput.Text.Length > 0) - s.MinKgPerShare = int.Parse(SeasonMinKgPerShareInput.Text); - if (SeasonMaxKgPerShareInput.Text.Length > 0) - s.MaxKgPerShare = int.Parse(SeasonMaxKgPerShareInput.Text); + if (ParameterBusinessShareModeInput.SelectedIndex == 0) { + s.MinKgPerShare = (SeasonMinKgPerShareInput.Text.Length > 0) ? int.Parse(SeasonMinKgPerShareInput.Text) : null; + s.MaxKgPerShare = (SeasonMaxKgPerShareInput.Text.Length > 0) ? int.Parse(SeasonMaxKgPerShareInput.Text) : null; + s.MinKgPerShareRed = null; + s.MaxKgPerShareRed = null; + s.MinKgPerShareWhite = null; + s.MaxKgPerShareWhite = null; + } else { + s.MinKgPerShare = null; + s.MaxKgPerShare = null; + s.MinKgPerShareRed = (SeasonMinKgPerShareInput.Text.Length > 0) ? int.Parse(SeasonMinKgPerShareInput.Text) : null; + s.MaxKgPerShareRed = (SeasonMaxKgPerShareInput.Text.Length > 0) ? int.Parse(SeasonMaxKgPerShareInput.Text) : null; + s.MinKgPerShareWhite = s.MinKgPerShareRed; + s.MaxKgPerShareWhite = s.MaxKgPerShareRed; + } + s.PenaltyPerKg = (SeasonPenaltyPerKgInput.Text.Length > 0) ? decimal.Parse(SeasonPenaltyPerKgInput.Text) : null; s.PenaltyAmount = (SeasonPenaltyInput.Text.Length > 0) ? decimal.Parse(SeasonPenaltyInput.Text) : null; s.PenaltyNone = (SeasonPenaltyNoneInput.Text.Length > 0) ? decimal.Parse(SeasonPenaltyNoneInput.Text) : null; @@ -160,8 +172,8 @@ namespace Elwig.Windows { MaxKgPerHa = s?.MaxKgPerHa ?? 10000, VatNormal = s?.VatNormal ?? 0.10, VatFlatrate = s?.VatFlatrate ?? 0.13, - MinKgPerShare = s?.MinKgPerShare ?? 500, - MaxKgPerShare = s?.MaxKgPerShare ?? 1000, + MinKgPerShare = s?.MinKgPerShare, + MaxKgPerShare = s?.MaxKgPerShare, PenaltyPerKgValue = s?.PenaltyPerKgValue, PenaltyAmoutValue = s?.PenaltyAmoutValue, PenaltyNoneValue = s?.PenaltyNoneValue, @@ -181,6 +193,7 @@ namespace Elwig.Windows { AbsValue = m.AbsValue * mult / div, RelValue = m.RelValue, IsActive = m.IsActive, + IsRedacted = m.IsRedacted, })); } await ctx.SaveChangesAsync(); diff --git a/Elwig/Windows/BaseDataWindow.xaml.cs b/Elwig/Windows/BaseDataWindow.xaml.cs index b44d246..0a3c61e 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.cs @@ -40,6 +40,7 @@ namespace Elwig.Windows { WineAttributeFillLowerInput.Visibility = Visibility.Hidden; WineAttributeFillLowerLabel.Visibility = Visibility.Hidden; ParameterAreaComGroup.Header = ParameterAreaComGroup.Header.ToString()!.Split('(')[0] + $"({Utils.CurrentLastSeason})"; + LockInputs(); } protected override void ShortcutNew() { } @@ -92,12 +93,6 @@ namespace Elwig.Windows { SeasonModifierNameInput.IsReadOnly = true; SeasonModifierRelInput.IsReadOnly = true; SeasonModifierAbsInput.IsReadOnly = true; - - ParameterAllowAttrIntoLowerInput.IsEnabled = false; - ParameterAvoidUnderDeliveriesInput.IsEnabled = false; - ParameterHonorGebundenInput.IsEnabled = false; - ParameterExportEbicsVersion.IsEnabled = false; - ParameterExportEbicsAddress.IsEnabled = false; } new protected void UnlockInputs() { @@ -146,12 +141,6 @@ namespace Elwig.Windows { SeasonModifierNameInput.IsReadOnly = false; SeasonModifierRelInput.IsReadOnly = false; SeasonModifierAbsInput.IsReadOnly = false; - - ParameterAllowAttrIntoLowerInput.IsEnabled = true; - ParameterAvoidUnderDeliveriesInput.IsEnabled = true; - ParameterHonorGebundenInput.IsEnabled = true; - ParameterExportEbicsVersion.IsEnabled = true; - ParameterExportEbicsAddress.IsEnabled = true; } protected override async Task OnRenewContext(AppDbContext ctx) { @@ -359,6 +348,8 @@ namespace Elwig.Windows { TextElementDeliveryConfirmation.Text = p.TextDeliveryConfirmation; TextElementCreditNote.Text = p.TextCreditNote; + ParameterBusinessShareModeInput.SelectedIndex = p.ModeBusinessShares; + ParameterBusinessShareHistoryInput.IsChecked = p.EnableMemberHistory; ParameterAllowAttrIntoLowerInput.IsChecked = s?.Billing_AllowAttrsIntoLower ?? false; ParameterAvoidUnderDeliveriesInput.IsChecked = s?.Billing_AvoidUnderDeliveries ?? false; ParameterHonorGebundenInput.IsChecked = s?.Billing_HonorGebunden ?? false; @@ -387,6 +378,8 @@ namespace Elwig.Windows { p.EmailAddress = string.IsNullOrEmpty(ClientEmailAddressInput.Text) ? null : ClientEmailAddressInput.Text; p.Website = string.IsNullOrEmpty(ClientWebsiteInput.Text) ? null : ClientWebsiteInput.Text; + p.ModeBusinessShares = ParameterBusinessShareModeInput.SelectedIndex; + p.EnableMemberHistory = ParameterBusinessShareHistoryInput.IsChecked ?? false; p.TextDeliveryNote = string.IsNullOrEmpty(TextElementDeliveryNote.Text) ? null : TextElementDeliveryNote.Text; p.ModeDeliveryNoteStats = (ModeDeliveryNoteNone.IsChecked == true) ? 0 : (ModeDeliveryNoteGaOnly.IsChecked == true) ? 1 : (ModeDeliveryNoteShort.IsChecked == true) ? 2 : (ModeDeliveryNoteFull.IsChecked == true) ? 3 : 2; p.TextDeliveryConfirmation = string.IsNullOrEmpty(TextElementDeliveryConfirmation.Text) ? null : TextElementDeliveryConfirmation.Text; diff --git a/Elwig/Windows/MainWindow.xaml.cs b/Elwig/Windows/MainWindow.xaml.cs index b87633b..c6138c1 100644 --- a/Elwig/Windows/MainWindow.xaml.cs +++ b/Elwig/Windows/MainWindow.xaml.cs @@ -460,7 +460,12 @@ namespace Elwig.Windows { var tbl1 = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, year); var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year); using var ods = new OdsFile(filename); - await ods.AddTable(tbl1); + if (App.Client.HasRedWhite) { + await ods.AddTable(tbl1.Red); + await ods.AddTable(tbl1.White); + } else { + await ods.AddTable(tbl1.Total); + } await ods.AddTable(tbl2); } catch (Exception exc) { InteractionService.ShowException(exc); diff --git a/Elwig/Windows/MemberAdminWindow.xaml b/Elwig/Windows/MemberAdminWindow.xaml index fe96dda..007eac2 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml +++ b/Elwig/Windows/MemberAdminWindow.xaml @@ -619,9 +619,16 @@ Margin="0,40,10,0" Width="78" Grid.Column="1" HorizontalAlignment="Left" TextAlignment="Right" TextChanged="DateInput_TextChanged" LostFocus="DateInput_LostFocus"/> -