[#20][#80] Elwig: Update member_history and add different types of shares
Test / Run tests (push) Successful in 3m7s
Test / Run tests (push) Successful in 3m7s
This commit is contained in:
@@ -453,13 +453,13 @@
|
||||
HorizontalAlignment="Left"/>
|
||||
|
||||
<Label Content="Lieferpflicht/-recht:" Margin="10,10,0,10" Grid.Column="2"/>
|
||||
<ctrl:UnitTextBox x:Name="SeasonMinKgPerBsInput" Unit="kg/GA" TextChanged="SeasonMinMaxKgInput_TextChanged"
|
||||
<ctrl:UnitTextBox x:Name="SeasonMinKgPerShareInput" Unit="kg/GA" TextChanged="SeasonMinMaxKgInput_TextChanged"
|
||||
Grid.Column="3" Width="80" Margin="0,10,10,10" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||
<ctrl:UnitTextBox x:Name="SeasonMaxKgPerBsInput" Unit="kg/GA" TextChanged="SeasonMinMaxKgInput_TextChanged"
|
||||
<ctrl:UnitTextBox x:Name="SeasonMaxKgPerShareInput" Unit="kg/GA" TextChanged="SeasonMinMaxKgInput_TextChanged"
|
||||
Grid.Column="3" Width="80" Margin="85,10,10,10" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||
|
||||
<Label Content="GA-Wert (Nachz.):" Margin="10,40,0,10" Grid.Column="2"/>
|
||||
<ctrl:UnitTextBox x:Name="SeasonBsValueInput" Unit="€/GA" TextChanged="SeasonPenaltyInput_TextChanged"
|
||||
<ctrl:UnitTextBox x:Name="SeasonShareValueInput" Unit="€/GA" TextChanged="SeasonPenaltyInput_TextChanged"
|
||||
Grid.Column="3" Width="85" Margin="0,40,10,10" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||
|
||||
<GroupBox Header="Strafen bei Unterlieferung lt. GA" Grid.Column="2" Grid.ColumnSpan="2" Margin="0,70,10,0">
|
||||
@@ -468,13 +468,13 @@
|
||||
Width="80" Margin="65,10,10,10" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||
<ctrl:UnitTextBox x:Name="SeasonPenaltyInput" Unit="€" TextChanged="SeasonPenaltyInput_TextChanged"
|
||||
Width="68" Margin="150,10,10,10" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||
<ctrl:UnitTextBox x:Name="SeasonPenaltyPerBsInput" Unit="€/GA" TextChanged="SeasonPenaltyPerBsInput_TextChanged"
|
||||
<ctrl:UnitTextBox x:Name="SeasonPenaltyPerShareInput" Unit="€/GA" TextChanged="SeasonPenaltyPerShareInput_TextChanged"
|
||||
Width="100" Margin="222,10,10,10" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||
|
||||
<Label Content="Zzgl. bei Nicht-Lieferung:" Margin="10,40,0,10"/>
|
||||
<ctrl:UnitTextBox x:Name="SeasonPenaltyNoneInput" Unit="€" TextChanged="SeasonPenaltyInput_TextChanged"
|
||||
Width="68" Margin="150,40,10,10" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||
<ctrl:UnitTextBox x:Name="SeasonPenaltyPerBsNoneInput" Unit="€/GA" TextChanged="SeasonPenaltyPerBsInput_TextChanged"
|
||||
<ctrl:UnitTextBox x:Name="SeasonPenaltyPerShareNoneInput" Unit="€/GA" TextChanged="SeasonPenaltyPerShareInput_TextChanged"
|
||||
Width="100" Margin="222,40,10,10" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
@@ -47,23 +47,23 @@ namespace Elwig.Windows {
|
||||
SeasonVatFlatrateInput.Text = (s.VatFlatrate * 100).ToString();
|
||||
SeasonStartInput.Text = $"{s.StartDate:dd.MM.yyyy}";
|
||||
SeasonEndInput.Text = $"{s.EndDate:dd.MM.yyyy}";
|
||||
SeasonMinKgPerBsInput.Text = s.MinKgPerBusinessShare.ToString();
|
||||
SeasonMaxKgPerBsInput.Text = s.MaxKgPerBusinessShare.ToString();
|
||||
SeasonMinKgPerShareInput.Text = s.MinKgPerShare.ToString();
|
||||
SeasonMaxKgPerShareInput.Text = s.MaxKgPerShare.ToString();
|
||||
SeasonPenaltyPerKgInput.Text = s.PenaltyPerKg?.ToString() ?? "";
|
||||
SeasonPenaltyInput.Text = s.PenaltyAmount?.ToString() ?? "";
|
||||
SeasonPenaltyNoneInput.Text = s.PenaltyNone?.ToString() ?? "";
|
||||
SeasonPenaltyPerBsInput.Text = s.PenaltyPerBsAmount?.ToString() ?? "";
|
||||
SeasonPenaltyPerBsNoneInput.Text = s.PenaltyPerBsNone?.ToString() ?? "";
|
||||
SeasonBsValueInput.Text = s.BusinessShareValue?.ToString() ?? "";
|
||||
SeasonPenaltyPerShareInput.Text = s.PenaltyPerShareAmount?.ToString() ?? "";
|
||||
SeasonPenaltyPerShareNoneInput.Text = s.PenaltyPerShareNone?.ToString() ?? "";
|
||||
SeasonShareValueInput.Text = s.BusinessShareValue?.ToString() ?? "";
|
||||
|
||||
var sym = s.Currency.Symbol ?? s.Currency.Code;
|
||||
SeasonModifierAbsInput.Unit = $"{sym}/kg";
|
||||
SeasonPenaltyPerKgInput.Unit = $"{sym}/kg";
|
||||
SeasonPenaltyInput.Unit = sym;
|
||||
SeasonPenaltyNoneInput.Unit = sym;
|
||||
SeasonPenaltyPerBsInput.Unit = $"{sym}/GA";
|
||||
SeasonPenaltyPerBsNoneInput.Unit = $"{sym}/GA";
|
||||
SeasonBsValueInput.Unit = $"{sym}/GA";
|
||||
SeasonPenaltyPerShareInput.Unit = $"{sym}/GA";
|
||||
SeasonPenaltyPerShareNoneInput.Unit = $"{sym}/GA";
|
||||
SeasonShareValueInput.Unit = $"{sym}/GA";
|
||||
AreaCommitmentTypePenaltyPerKgInput.Unit = $"{sym}/kg";
|
||||
AreaCommitmentTypePenaltyInput.Unit = sym;
|
||||
AreaCommitmentTypePenaltyNoneInput.Unit = sym;
|
||||
@@ -74,14 +74,14 @@ namespace Elwig.Windows {
|
||||
SeasonVatFlatrateInput.Text = "";
|
||||
SeasonStartInput.Text = "";
|
||||
SeasonEndInput.Text = "";
|
||||
SeasonMinKgPerBsInput.Text = "";
|
||||
SeasonMaxKgPerBsInput.Text = "";
|
||||
SeasonMinKgPerShareInput.Text = "";
|
||||
SeasonMaxKgPerShareInput.Text = "";
|
||||
SeasonPenaltyPerKgInput.Text = "";
|
||||
SeasonPenaltyInput.Text = "";
|
||||
SeasonPenaltyNoneInput.Text = "";
|
||||
SeasonPenaltyPerBsInput.Text = "";
|
||||
SeasonPenaltyPerBsNoneInput.Text = "";
|
||||
SeasonBsValueInput.Text = "";
|
||||
SeasonPenaltyPerShareInput.Text = "";
|
||||
SeasonPenaltyPerShareNoneInput.Text = "";
|
||||
SeasonShareValueInput.Text = "";
|
||||
}
|
||||
_seasonUpdate = false;
|
||||
}
|
||||
@@ -96,16 +96,16 @@ namespace Elwig.Windows {
|
||||
s.VatNormal = double.Parse(SeasonVatNormalInput.Text) / 100;
|
||||
if (SeasonVatFlatrateInput.Text.Length > 0)
|
||||
s.VatFlatrate = double.Parse(SeasonVatFlatrateInput.Text) / 100;
|
||||
if (SeasonMinKgPerBsInput.Text.Length > 0)
|
||||
s.MinKgPerBusinessShare = int.Parse(SeasonMinKgPerBsInput.Text);
|
||||
if (SeasonMaxKgPerBsInput.Text.Length > 0)
|
||||
s.MaxKgPerBusinessShare = int.Parse(SeasonMaxKgPerBsInput.Text);
|
||||
if (SeasonMinKgPerShareInput.Text.Length > 0)
|
||||
s.MinKgPerShare = int.Parse(SeasonMinKgPerShareInput.Text);
|
||||
if (SeasonMaxKgPerShareInput.Text.Length > 0)
|
||||
s.MaxKgPerShare = int.Parse(SeasonMaxKgPerShareInput.Text);
|
||||
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;
|
||||
s.PenaltyPerBsAmount = (SeasonPenaltyPerBsInput.Text.Length > 0) ? decimal.Parse(SeasonPenaltyPerBsInput.Text) : null;
|
||||
s.PenaltyPerBsNone = (SeasonPenaltyPerBsNoneInput.Text.Length > 0) ? decimal.Parse(SeasonPenaltyPerBsNoneInput.Text) : null;
|
||||
s.BusinessShareValue = (SeasonBsValueInput.Text.Length > 0) ? decimal.Parse(SeasonBsValueInput.Text) : null;
|
||||
s.PenaltyPerShareAmount = (SeasonPenaltyPerShareInput.Text.Length > 0) ? decimal.Parse(SeasonPenaltyPerShareInput.Text) : null;
|
||||
s.PenaltyPerShareNone = (SeasonPenaltyPerShareNoneInput.Text.Length > 0) ? decimal.Parse(SeasonPenaltyPerShareNoneInput.Text) : null;
|
||||
s.BusinessShareValue = (SeasonShareValueInput.Text.Length > 0) ? decimal.Parse(SeasonShareValueInput.Text) : null;
|
||||
|
||||
UpdateButtons();
|
||||
}
|
||||
@@ -131,7 +131,7 @@ namespace Elwig.Windows {
|
||||
Season_Changed(sender, evt);
|
||||
}
|
||||
|
||||
private void SeasonPenaltyPerBsInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
private void SeasonPenaltyPerShareInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
if (SeasonList.SelectedItem is not Season s) return;
|
||||
InputTextChanged((TextBox)sender, Validator.CheckDecimal((TextBox)sender, false, 4, s.Precision));
|
||||
Season_Changed(sender, evt);
|
||||
@@ -160,13 +160,13 @@ namespace Elwig.Windows {
|
||||
MaxKgPerHa = s?.MaxKgPerHa ?? 10000,
|
||||
VatNormal = s?.VatNormal ?? 0.10,
|
||||
VatFlatrate = s?.VatFlatrate ?? 0.13,
|
||||
MinKgPerBusinessShare = s?.MinKgPerBusinessShare ?? 500,
|
||||
MaxKgPerBusinessShare = s?.MaxKgPerBusinessShare ?? 1000,
|
||||
MinKgPerShare = s?.MinKgPerShare ?? 500,
|
||||
MaxKgPerShare = s?.MaxKgPerShare ?? 1000,
|
||||
PenaltyPerKgValue = s?.PenaltyPerKgValue,
|
||||
PenaltyAmoutValue = s?.PenaltyAmoutValue,
|
||||
PenaltyNoneValue = s?.PenaltyNoneValue,
|
||||
PenaltyPerBsAmountValue = s?.PenaltyPerBsAmountValue,
|
||||
PenaltyPerBsNoneValue = s?.PenaltyPerBsNoneValue,
|
||||
PenaltyPerShareAmountValue = s?.PenaltyPerShareAmountValue,
|
||||
PenaltyPerShareNoneValue = s?.PenaltyPerShareNoneValue,
|
||||
BusinessShareValueValue = s?.BusinessShareValueValue,
|
||||
CalcMode = s?.CalcMode ?? 0,
|
||||
});
|
||||
|
||||
@@ -32,9 +32,9 @@ namespace Elwig.Windows {
|
||||
AreaCommitmentTypeMinKgPerHaInput, AreaCommitmentTypePenaltyPerKgInput,
|
||||
AreaCommitmentTypePenaltyInput, AreaCommitmentTypePenaltyNoneInput,
|
||||
SeasonMaxKgPerHaInput, SeasonVatNormalInput, SeasonVatFlatrateInput, SeasonStartInput, SeasonEndInput,
|
||||
SeasonMinKgPerBsInput, SeasonMaxKgPerBsInput, SeasonBsValueInput,
|
||||
SeasonMinKgPerShareInput, SeasonMaxKgPerShareInput, SeasonShareValueInput,
|
||||
SeasonPenaltyPerKgInput, SeasonPenaltyInput, SeasonPenaltyNoneInput,
|
||||
SeasonPenaltyPerBsInput, SeasonPenaltyPerBsNoneInput,
|
||||
SeasonPenaltyPerShareInput, SeasonPenaltyPerShareNoneInput,
|
||||
SeasonModifierIdInput, SeasonModifierNameInput, SeasonModifierRelInput, SeasonModifierAbsInput,
|
||||
];
|
||||
WineAttributeFillLowerInput.Visibility = Visibility.Hidden;
|
||||
@@ -79,14 +79,14 @@ namespace Elwig.Windows {
|
||||
SeasonMaxKgPerHaInput.IsReadOnly = true;
|
||||
SeasonVatNormalInput.IsReadOnly = true;
|
||||
SeasonVatFlatrateInput.IsReadOnly = true;
|
||||
SeasonMinKgPerBsInput.IsReadOnly = true;
|
||||
SeasonMaxKgPerBsInput.IsReadOnly = true;
|
||||
SeasonMinKgPerShareInput.IsReadOnly = true;
|
||||
SeasonMaxKgPerShareInput.IsReadOnly = true;
|
||||
SeasonPenaltyPerKgInput.IsReadOnly = true;
|
||||
SeasonPenaltyInput.IsReadOnly = true;
|
||||
SeasonPenaltyNoneInput.IsReadOnly = true;
|
||||
SeasonPenaltyPerBsInput.IsReadOnly = true;
|
||||
SeasonPenaltyPerBsNoneInput.IsReadOnly = true;
|
||||
SeasonBsValueInput.IsReadOnly = true;
|
||||
SeasonPenaltyPerShareInput.IsReadOnly = true;
|
||||
SeasonPenaltyPerShareNoneInput.IsReadOnly = true;
|
||||
SeasonShareValueInput.IsReadOnly = true;
|
||||
|
||||
SeasonModifierIdInput.IsReadOnly = true;
|
||||
SeasonModifierNameInput.IsReadOnly = true;
|
||||
@@ -133,14 +133,14 @@ namespace Elwig.Windows {
|
||||
SeasonMaxKgPerHaInput.IsReadOnly = false;
|
||||
SeasonVatNormalInput.IsReadOnly = false;
|
||||
SeasonVatFlatrateInput.IsReadOnly = false;
|
||||
SeasonMinKgPerBsInput.IsReadOnly = false;
|
||||
SeasonMaxKgPerBsInput.IsReadOnly = false;
|
||||
SeasonMinKgPerShareInput.IsReadOnly = false;
|
||||
SeasonMaxKgPerShareInput.IsReadOnly = false;
|
||||
SeasonPenaltyPerKgInput.IsReadOnly = false;
|
||||
SeasonPenaltyInput.IsReadOnly = false;
|
||||
SeasonPenaltyNoneInput.IsReadOnly = false;
|
||||
SeasonPenaltyPerBsInput.IsReadOnly = false;
|
||||
SeasonPenaltyPerBsNoneInput.IsReadOnly = false;
|
||||
SeasonBsValueInput.IsReadOnly = false;
|
||||
SeasonPenaltyPerShareInput.IsReadOnly = false;
|
||||
SeasonPenaltyPerShareNoneInput.IsReadOnly = false;
|
||||
SeasonShareValueInput.IsReadOnly = false;
|
||||
|
||||
SeasonModifierIdInput.IsReadOnly = false;
|
||||
SeasonModifierNameInput.IsReadOnly = false;
|
||||
|
||||
@@ -104,10 +104,10 @@ namespace Elwig.Windows {
|
||||
|
||||
try {
|
||||
var data = EditBillingData.FromJson(PaymentVar.Data, await Utils.GetVaributes(ctx, Year));
|
||||
var paymentEntries = await data.GetPaymentGraphEntries(ctx, Season);
|
||||
var paymentEntries = (await data.GetPaymentGraphEntries(ctx, Season)).ToList();
|
||||
GraphEntries = [
|
||||
..paymentEntries,
|
||||
..await data.GetQualityGraphEntries(ctx, Season, paymentEntries.Any() ? paymentEntries.Max(e => e.Id) : 0)
|
||||
..await data.GetQualityGraphEntries(ctx, Season, paymentEntries.Count != 0 ? paymentEntries.Max(e => e.Id) : 0)
|
||||
];
|
||||
} catch (KeyNotFoundException exc) {
|
||||
var key = exc.Message.Split('\'')[1].Split('\'')[0];
|
||||
|
||||
@@ -142,7 +142,7 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
var totalMemberCount = await ctx.Members.CountAsync();
|
||||
var totalBusinessShares = await ctx.Members.SumAsync(m => m.BusinessShares);
|
||||
var totalBusinessShares = await ctx.Members.SumAsync(m => m.Shares + m.SharesRed + m.SharesWhite + m.SharesDormant);
|
||||
|
||||
return (members, totalMemberCount, totalBusinessShares);
|
||||
});
|
||||
@@ -155,7 +155,7 @@ namespace Elwig.Windows {
|
||||
MemberList.ScrollIntoView(MemberList.SelectedItem);
|
||||
|
||||
ViewModel.StatusMembers = $"{members.Count:N0} ({totalMemberCount:N0})";
|
||||
ViewModel.StatusBusinessShares = $"{members.Sum(m => m.BusinessShares):N0} ({totalBusinessShares:N0})";
|
||||
ViewModel.StatusBusinessShares = $"{members.Sum(m => m.Shares + m.SharesRed + m.SharesWhite + m.SharesDormant):N0} ({totalBusinessShares:N0})";
|
||||
}
|
||||
|
||||
private void RefreshInputs(bool validate = false) {
|
||||
@@ -279,9 +279,9 @@ namespace Elwig.Windows {
|
||||
$"{new string(s1, Math.Max(0, mM - mI.Length))}{(mS && mI.Length < 4 ? s2 : "")}{mI} nicht aktive Mitglieder\n" +
|
||||
$"{new string(s1, Math.Max(0, mM - mT.Length))}{(mS && mT.Length < 4 ? s2 : "")}{mT} Mitglieder gesamt";
|
||||
|
||||
var bA = $"{await ctx.Members.Where(m => m.IsActive).SumAsync(m => m.BusinessShares):N0}";
|
||||
var bI = $"{await ctx.Members.Where(m => !m.IsActive).SumAsync(m => m.BusinessShares):N0}";
|
||||
var bT = $"{await ctx.Members.SumAsync(m => m.BusinessShares):N0}";
|
||||
var bA = $"{await ctx.Members.Where(m => m.IsActive).SumAsync(m => m.Shares + m.SharesRed + m.SharesWhite + m.SharesDormant):N0}";
|
||||
var bI = $"{await ctx.Members.Where(m => !m.IsActive).SumAsync(m => m.Shares + m.SharesRed + m.SharesWhite + m.SharesDormant):N0}";
|
||||
var bT = $"{await ctx.Members.SumAsync(m => m.Shares + m.SharesRed + m.SharesWhite + m.SharesDormant):N0}";
|
||||
var bM = Math.Max(bA.Length, Math.Max(bI.Length, bT.Length));
|
||||
var bS = bM > 3;
|
||||
if (bS) bM--;
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
</Style>
|
||||
</DataGridTextColumn.CellStyle>
|
||||
</DataGridTextColumn>
|
||||
<DataGridTextColumn Header="Strafe GA" Binding="{Binding PenaltyBs, Converter={StaticResource CurrencyConverter}, StringFormat='{}{0} '}" Width="65">
|
||||
<DataGridTextColumn Header="Strafe GA" Binding="{Binding PenaltyShares, Converter={StaticResource CurrencyConverter}, StringFormat='{}{0} '}" Width="65">
|
||||
<DataGridTextColumn.CellStyle>
|
||||
<Style>
|
||||
<Setter Property="TextBlock.TextAlignment" Value="Right"/>
|
||||
@@ -204,28 +204,28 @@
|
||||
<Label Content="Absoluter Freibetrag:" Margin="10,10,0,0" Grid.ColumnSpan="2"/>
|
||||
<ctrl:UnitTextBox x:Name="AllowanceKgInput" Unit="kg" Margin="128,10,0,0" Width="70"
|
||||
TextChanged="KgInput_TextChanged" Grid.Column="1"/>
|
||||
<ctrl:UnitTextBox x:Name="AllowanceBsInput" Unit="GA" Margin="203,10,0,0" Width="60"
|
||||
<ctrl:UnitTextBox x:Name="AllowanceShareInput" Unit="GA" Margin="203,10,0,0" Width="60"
|
||||
TextChanged="PercentInput_TextChanged" Grid.Column="1"/>
|
||||
|
||||
<Label Content="Relativer Freibetrag:" Margin="10,40,0,0" Grid.ColumnSpan="2"/>
|
||||
<ctrl:UnitTextBox x:Name="AllowanceKgPerBsInput" Unit="kg/GA" Margin="128,40,0,0" Width="87"
|
||||
<ctrl:UnitTextBox x:Name="AllowanceKgPerShareInput" Unit="kg/GA" Margin="128,40,0,0" Width="87"
|
||||
TextChanged="KgInput_TextChanged" Grid.Column="1"/>
|
||||
<ctrl:UnitTextBox x:Name="AllowancePercentInput" Unit="%" Margin="220,40,0,0" Width="60"
|
||||
TextChanged="PercentInput_TextChanged" Grid.Column="1"/>
|
||||
|
||||
<Label Content="Nur mind. nachz.:" Margin="10,70,0,0" Grid.ColumnSpan="2"/>
|
||||
<ctrl:UnitTextBox x:Name="MinBsInput" Unit="GA" Margin="128,70,0,0" Width="50"
|
||||
TextChanged="BsInput_TextChanged" Grid.Column="1"/>
|
||||
<ctrl:UnitTextBox x:Name="MinSharesInput" Unit="GA" Margin="128,70,0,0" Width="50"
|
||||
TextChanged="SharesInput_TextChanged" Grid.Column="1"/>
|
||||
|
||||
<Button x:Name="SeasonButton" Content="GA-Wert" Margin="0,0,10,42" Width="120"
|
||||
HorizontalAlignment="Right" VerticalAlignment="Bottom"
|
||||
Click="SeasonButton_Click" Grid.Column="1"/>
|
||||
<Button x:Name="AutoAdjustBsButton" Content="Nachzeichnen" Margin="0,0,135,10" Width="120"
|
||||
<Button x:Name="AutoAdjustSharesButton" Content="Nachzeichnen" Margin="0,0,135,10" Width="120"
|
||||
HorizontalAlignment="Right" VerticalAlignment="Bottom"
|
||||
Click="AutoAdjustBsButton_Click" Grid.Column="1"/>
|
||||
<Button x:Name="UnAdjustBsButton" Content="Rückgängig" Margin="0,0,10,10" Width="120"
|
||||
Click="AutoAdjustSharesButton_Click" Grid.Column="1"/>
|
||||
<Button x:Name="UnAdjustSharesButton" Content="Rückgängig" Margin="0,0,10,10" Width="120"
|
||||
HorizontalAlignment="Right" VerticalAlignment="Bottom"
|
||||
Click="UnAdjustBsButton_Click" Grid.Column="1"/>
|
||||
Click="UnAdjustSharesButton_Click" Grid.Column="1"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
|
||||
@@ -26,18 +26,18 @@ namespace Elwig.Windows {
|
||||
Year = year;
|
||||
// using (var ctx = new AppDbContext()) { SeasonLocked = ctx.Seasons.Find(Year + 1) != null; }
|
||||
Title = $"Auszahlung anpassen - Lese {Year} - Elwig";
|
||||
AutoAdjustBsButton.IsEnabled = !SeasonLocked;
|
||||
UnAdjustBsButton.IsEnabled = !SeasonLocked;
|
||||
AutoAdjustSharesButton.IsEnabled = !SeasonLocked;
|
||||
UnAdjustSharesButton.IsEnabled = !SeasonLocked;
|
||||
SaveCustomButton.IsEnabled = !SeasonLocked;
|
||||
RemoveCustomButton.IsEnabled = !SeasonLocked;
|
||||
CustomAmountInput.IsEnabled = !SeasonLocked;
|
||||
CustomCommentInput.IsEnabled = !SeasonLocked;
|
||||
|
||||
AllowanceKgInput.Text = $"{App.Client.AutoAdjustBs.AllowanceKg}";
|
||||
AllowanceBsInput.Text = $"{App.Client.AutoAdjustBs.AllowanceBs}";
|
||||
AllowanceKgPerBsInput.Text = $"{App.Client.AutoAdjustBs.AllowanceKgPerBs}";
|
||||
AllowancePercentInput.Text = $"{App.Client.AutoAdjustBs.AllowancePercent}";
|
||||
MinBsInput.Text = $"{App.Client.AutoAdjustBs.MinBs}";
|
||||
AllowanceKgInput.Text = $"{App.Client.AutoAdjustShares.AllowanceKg}";
|
||||
AllowanceShareInput.Text = $"{App.Client.AutoAdjustShares.AllowanceShares}";
|
||||
AllowanceKgPerShareInput.Text = $"{App.Client.AutoAdjustShares.AllowanceKgPerShare}";
|
||||
AllowancePercentInput.Text = $"{App.Client.AutoAdjustShares.AllowancePercent}";
|
||||
MinSharesInput.Text = $"{App.Client.AutoAdjustShares.MinShares}";
|
||||
}
|
||||
|
||||
protected override async Task OnRenewContext(AppDbContext ctx) {
|
||||
@@ -46,7 +46,7 @@ namespace Elwig.Windows {
|
||||
m.MgNr,
|
||||
m.Name,
|
||||
m.GivenName,
|
||||
m.BusinessShares,
|
||||
m.Shares,
|
||||
m.IsActive,
|
||||
})
|
||||
.ToListAsync();
|
||||
@@ -55,27 +55,27 @@ namespace Elwig.Windows {
|
||||
|
||||
var tbl1 = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, Year);
|
||||
var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, Year);
|
||||
var weight = tbl1.Rows.ToDictionary(r => r.MgNr, r => r.Weight);
|
||||
var weight = tbl1.Rows.ToDictionary(r => r.MgNr, r => r.WeightTotal);
|
||||
var areaComs = tbl2.Rows.ToDictionary(r => r.MgNr, r => r.VtrgIds.Zip(r.UnderDeliveries).ToDictionary(r => r.First, r => r.Second));
|
||||
CustomPayments = await ctx.CustomPayments.Where(p => p.Year == Year).ToDictionaryAsync(p => p.MgNr, p => p);
|
||||
|
||||
var history = await ctx.MemberHistory
|
||||
.Where(h => h.DateString.CompareTo($"{Year}-01-01") >= 0 && h.DateString.CompareTo($"{Year}-12-31") <= 0 && h.Type == "auto" && h.BusinessShares > 0)
|
||||
.GroupBy(h => h.Member)
|
||||
.ToDictionaryAsync(h => h.Key.MgNr, h => h.Sum(g => g.BusinessShares));
|
||||
.Where(h => h.DateString.CompareTo($"{Year}-01-01") >= 0 && h.DateString.CompareTo($"{Year}-12-31") <= 0 && h.Reason == "auto" && h.Shares > 0)
|
||||
.GroupBy(h => h.ToMember)
|
||||
.ToDictionaryAsync(h => h.Key.MgNr, h => h.Sum(g => g.Shares));
|
||||
|
||||
var list = members
|
||||
.Select(m => new {
|
||||
m.MgNr, m.Name, m.GivenName,
|
||||
m.IsActive,
|
||||
BusinessShares = m.BusinessShares - history.GetValueOrDefault(m.MgNr, 0),
|
||||
DeliveryObligation = (m.BusinessShares - history.GetValueOrDefault(m.MgNr, 0)) * season.MinKgPerBusinessShare,
|
||||
DeliveryRight = (m.BusinessShares - history.GetValueOrDefault(m.MgNr, 0)) * season.MaxKgPerBusinessShare,
|
||||
Shares = m.Shares - history.GetValueOrDefault(m.MgNr, 0),
|
||||
DeliveryObligation = (m.Shares - history.GetValueOrDefault(m.MgNr, 0)) * season.MinKgPerShare,
|
||||
DeliveryRight = (m.Shares - history.GetValueOrDefault(m.MgNr, 0)) * season.MaxKgPerShare,
|
||||
Adjust = history.TryGetValue(m.MgNr, out int v2) ? (int?)v2 : null,
|
||||
})
|
||||
.Select(m => new {
|
||||
m.MgNr, m.Name, m.GivenName,
|
||||
m.BusinessShares,
|
||||
m.Shares,
|
||||
Weight = weight.GetValueOrDefault(m.MgNr, 0),
|
||||
OverUnder = weight.TryGetValue(m.MgNr, out int v1) ?
|
||||
(v1 < m.DeliveryObligation ? (int?)v1 - m.DeliveryObligation :
|
||||
@@ -86,12 +86,12 @@ namespace Elwig.Windows {
|
||||
})
|
||||
.Select(m => new {
|
||||
m.MgNr, m.Name, m.GivenName,
|
||||
m.BusinessShares, m.Weight, m.OverUnder,
|
||||
PenaltyBs = m.OverUnder != null && m.OverUnder < 0 ?
|
||||
m.Shares, m.Weight, m.OverUnder,
|
||||
PenaltyShares = m.OverUnder != null && m.OverUnder < 0 ?
|
||||
(season.PenaltyPerKg * m.OverUnder ?? 0) +
|
||||
(-season.PenaltyAmount ?? 0) +
|
||||
(season.PenaltyPerBsAmount * Math.Floor(m.OverUnder / season.MinKgPerBusinessShare ?? 0m) ?? 0) +
|
||||
(m.Weight == 0 ? (-season.PenaltyNone ?? 0) + (-season.PenaltyPerBsNone * m.BusinessShares ?? 0) : 0)
|
||||
(season.PenaltyPerShareAmount * Math.Floor(m.OverUnder / season.MinKgPerShare ?? 0m) ?? 0) +
|
||||
(m.Weight == 0 ? (-season.PenaltyNone ?? 0) + (-season.PenaltyPerShareNone * m.Shares ?? 0) : 0)
|
||||
: (decimal?)null,
|
||||
PenaltyAc = areaComs.TryGetValue(m.MgNr, out var c) ? c.Select(r => {
|
||||
var con = contracts[r.Key];
|
||||
@@ -103,30 +103,30 @@ namespace Elwig.Windows {
|
||||
})
|
||||
.Select(m => new {
|
||||
m.MgNr, m.Name, m.GivenName,
|
||||
m.BusinessShares, m.Weight, m.OverUnder,
|
||||
PenaltyBs = m.PenaltyBs == null || m.PenaltyBs == 0 ? (decimal?)null : Math.Round((decimal)m.PenaltyBs, 2),
|
||||
m.Shares, m.Weight, m.OverUnder,
|
||||
PenaltyShares = m.PenaltyShares == null || m.PenaltyShares == 0 ? (decimal?)null : Math.Round((decimal)m.PenaltyShares, 2),
|
||||
PenaltyAc = m.PenaltyAc == null ? (decimal?)null : Math.Round((decimal)m.PenaltyAc, 2),
|
||||
m.Adjust,
|
||||
AdjustAmount = m.AdjustAmount == null ? (decimal?)null : Math.Round((decimal)m.AdjustAmount, 2),
|
||||
CustomAmount = m.Custom?.Amount,
|
||||
ModAbs = m.Custom?.ModAbs,
|
||||
ModRel = m.Custom?.ModRel,
|
||||
m.Custom?.ModAbs,
|
||||
m.Custom?.ModRel,
|
||||
})
|
||||
.Select(m => new {
|
||||
m.MgNr, m.Name, m.GivenName,
|
||||
m.BusinessShares, m.Weight, m.OverUnder,
|
||||
m.PenaltyBs, m.PenaltyAc, m.Adjust, m.AdjustAmount, m.CustomAmount, m.ModAbs, m.ModRel,
|
||||
Total = (m.PenaltyBs ?? 0) + (m.PenaltyAc ?? 0) + (m.AdjustAmount ?? 0) + (m.CustomAmount ?? 0),
|
||||
m.Shares, m.Weight, m.OverUnder,
|
||||
m.PenaltyShares, m.PenaltyAc, m.Adjust, m.AdjustAmount, m.CustomAmount, m.ModAbs, m.ModRel,
|
||||
Total = (m.PenaltyShares ?? 0) + (m.PenaltyAc ?? 0) + (m.AdjustAmount ?? 0) + (m.CustomAmount ?? 0),
|
||||
})
|
||||
.Select(m => new {
|
||||
m.MgNr, m.Name, m.GivenName,
|
||||
m.BusinessShares, m.Weight, m.OverUnder,
|
||||
m.PenaltyBs, m.PenaltyAc, m.Adjust, m.AdjustAmount, m.CustomAmount, m.ModAbs, m.ModRel,
|
||||
m.Shares, m.Weight, m.OverUnder,
|
||||
m.PenaltyShares, m.PenaltyAc, m.Adjust, m.AdjustAmount, m.CustomAmount, m.ModAbs, m.ModRel,
|
||||
m.Total,
|
||||
Background = m.Weight == 0 ? Brushes.Orange : m.Weight / 2 < -m.Total ? Brushes.Red : Brushes.White,
|
||||
Foreground = m.Total == 0 ? Brushes.Gray : Brushes.Black,
|
||||
})
|
||||
.Where(m => m.OverUnder != null || m.Adjust != null || m.PenaltyBs != null || m.PenaltyAc != null || m.CustomAmount != null || m.ModAbs != null || m.ModRel != null)
|
||||
.Where(m => m.OverUnder != null || m.Adjust != null || m.PenaltyShares != null || m.PenaltyAc != null || m.CustomAmount != null || m.ModAbs != null || m.ModRel != null)
|
||||
.OrderByDescending(m => m.OverUnder ?? 0)
|
||||
.ThenBy(m => m.Name)
|
||||
.ThenBy(m => m.GivenName)
|
||||
@@ -136,7 +136,7 @@ namespace Elwig.Windows {
|
||||
MemberList.ItemsSource = list;
|
||||
|
||||
var sym = season.Currency.Symbol ?? season.Currency.Code;
|
||||
PenaltyBusinessShares.Text = $"{list.Count(r => r.PenaltyBs != null && r.PenaltyBs != 0)} Mg. / {list.Sum(r => r.PenaltyBs):N2} {sym}";
|
||||
PenaltyBusinessShares.Text = $"{list.Count(r => r.PenaltyShares != null && r.PenaltyShares != 0)} Mg. / {list.Sum(r => r.PenaltyShares):N2} {sym}";
|
||||
PenaltyAreaCommitments.Text = $"{list.Count(r => r.PenaltyAc != null && r.PenaltyAc != 0)} Mg. / {list.Sum(r => r.PenaltyAc):N2} {sym}";
|
||||
AutoBusinessShareAdjustment.Text = $"{list.Count(r => r.Adjust > 0)} Mg. / {list.Sum(r => r.Adjust)} GA / {list.Sum(r => r.AdjustAmount):N2} {sym}";
|
||||
CustomModifiers.Text = $"{list.Count(r => r.CustomAmount != null)} Mg. / {list.Sum(r => r.CustomAmount):N2} {sym}";
|
||||
@@ -147,25 +147,25 @@ namespace Elwig.Windows {
|
||||
CustomAmountInput.Unit = sym;
|
||||
}
|
||||
|
||||
private async void AutoAdjustBsButton_Click(object sender, RoutedEventArgs evt) {
|
||||
private async void AutoAdjustSharesButton_Click(object sender, RoutedEventArgs evt) {
|
||||
Mouse.OverrideCursor = Cursors.Wait;
|
||||
try {
|
||||
int? kg = AllowanceKgInput.Text == "" ? null : int.Parse(AllowanceKgInput.Text);
|
||||
double? bs = AllowanceBsInput.Text == "" ? null : double.Parse(AllowanceBsInput.Text);
|
||||
int? kgPerBs = AllowanceKgPerBsInput.Text == "" ? null : int.Parse(AllowanceKgPerBsInput.Text);
|
||||
double? shares = AllowanceShareInput.Text == "" ? null : double.Parse(AllowanceShareInput.Text);
|
||||
int? kgPerShare = AllowanceKgPerShareInput.Text == "" ? null : int.Parse(AllowanceKgPerShareInput.Text);
|
||||
double? percent = AllowancePercentInput.Text == "" ? null : double.Parse(AllowancePercentInput.Text);
|
||||
int? minBs = MinBsInput.Text == "" ? null : int.Parse(MinBsInput.Text);
|
||||
int? minShares = MinSharesInput.Text == "" ? null : int.Parse(MinSharesInput.Text);
|
||||
|
||||
App.Client.AutoAdjustBs.AllowanceKg = kg;
|
||||
App.Client.AutoAdjustBs.AllowanceBs = bs;
|
||||
App.Client.AutoAdjustBs.AllowanceKgPerBs = kgPerBs;
|
||||
App.Client.AutoAdjustBs.AllowancePercent = percent;
|
||||
App.Client.AutoAdjustBs.MinBs = minBs;
|
||||
App.Client.AutoAdjustShares.AllowanceKg = kg;
|
||||
App.Client.AutoAdjustShares.AllowanceShares = shares;
|
||||
App.Client.AutoAdjustShares.AllowanceKgPerShare = kgPerShare;
|
||||
App.Client.AutoAdjustShares.AllowancePercent = percent;
|
||||
App.Client.AutoAdjustShares.MinShares = minShares;
|
||||
|
||||
await Task.Run(async () => {
|
||||
await App.Client.UpdateValues();
|
||||
var b = await Billing.Create(Year);
|
||||
await b.AutoAdjustBusinessShares(new DateOnly(Year, 11, 30), kg ?? default, bs ?? default, kgPerBs ?? default, percent / 100.0 ?? default, minBs ?? default);
|
||||
await b.AutoAdjustBusinessShares(new DateOnly(Year, 11, 30), kg ?? default, shares ?? default, kgPerShare ?? default, percent / 100.0 ?? default, minShares ?? default);
|
||||
});
|
||||
App.HintContextChange();
|
||||
} catch (Exception exc) {
|
||||
@@ -174,7 +174,7 @@ namespace Elwig.Windows {
|
||||
Mouse.OverrideCursor = null;
|
||||
}
|
||||
|
||||
private async void UnAdjustBsButton_Click(object sender, RoutedEventArgs evt) {
|
||||
private async void UnAdjustSharesButton_Click(object sender, RoutedEventArgs evt) {
|
||||
Mouse.OverrideCursor = Cursors.Wait;
|
||||
try {
|
||||
await Task.Run(async () => {
|
||||
@@ -196,7 +196,7 @@ namespace Elwig.Windows {
|
||||
Validator.CheckInteger((TextBox)sender, false, 6);
|
||||
}
|
||||
|
||||
private void BsInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
private void SharesInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
Validator.CheckInteger((TextBox)sender, false, 3);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user