[#77] Entities: Add AreaComContract to group area commitments together
This commit is contained in:
@@ -41,13 +41,21 @@ namespace Elwig.Controls {
|
||||
incButton!.Click += IncrementButton_Click;
|
||||
decButton!.Click += DecrementButton_Click;
|
||||
base.OnApplyTemplate();
|
||||
UpdateButtons();
|
||||
}
|
||||
|
||||
private void UpdateButtons() {
|
||||
var incButton = GetTemplateChild("IncrementButton") as RepeatButton;
|
||||
var decButton = GetTemplateChild("DecrementButton") as RepeatButton;
|
||||
incButton?.IsEnabled = Maximum == null || Value < Maximum;
|
||||
decButton?.IsEnabled = Minimum == null || Value > Minimum;
|
||||
}
|
||||
|
||||
private void IntegerUpDown_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
var idx = CaretIndex;
|
||||
Text = new string(Text.Where(char.IsAsciiDigit).Take(4).ToArray());
|
||||
Text = new string([.. Text.Where(char.IsAsciiDigit).Take(4)]);
|
||||
CaretIndex = idx;
|
||||
evt.Handled = !(Value >= Minimum && Value <= Maximum);
|
||||
evt.Handled = !((!Minimum.HasValue || Value >= Minimum) && (!Maximum.HasValue || Value <= Maximum));
|
||||
if (idx >= 4) {
|
||||
if (Value < Minimum) {
|
||||
Value = Minimum;
|
||||
@@ -56,6 +64,7 @@ namespace Elwig.Controls {
|
||||
}
|
||||
CaretIndex = 4;
|
||||
}
|
||||
UpdateButtons();
|
||||
}
|
||||
|
||||
private void IntegerUpDown_LostFocus(object sender, RoutedEventArgs evt) {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Elwig.Helpers;
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
@@ -12,23 +13,27 @@ namespace Elwig.Dialogs {
|
||||
public string OrigYearTo { get; set; }
|
||||
public string Area { get; set; }
|
||||
|
||||
public AreaComModifyDialog(int? yearFrom, int? yearTo, int area, bool delete) {
|
||||
public AreaComModifyDialog(int? yearFrom, int? yearTo, int area, bool delete, bool forceRetroactive = false) {
|
||||
Area = $"{area:N0}";
|
||||
OrigYearFrom = $"{yearFrom}";
|
||||
OrigYearTo = $"{yearTo}";
|
||||
InitializeComponent();
|
||||
Title = delete ? "Flächenbindung löschen" : "Flächenbindung bearbeiten";
|
||||
RetroactiveInput.Content = delete ? "Rückwirkend löschen" : "Rückwirkend bearbeiten";
|
||||
forceRetroactive = forceRetroactive || yearFrom.HasValue && yearTo.HasValue && yearFrom.Value == yearTo.Value;
|
||||
RetroactiveInput.IsEnabled = !forceRetroactive;
|
||||
if (delete) {
|
||||
QuestionBlock1.Visibility = Visibility.Hidden;
|
||||
QuestionBlock2.Visibility = Visibility.Visible;
|
||||
DescBlock1.Visibility = Visibility.Hidden;
|
||||
DescBlock2.Visibility = Visibility.Visible;
|
||||
}
|
||||
if ((yearTo.HasValue && yearTo < Utils.CurrentNextSeason) || (yearFrom.HasValue && yearFrom >= Utils.CurrentNextSeason)) {
|
||||
SeasonInput.Minimum = yearFrom.HasValue ? yearFrom + 1 : null;
|
||||
SeasonInput.Maximum = yearTo.HasValue ? yearTo : null;
|
||||
if (forceRetroactive || (yearTo.HasValue && yearTo < Utils.CurrentYear) || (yearFrom.HasValue && yearFrom >= Utils.CurrentYear)) {
|
||||
RetroactiveInput.IsChecked = true;
|
||||
} else {
|
||||
SeasonInput.Text = $"{Utils.CurrentNextSeason}";
|
||||
SeasonInput.Text = $"{Utils.CurrentYear}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +53,7 @@ namespace Elwig.Dialogs {
|
||||
DescBlock2.Visibility = Visibility.Hidden;
|
||||
} else {
|
||||
SeasonInput.IsEnabled = true;
|
||||
SeasonInput.Text = $"{Utils.CurrentNextSeason}";
|
||||
SeasonInput.Text = $"{Math.Max(SeasonInput.Minimum ?? Utils.CurrentYear, Utils.CurrentYear)}";
|
||||
DescBlock1.Visibility = QuestionBlock1.Visibility;
|
||||
DescBlock2.Visibility = QuestionBlock2.Visibility;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
ResizeMode="NoResize" ShowInTaskbar="False" Topmost="True"
|
||||
WindowStartupLocation="CenterOwner"
|
||||
DataContext="{Binding RelativeSource={RelativeSource Self}}"
|
||||
Title="Flächenbindungen übertragen" Height="260" Width="450">
|
||||
Title="Flächenbindungen übertragen" Height="240" Width="450">
|
||||
<Window.Resources>
|
||||
<Style TargetType="Label">
|
||||
<Setter Property="HorizontalAlignment" Value="Left"/>
|
||||
@@ -48,12 +48,8 @@
|
||||
Minimum="1900" Maximum="9999"
|
||||
HorizontalAlignment="Center" VerticalAlignment="Top"
|
||||
TextChanged="SeasonInput_TextChanged"/>
|
||||
<CheckBox x:Name="CopyYearToInput" Content="Beginn der Laufzeit von Vorgänger übernehmen" Margin="0,80,0,0"
|
||||
HorizontalAlignment="Center" VerticalAlignment="Top"
|
||||
Checked="CopyYearToInput_Changed" Unchecked="CopyYearToInput_Changed"
|
||||
IsChecked="{Binding MaintainYearFrom}"/>
|
||||
|
||||
<TextBlock x:Name="DescBlock1" Margin="0,105,0,0" TextAlignment="Center"
|
||||
<TextBlock x:Name="DescBlock1" Margin="0,90,0,0" TextAlignment="Center"
|
||||
HorizontalAlignment="Center" VerticalAlignment="Top">
|
||||
Die Flächenbindungen beim <Bold>Vorgänger</Bold> sind bis inkl. Saison <Bold><Run x:Name="CancelSeason1"/></Bold> gültig,<LineBreak/>
|
||||
und werden beim <Bold>Nachfolger</Bold> ab <Run x:Name="DescBlock1Season" Text="inkl. Saison "/><Bold><Run x:Name="TransferSeason"/></Bold> übernommen.
|
||||
|
||||
@@ -5,51 +5,51 @@ using System.Windows.Controls;
|
||||
namespace Elwig.Dialogs {
|
||||
public partial class AreaComTransferDialog : Window {
|
||||
|
||||
public int CancelSeason { get; set; }
|
||||
public int SuccessorSeason => CancelSeason + 1;
|
||||
public bool MaintainYearFrom { get; set; }
|
||||
public int CancelSeason => SuccessorSeason - 1;
|
||||
public int SuccessorSeason { get; set; }
|
||||
|
||||
public string AreaComNum { get; set; }
|
||||
public string Area { get; set; }
|
||||
|
||||
public AreaComTransferDialog(string name, int areaComNum, int area) {
|
||||
CancelSeason = Utils.FollowingSeason - 1;
|
||||
SuccessorSeason = Utils.FollowingSeason;
|
||||
AreaComNum = $"{areaComNum:N0}";
|
||||
Area = $"{area:N0}";
|
||||
InitializeComponent();
|
||||
SeasonInput.Text = $"{CancelSeason}";
|
||||
SeasonInput.Text = $"{SuccessorSeason}";
|
||||
SeasonInput.Minimum = Utils.CurrentLastSeason;
|
||||
Title = $"Aktive Flächenbindungen kündigen - {name}";
|
||||
QuestionBlock1.Visibility = Visibility.Hidden;
|
||||
QuestionBlock2.Visibility = Visibility.Visible;
|
||||
DescBlock1.Visibility = Visibility.Hidden;
|
||||
DescBlock2.Visibility = Visibility.Visible;
|
||||
CopyYearToInput.Visibility = Visibility.Hidden;
|
||||
Height = 240;
|
||||
SeasonInput.Margin = new(0, 40, 0, 0);
|
||||
SeasonLabel.Margin = new(0, 40, 100, 0);
|
||||
}
|
||||
|
||||
public AreaComTransferDialog(string name, string successorName, int areaComNum, int area) {
|
||||
CancelSeason = Utils.FollowingSeason - 1;
|
||||
SuccessorSeason = Utils.FollowingSeason;
|
||||
AreaComNum = $"{areaComNum:N0}";
|
||||
Area = $"{area:N0}";
|
||||
InitializeComponent();
|
||||
SeasonInput.Text = $"{CancelSeason}";
|
||||
SeasonInput.Text = $"{SuccessorSeason}";
|
||||
SeasonInput.Minimum = Utils.CurrentLastSeason;
|
||||
Title = $"Aktive Flächenbindungen übertragen - {name} - {successorName}";
|
||||
InfoBlock.Visibility = Visibility.Hidden;
|
||||
}
|
||||
|
||||
private void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
CancelSeason = (int)SeasonInput.Value!;
|
||||
SuccessorSeason = (int)SeasonInput.Value!;
|
||||
CancelSeason1.Text = $"{CancelSeason}";
|
||||
CancelSeason2.Text = $"{CancelSeason}";
|
||||
TransferSeason.Text = MaintainYearFrom ? "" : $"{SuccessorSeason}";
|
||||
DescBlock1Season.Text = MaintainYearFrom ? "dem originalen Beginn der FB" : "inkl. Saison ";
|
||||
TransferSeason.Text = $"{SuccessorSeason}";
|
||||
DescBlock1Season.Text = "inkl. Saison ";
|
||||
}
|
||||
|
||||
private void CopyYearToInput_Changed(object sender, RoutedEventArgs evt) {
|
||||
TransferSeason.Text = MaintainYearFrom ? "" : $"{SuccessorSeason}";
|
||||
DescBlock1Season.Text = MaintainYearFrom ? "dem originalen Beginn der FB" : "inkl. Saison ";
|
||||
TransferSeason.Text = $"{SuccessorSeason}";
|
||||
DescBlock1Season.Text = "inkl. Saison ";
|
||||
}
|
||||
|
||||
private void ConfirmButton_Click(object sender, RoutedEventArgs evt) {
|
||||
|
||||
@@ -19,7 +19,8 @@ namespace Elwig.Documents {
|
||||
public Dictionary<string, MemberBucket> MemberBuckets;
|
||||
public List<AreaCom> ActiveAreaCommitments;
|
||||
|
||||
public MemberDataSheet(Member m, AppDbContext ctx) : base($"{Name} {m.AdministrativeName}", m) {
|
||||
public MemberDataSheet(Member m, AppDbContext ctx) :
|
||||
base($"{Name} {m.AdministrativeName}", m) {
|
||||
DocumentId = $"{Name} {m.MgNr}";
|
||||
Season = ctx.Seasons.ToList().MaxBy(s => s.Year) ?? throw new ArgumentException("invalid season");
|
||||
MemberBuckets = ctx.GetMemberBuckets(Utils.CurrentYear, m.MgNr).GetAwaiter().GetResult();
|
||||
@@ -136,7 +137,7 @@ namespace Elwig.Documents {
|
||||
protected Table NewAreaComTable() {
|
||||
var areaComs = ActiveAreaCommitments.GroupBy(a => a.AreaComType).Select(group => new {
|
||||
Type = group.Key,
|
||||
AreaComs = group.OrderBy(c => c.Kg.AtKg.Name).ToList(),
|
||||
AreaComs = group.OrderBy(c => c.Contract.Kg.AtKg.Name).ToList(),
|
||||
Size = group.Sum(c => c.Area)
|
||||
}).OrderByDescending(a => a.Size).ToList();
|
||||
|
||||
@@ -164,12 +165,13 @@ namespace Elwig.Documents {
|
||||
.SetBorderTop(contractType.Type.DisplayName != lastContract && lastContract != "" ? new SolidBorder(BorderThickness) : Border.NO_BORDER));
|
||||
|
||||
foreach (var areaCom in contractType.AreaComs) {
|
||||
tbl.AddCell(NewTd(new KernedParagraph(10).Add(Normal($"{areaCom.Kg.AtKg.Name} ")).Add(Normal($"({areaCom.Kg.AtKg.KgNr:00000})", 8))))
|
||||
.AddCell(NewTd(areaCom.Rd?.Name))
|
||||
var c = areaCom.Contract;
|
||||
tbl.AddCell(NewTd(new KernedParagraph(10).Add(Normal($"{c.Kg.AtKg.Name} ")).Add(Normal($"({c.Kg.AtKg.KgNr:00000})", 8))))
|
||||
.AddCell(NewTd(c.Rd?.Name))
|
||||
.AddCell(NewTd(Regex.Replace(areaCom.GstNr.Replace(",", ", ").Replace("-", "\u2013"), @"\s+", " "), 10))
|
||||
.AddCell(NewTd($"{areaCom.Area:N0}", right: true))
|
||||
.AddCell(NewTd(areaCom.WineCult?.Name, center: true))
|
||||
.AddCell(NewTd(areaCom.YearTo == null ? (areaCom.YearFrom == null ? "unbefristet" : $"ab {areaCom.YearFrom}") : (areaCom.YearFrom == null ? $"bis {areaCom.YearTo}" : $"{areaCom.YearFrom}–{areaCom.YearTo}"), center: true));
|
||||
.AddCell(NewTd(c.YearTo == null ? (c.YearFrom == null ? "unbefristet" : $"ab {c.YearFrom}") : (c.YearFrom == null ? $"bis {c.YearTo}" : $"{c.YearFrom}–{c.YearTo}"), center: true));
|
||||
lastContract = contractType.Type.DisplayName;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Elwig.Models.Entities;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
using System;
|
||||
using System.Windows;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Data.Sqlite;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Collections.Generic;
|
||||
using Elwig.Models.Dtos;
|
||||
using Elwig.Models.Entities;
|
||||
using Microsoft.Data.Sqlite;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace Elwig.Helpers {
|
||||
|
||||
@@ -48,6 +48,7 @@ namespace Elwig.Helpers {
|
||||
public DbSet<MemberTelNr> MemberTelephoneNrs { get; private set; }
|
||||
public DbSet<MemberEmailAddr> MemberEmailAddrs { get; private set; }
|
||||
public DbSet<MemberHistory> MemberHistory { get; private set; }
|
||||
public DbSet<AreaComContract> AreaCommitmentContracts { get; private set; }
|
||||
public DbSet<AreaCom> AreaCommitments { get; private set; }
|
||||
public DbSet<Season> Seasons { get; private set; }
|
||||
public DbSet<DeliverySchedule> DeliverySchedules { get; private set; }
|
||||
@@ -142,7 +143,7 @@ namespace Elwig.Helpers {
|
||||
}
|
||||
|
||||
public async Task<bool> FbNrExists(int fbnr) {
|
||||
return await AreaCommitments.FindAsync(fbnr) != null;
|
||||
return await AreaCommitmentContracts.FindAsync(fbnr) != null;
|
||||
}
|
||||
|
||||
public async Task<bool> SortIdExists(string sortId) {
|
||||
@@ -166,11 +167,18 @@ namespace Elwig.Helpers {
|
||||
|
||||
public async Task<int> NextFbNr() {
|
||||
int c = 0;
|
||||
(await AreaCommitments.OrderBy(ac => ac.FbNr).Select(ac => ac.FbNr).ToListAsync())
|
||||
(await AreaCommitmentContracts.OrderBy(ac => ac.FbNr).Select(ac => ac.FbNr).ToListAsync())
|
||||
.ForEach(a => { if (a <= c + 10000) c = a; });
|
||||
return c + 1;
|
||||
}
|
||||
|
||||
public async Task<int> NextRevNr(int fbnr) {
|
||||
int c = 0;
|
||||
(await AreaCommitments.Where(c => c.FbNr == fbnr).Select(c => c.RevNr).ToListAsync())
|
||||
.ForEach(a => { if (a <= c + 100) c = a; });
|
||||
return c + 1;
|
||||
}
|
||||
|
||||
public async Task<int> NextLNr(DateOnly date, string zwstid) {
|
||||
var dateStr = date.ToString("yyyy-MM-dd");
|
||||
int c = 0;
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace Elwig.Helpers {
|
||||
public static class AppDbUpdater {
|
||||
|
||||
// Don't forget to update value in Tests/fetch-resources.bat!
|
||||
public static readonly int RequiredSchemaVersion = 37;
|
||||
public static readonly int RequiredSchemaVersion = 38;
|
||||
|
||||
private static int VersionOffset = 0;
|
||||
|
||||
|
||||
@@ -60,13 +60,14 @@ namespace Elwig.Helpers.Export {
|
||||
List<MemberTelNr> TelephoneNumbers,
|
||||
List<MemberEmailAddr> EmailAddresses,
|
||||
List<AreaCom> AreaCommitments,
|
||||
List<AreaComContract> Contracts,
|
||||
List<WbRd> Riede,
|
||||
List<WbKg> WbKgs,
|
||||
List<WbGl> WbGls,
|
||||
List<Delivery> Deliveries,
|
||||
List<DeliveryPart> DeliveryParts,
|
||||
List<DeliveryPartModifier> Modifiers,
|
||||
Dictionary<string, List<(int Id1, int Id2, DateTime CreatedAt, DateTime ModifiedAt)>> Timestamps)>();
|
||||
Dictionary<string, List<(int Id1, int Id2, int Id3, DateTime CreatedAt, DateTime ModifiedAt)>> Timestamps)>();
|
||||
|
||||
var metaData = new List<(string FileName, string ZwstId, string Device,
|
||||
int? MemberNum, string? MemberFilters,
|
||||
@@ -75,10 +76,12 @@ namespace Elwig.Helpers.Export {
|
||||
|
||||
foreach (var filename in filenames) {
|
||||
try {
|
||||
data.Add(new([], [], [], [], [], [], [], new([], [], [], [], new() {
|
||||
data.Add(new([], [], [], [], [], [], [], new([], [], [], [], [], new() {
|
||||
["member"] = [],
|
||||
["area_commitment_contract"] = [],
|
||||
["area_commitment"] = [],
|
||||
["delivery"] = [],
|
||||
["delivery_part"] = [],
|
||||
})));
|
||||
var r = data[^1];
|
||||
|
||||
@@ -86,9 +89,11 @@ namespace Elwig.Helpers.Export {
|
||||
using var zip = ZipFile.Open(filename, ZipArchiveMode.Read);
|
||||
await zip.CheckIntegrity();
|
||||
|
||||
string[] acceptableVersions = ["1", "2"];
|
||||
var version = zip.GetEntry("version");
|
||||
using (var reader = new StreamReader(version!.Open(), Utils.UTF8)) {
|
||||
if (await reader.ReadToEndAsync() != "elwig:1")
|
||||
var v = await reader.ReadToEndAsync();
|
||||
if (!v.StartsWith("elwig:") || !acceptableVersions.Contains(v[6..]))
|
||||
throw new FileFormatException($"Ungültige Elwig-Export-Datei ({filename})");
|
||||
}
|
||||
|
||||
@@ -96,8 +101,8 @@ namespace Elwig.Helpers.Export {
|
||||
var meta = await JsonNode.ParseAsync(metaJson!.Open());
|
||||
var memberCount = meta!["members"]?["count"]?.AsValue().GetValue<int>();
|
||||
var memberFilters = meta!["members"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
||||
var areaComCount = meta!["area_commitments"]?["count"]?.AsValue().GetValue<int>();
|
||||
var areaComFilters = meta!["area_commitments"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
||||
var areaComCount = meta!["area_commitment_contracts"]?["count"]?.AsValue().GetValue<int>();
|
||||
var areaComFilters = meta!["area_commitment_contracts"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
||||
var deliveryCount = meta!["deliveries"]?["count"]?.AsValue().GetValue<int>();
|
||||
var deliveryFilters = meta!["deliveries"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
||||
metaData.Add((Path.GetFileName(filename),
|
||||
@@ -133,23 +138,48 @@ namespace Elwig.Helpers.Export {
|
||||
r.TelephoneNumbers.AddRange(telNrs);
|
||||
r.EmailAddresses.AddRange(emailAddrs);
|
||||
if (timestamps.HasValue)
|
||||
r.Timestamps["member"].Add((m.MgNr, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
|
||||
r.Timestamps["member"].Add((m.MgNr, 0, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
|
||||
}
|
||||
}
|
||||
|
||||
// legacy area commitments
|
||||
var areaComsJson = zip.GetEntry("area_commitments.json");
|
||||
if (areaComsJson != null) {
|
||||
using var reader = new StreamReader(areaComsJson.Open(), Utils.UTF8);
|
||||
string? line;
|
||||
while ((line = await reader.ReadLineAsync()) != null) {
|
||||
var obj = JsonNode.Parse(line)!.AsObject();
|
||||
var (areaCom, wbrd, timestamps) = obj.ToAreaCom(currentWbRde);
|
||||
var (contract, areaCom, wbrd, timestamps) = obj.ToAreaCom(currentWbRde);
|
||||
r.Contracts.Add(contract);
|
||||
r.AreaCommitments.Add(areaCom);
|
||||
if (wbrd != null) {
|
||||
r.Riede.Add(wbrd);
|
||||
}
|
||||
if (timestamps.HasValue) {
|
||||
r.Timestamps["area_commitment_contract"].Add((contract.FbNr, 0, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
|
||||
r.Timestamps["area_commitment"].Add((areaCom.FbNr, areaCom.RevNr, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var contractsJson = zip.GetEntry("area_commitment_contracts.json");
|
||||
if (contractsJson != null) {
|
||||
using var reader = new StreamReader(contractsJson.Open(), Utils.UTF8);
|
||||
string? line;
|
||||
while ((line = await reader.ReadLineAsync()) != null) {
|
||||
var obj = JsonNode.Parse(line)!.AsObject();
|
||||
var (contract, areaComs, wbrd, timestamps) = obj.ToAreaComContract(currentWbRde);
|
||||
r.Contracts.Add(contract);
|
||||
r.AreaCommitments.AddRange(areaComs.Select(v => v.Item1));
|
||||
if (wbrd != null) {
|
||||
r.Riede.Add(wbrd);
|
||||
}
|
||||
if (timestamps.HasValue)
|
||||
r.Timestamps["area_commitment"].Add((areaCom.FbNr, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
|
||||
r.Timestamps["area_commitment_contract"].Add((contract.FbNr, 0, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
|
||||
foreach (var (areaCom, ts) in areaComs) {
|
||||
if (!ts.HasValue) continue;
|
||||
r.Timestamps["area_commitment"].Add((areaCom.FbNr, areaCom.RevNr, 0, ts.Value.CreatedAt, ts.Value.ModifiedAt));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,11 +191,15 @@ namespace Elwig.Helpers.Export {
|
||||
var obj = JsonNode.Parse(line)!.AsObject();
|
||||
var (d, parts, mods, rde, timestamps) = obj.ToDelivery(currentLsNrs, currentDids, kgs, currentWbRde);
|
||||
r.Deliveries.Add(d);
|
||||
r.DeliveryParts.AddRange(parts);
|
||||
r.DeliveryParts.AddRange(parts.Select(p => p.Item1));
|
||||
r.Modifiers.AddRange(mods);
|
||||
r.Riede.AddRange(rde);
|
||||
if (timestamps.HasValue)
|
||||
r.Timestamps["delivery"].Add((d.Year, d.DId, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
|
||||
r.Timestamps["delivery"].Add((d.Year, d.DId, 0, timestamps.Value.CreatedAt, timestamps.Value.ModifiedAt));
|
||||
foreach (var (part, ts) in parts) {
|
||||
if (!ts.HasValue) continue;
|
||||
r.Timestamps["area_commitment"].Add((part.Year, part.DId, part.DPNr, ts.Value.CreatedAt, ts.Value.ModifiedAt));
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception exc) when (
|
||||
@@ -189,11 +223,11 @@ namespace Elwig.Helpers.Export {
|
||||
}
|
||||
}
|
||||
|
||||
var importedMembers = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string Filters)>();
|
||||
var importedAreaComs = new List<(string FileName, string ZwstId, string Device, int Imported, int NotImported, string Filters)>();
|
||||
var importedDeliveries = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string Filters)>();
|
||||
var importedMembers = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string? Filters)>();
|
||||
var importedAreaComs = new List<(string FileName, string ZwstId, string Device, int Imported, int NotImported, string? Filters)>();
|
||||
var importedDeliveries = new List<(string FileName, string ZwstId, string Device, int New, int Overwritten, int NotImported, string? Filters)>();
|
||||
|
||||
foreach (var ((members, billingAddresses, telephoneNumbers, emailAddresses, areaCommitments, riede, wbKgs, wbGls, deliveries, deliveryParts, modifiers, timestamps), meta) in data.Zip(metaData)) {
|
||||
foreach (var ((members, billingAddresses, telephoneNumbers, emailAddresses, areaCommitments, contracts, riede, wbKgs, wbGls, deliveries, deliveryParts, modifiers, timestamps), meta) in data.Zip(metaData)) {
|
||||
var branch = branches[meta.ZwstId];
|
||||
var device = meta.Device;
|
||||
|
||||
@@ -220,11 +254,20 @@ namespace Elwig.Helpers.Export {
|
||||
if (duplicateMgNrs.Count > 0)
|
||||
importDuplicateMembers = ImportQuestion(branch.Name, device, "Mitglieder", true, duplicateMgNrs.Count);
|
||||
|
||||
var fbnrs = areaCommitments.Select(c => c.FbNr).ToList();
|
||||
var duplicateFbNrs = await ctx.AreaCommitments
|
||||
var fbnrs = contracts.Select(c => c.FbNr).ToList();
|
||||
var duplicateFbNrs = await ctx.AreaCommitmentContracts
|
||||
.Where(c => fbnrs.Contains(c.FbNr))
|
||||
.Select(c => c.FbNr)
|
||||
.ToListAsync();
|
||||
bool importNewContracts = false, importDuplicateContracts = false;
|
||||
if (mode == ImportMode.Interactively) {
|
||||
if (fbnrs.Count - duplicateFbNrs.Count > 0)
|
||||
importNewContracts = ImportQuestion(branch.Name, device, "Flächenbindungsverträge", false, fbnrs.Count - duplicateFbNrs.Count);
|
||||
} else {
|
||||
importNewContracts = true;
|
||||
}
|
||||
if (duplicateFbNrs.Count > 0)
|
||||
importDuplicateContracts = ImportQuestion(branch.Name, device, "Flächenbindungsverträge", true, duplicateFbNrs.Count);
|
||||
|
||||
var lsnrs = deliveries.Select(d => d.LsNr).ToList();
|
||||
var duplicateLsNrs = await ctx.Deliveries
|
||||
@@ -258,7 +301,7 @@ namespace Elwig.Helpers.Export {
|
||||
importDuplicateDeliveries = ImportQuestion(branch.Name, device, "Lieferungen", true, duplicateLsNrs.Count);
|
||||
}
|
||||
|
||||
if (importDuplicateMembers || importNewMembers || importDuplicateDeliveries || importNewDeliveries) {
|
||||
if (importDuplicateMembers || importNewMembers || importDuplicateContracts || importNewContracts || importDuplicateDeliveries || importNewDeliveries) {
|
||||
ctx.AddRange(wbGls);
|
||||
ctx.UpdateRange(wbKgs.Where(k => duplicateKgNrs.Contains(k.KgNr)));
|
||||
ctx.AddRange(wbKgs.Where(k => !duplicateKgNrs.Contains(k.KgNr)));
|
||||
@@ -272,25 +315,31 @@ namespace Elwig.Helpers.Export {
|
||||
ctx.AddRange(billingAddresses.Where(a => duplicateMgNrs.Contains(a.MgNr)));
|
||||
ctx.AddRange(telephoneNumbers.Where(n => duplicateMgNrs.Contains(n.MgNr)));
|
||||
ctx.AddRange(emailAddresses.Where(a => duplicateMgNrs.Contains(a.MgNr)));
|
||||
ctx.UpdateRange(areaCommitments.Where(c => duplicateMgNrs.Contains(c.MgNr) && duplicateFbNrs.Contains(c.FbNr)));
|
||||
ctx.AddRange(areaCommitments.Where(c => duplicateMgNrs.Contains(c.MgNr) && !duplicateFbNrs.Contains(c.FbNr)));
|
||||
}
|
||||
if (importNewMembers) {
|
||||
ctx.AddRange(members.Where(m => !duplicateMgNrs.Contains(m.MgNr)));
|
||||
ctx.AddRange(billingAddresses.Where(a => !duplicateMgNrs.Contains(a.MgNr)));
|
||||
ctx.AddRange(telephoneNumbers.Where(n => !duplicateMgNrs.Contains(n.MgNr)));
|
||||
ctx.AddRange(emailAddresses.Where(a => !duplicateMgNrs.Contains(a.MgNr)));
|
||||
ctx.UpdateRange(areaCommitments.Where(c => !duplicateMgNrs.Contains(c.MgNr) && duplicateFbNrs.Contains(c.FbNr)));
|
||||
ctx.AddRange(areaCommitments.Where(c => !duplicateMgNrs.Contains(c.MgNr) && !duplicateFbNrs.Contains(c.FbNr)));
|
||||
}
|
||||
if (members.Count > 0) {
|
||||
var n = importNewMembers ? members.Count - duplicateMgNrs.Count : 0;
|
||||
var o = importDuplicateMembers ? duplicateMgNrs.Count : 0;
|
||||
importedMembers.Add((meta.FileName, meta.ZwstId, meta.Device, n, o, members.Count - n - o, meta.MemberFilters));
|
||||
}
|
||||
if (areaCommitments.Count > 0) {
|
||||
|
||||
if (importDuplicateContracts) {
|
||||
ctx.RemoveRange(ctx.AreaCommitments.Where(c => duplicateFbNrs.Contains(c.FbNr)));
|
||||
ctx.UpdateRange(contracts.Where(c => duplicateFbNrs.Contains(c.FbNr)));
|
||||
ctx.AddRange(areaCommitments.Where(c => duplicateFbNrs.Contains(c.FbNr)));
|
||||
}
|
||||
if (importNewContracts) {
|
||||
ctx.AddRange(contracts.Where(c => !duplicateFbNrs.Contains(c.FbNr)));
|
||||
ctx.AddRange(areaCommitments.Where(c => !duplicateFbNrs.Contains(c.FbNr)));
|
||||
}
|
||||
if (contracts.Count > 0) {
|
||||
ctx.AddRange(riede);
|
||||
var imported = areaCommitments.Where(c => (importNewMembers && !duplicateMgNrs.Contains(c.MgNr)) || (importDuplicateMembers && duplicateMgNrs.Contains(c.MgNr))).ToList();
|
||||
var imported = contracts.Where(c => (importNewContracts && !duplicateFbNrs.Contains(c.FbNr)) || (importDuplicateContracts && duplicateFbNrs.Contains(c.FbNr))).ToList();
|
||||
importedAreaComs.Add((meta.FileName, meta.ZwstId, meta.Device, imported.Count, areaCommitments.Count - imported.Count, meta.AreaComFilters));
|
||||
}
|
||||
|
||||
@@ -335,15 +384,17 @@ namespace Elwig.Helpers.Export {
|
||||
await ctx.SaveChangesAsync();
|
||||
|
||||
var primaryKeys = new Dictionary<string, string>() {
|
||||
["member"] = "mgnr, 0",
|
||||
["area_commitment"] = "fbnr, 0",
|
||||
["delivery"] = "year, did",
|
||||
["member"] = "mgnr, 0, 0",
|
||||
["area_commitment_contract"] = "fbnr, 0, 0",
|
||||
["area_commitment"] = "fbnr, revnr, 0",
|
||||
["delivery"] = "year, did, 0",
|
||||
["delivery_part"] = "year, did, dpnr",
|
||||
};
|
||||
var updateStmts = timestamps
|
||||
.SelectMany(e => e.Value.Select(m => $"UPDATE {e.Key} " +
|
||||
$"SET ctime = {((DateTimeOffset)m.CreatedAt.ToUniversalTime()).ToUnixTimeSeconds()}, " +
|
||||
$"mtime = {((DateTimeOffset)m.ModifiedAt.ToUniversalTime()).ToUnixTimeSeconds()} " +
|
||||
$"WHERE ({primaryKeys[e.Key]}) = ({m.Id1}, {m.Id2});"));
|
||||
$"WHERE ({primaryKeys[e.Key]}) = ({m.Id1}, {m.Id2}, {m.Id3});"));
|
||||
using var cnx = AppDbContext.Connect();
|
||||
await cnx.ExecuteBatch($"""
|
||||
BEGIN;
|
||||
@@ -407,7 +458,7 @@ namespace Elwig.Helpers.Export {
|
||||
}.Export(filename);
|
||||
}
|
||||
|
||||
public static Task Export(string filename, IEnumerable<Member> members, IEnumerable<AreaCom> areaComs, IEnumerable<WbKg> wbKgs, IEnumerable<string> filters) {
|
||||
public static Task Export(string filename, IEnumerable<Member> members, IEnumerable<AreaComContract> areaComs, IEnumerable<WbKg> wbKgs, IEnumerable<string> filters) {
|
||||
return new ElwigExport {
|
||||
Members = (members, filters),
|
||||
AreaComs = (areaComs, ["von exportierten Mitgliedern"]),
|
||||
@@ -425,7 +476,7 @@ namespace Elwig.Helpers.Export {
|
||||
public class ElwigExport {
|
||||
public (IEnumerable<WbKg> WbKgs, IEnumerable<string> Filters)? WbKgs { get; set; }
|
||||
public (IEnumerable<Member> Members, IEnumerable<string> Filters)? Members { get; set; }
|
||||
public (IEnumerable<AreaCom> AreaComs, IEnumerable<string> Filters)? AreaComs { get; set; }
|
||||
public (IEnumerable<AreaComContract> AreaComs, IEnumerable<string> Filters)? AreaComs { get; set; }
|
||||
public (IEnumerable<Delivery> Deliveries, IEnumerable<string> Filters)? Deliveries { get; set; }
|
||||
|
||||
public async Task Export(string filename) {
|
||||
@@ -434,7 +485,7 @@ namespace Elwig.Helpers.Export {
|
||||
|
||||
var version = zip.CreateEntry("version", CompressionLevel.NoCompression);
|
||||
using (var writer = new StreamWriter(version.Open(), Utils.UTF8)) {
|
||||
await writer.WriteAsync("elwig:1");
|
||||
await writer.WriteAsync("elwig:2");
|
||||
}
|
||||
|
||||
var meta = zip.CreateEntry("meta.json", CompressionLevel.NoCompression);
|
||||
@@ -456,8 +507,9 @@ namespace Elwig.Helpers.Export {
|
||||
["filters"] = new JsonArray(Members.Value.Filters.Select(f => (JsonNode)f).ToArray()),
|
||||
};
|
||||
if (AreaComs != null)
|
||||
obj["area_commitments"] = new JsonObject {
|
||||
obj["area_commitment_contracts"] = new JsonObject {
|
||||
["count"] = AreaComs.Value.AreaComs.Count(),
|
||||
["revisions"] = AreaComs.Value.AreaComs.Sum(c => c.Revisions.Count),
|
||||
["filters"] = new JsonArray(AreaComs.Value.Filters.Select(f => (JsonNode)f).ToArray()),
|
||||
};
|
||||
if (Deliveries != null)
|
||||
@@ -485,7 +537,7 @@ namespace Elwig.Helpers.Export {
|
||||
}
|
||||
}
|
||||
if (AreaComs != null) {
|
||||
var json = zip.CreateEntry("area_commitments.json", CompressionLevel.SmallestSize);
|
||||
var json = zip.CreateEntry("area_commitment_contracts.json", CompressionLevel.SmallestSize);
|
||||
using var writer = new StreamWriter(json.Open(), Utils.UTF8);
|
||||
foreach (var c in AreaComs.Value.AreaComs) {
|
||||
await writer.WriteLineAsync(c.ToJson().ToJsonString(Utils.JsonOpts));
|
||||
@@ -639,42 +691,102 @@ namespace Elwig.Helpers.Export {
|
||||
CountryNum = a["country"]!.AsValue().GetValue<int>(),
|
||||
PostalDestId = a["postal_dest"]!.AsValue().GetValue<string>(),
|
||||
Address = a["address"]!.AsValue().GetValue<string>(),
|
||||
} : null, json["telephone_numbers"]!.AsArray().Select(n => n!.AsObject()).Select((n, i) => new MemberTelNr {
|
||||
} : null, [.. json["telephone_numbers"]!.AsArray().Select(n => n!.AsObject()).Select((n, i) => new MemberTelNr {
|
||||
MgNr = mgnr,
|
||||
Nr = i + 1,
|
||||
Type = n["type"]!.AsValue().GetValue<string>(),
|
||||
Number = n["number"]!.AsValue().GetValue<string>(),
|
||||
Comment = n["comment"]?.AsValue().GetValue<string>(),
|
||||
}).ToList(), json["email_addresses"]!.AsArray().Select(a => a!.AsObject()).Select((a, i) => new MemberEmailAddr {
|
||||
})], [.. json["email_addresses"]!.AsArray().Select(a => a!.AsObject()).Select((a, i) => new MemberEmailAddr {
|
||||
MgNr = mgnr,
|
||||
Nr = i + 1,
|
||||
Address = a["address"]!.AsValue().GetValue<string>(),
|
||||
Comment = a["comment"]?.AsValue().GetValue<string>(),
|
||||
}).ToList(),
|
||||
})],
|
||||
createdAt == null || modifiedAt == null ? null :
|
||||
(DateTime.ParseExact(createdAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None),
|
||||
DateTime.ParseExact(modifiedAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None)));
|
||||
}
|
||||
|
||||
public static JsonObject ToJson(this AreaCom c) {
|
||||
public static JsonObject ToJson(this AreaComContract c) {
|
||||
return new JsonObject {
|
||||
["fbnr"] = c.FbNr,
|
||||
["mgnr"] = c.MgNr,
|
||||
["vtrgid"] = c.VtrgId,
|
||||
["cultid"] = c.CultId,
|
||||
["area"] = c.Area,
|
||||
["kgnr"] = c.KgNr,
|
||||
["gstnr"] = c.GstNr,
|
||||
["ried"] = c.Rd?.Name,
|
||||
["year_from"] = c.YearFrom,
|
||||
["year_to"] = c.YearTo,
|
||||
["revisions"] = new JsonArray(c.Revisions.OrderBy(r => r.RevNr).Select(r => r.ToJson()).ToArray()),
|
||||
["comment"] = c.Comment,
|
||||
["created_at"] = $"{c.CreatedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||
["modified_at"] = $"{c.ModifiedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||
};
|
||||
}
|
||||
|
||||
public static (AreaCom, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaCom(this JsonNode json, Dictionary<int, List<WbRd>> riede) {
|
||||
private static JsonObject ToJson(this AreaCom c) {
|
||||
return new JsonObject {
|
||||
["revnr"] = c.RevNr,
|
||||
["mgnr"] = c.MgNr,
|
||||
["vtrgid"] = c.VtrgId,
|
||||
["cultid"] = c.CultId,
|
||||
["area"] = c.Area,
|
||||
["gstnr"] = c.GstNr,
|
||||
["year_from"] = c.YearFrom,
|
||||
["year_to"] = c.YearTo,
|
||||
["created_at"] = $"{c.CreatedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||
["modified_at"] = $"{c.ModifiedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||
};
|
||||
}
|
||||
|
||||
public static (AreaComContract, List<(AreaCom, (DateTime CreatedAt, DateTime ModifiedAt)?)>, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaComContract(this JsonNode json, Dictionary<int, List<WbRd>> riede) {
|
||||
var kgnr = json["kgnr"]!.AsValue().GetValue<int>();
|
||||
var ried = json["ried"]?.AsValue().GetValue<string>();
|
||||
var fbnr = json["fbnr"]!.AsValue()!.GetValue<int>();
|
||||
WbRd? rd = null;
|
||||
bool newRd = false;
|
||||
if (ried != null) {
|
||||
var rde = riede.GetValueOrDefault(kgnr, []);
|
||||
rd = rde.FirstOrDefault(r => r.Name == ried);
|
||||
if (rd == null) {
|
||||
newRd = true;
|
||||
rd = new WbRd {
|
||||
KgNr = kgnr,
|
||||
RdNr = (rde.Count == 0 ? 1 : rde.Max(r => r.RdNr)) + 1,
|
||||
Name = ried,
|
||||
};
|
||||
rde.Add(rd);
|
||||
riede[rd.KgNr] = rde;
|
||||
}
|
||||
}
|
||||
var createdAt = json["created_at"]?.AsValue().GetValue<string>();
|
||||
var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>();
|
||||
return (new AreaComContract {
|
||||
FbNr = fbnr,
|
||||
KgNr = kgnr,
|
||||
RdNr = rd?.RdNr ?? json["rdnr"]?.AsValue().GetValue<int>(),
|
||||
Comment = json["comment"]?.AsValue().GetValue<string>(),
|
||||
ImportedAt = DateTime.Now,
|
||||
}, [.. json["revisions"]!.AsArray().Select(r => r!.AsObject()).Select<JsonObject, (AreaCom, (DateTime, DateTime)?)>(r => {
|
||||
var createdAt = json["created_at"]?.AsValue().GetValue<string>();
|
||||
var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>();
|
||||
return (new AreaCom {
|
||||
FbNr = fbnr,
|
||||
RevNr = r["revnr"]!.AsValue().GetValue<int>(),
|
||||
MgNr = r["mgnr"]!.AsValue().GetValue<int>(),
|
||||
VtrgId = r["vtrgid"]!.AsValue().GetValue<string>(),
|
||||
CultId = r["cultid"]?.AsValue().GetValue<string>(),
|
||||
Area = r["area"]!.AsValue().GetValue<int>(),
|
||||
GstNr = r["gstnr"]?.AsValue().GetValue<string>() ?? "-",
|
||||
YearFrom = r["year_from"]?.AsValue().GetValue<int>(),
|
||||
YearTo = r["year_to"]?.AsValue().GetValue<int>(),
|
||||
ImportedAt = DateTime.Now,
|
||||
}, createdAt == null || modifiedAt == null ? null :
|
||||
(DateTime.ParseExact(createdAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None),
|
||||
DateTime.ParseExact(modifiedAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None)));
|
||||
})], newRd ? rd : null,
|
||||
createdAt == null || modifiedAt == null ? null :
|
||||
(DateTime.ParseExact(createdAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None),
|
||||
DateTime.ParseExact(modifiedAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None)));
|
||||
}
|
||||
|
||||
public static (AreaComContract, AreaCom, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaCom(this JsonNode json, Dictionary<int, List<WbRd>> riede) {
|
||||
var kgnr = json["kgnr"]!.AsValue().GetValue<int>();
|
||||
var ried = json["ried"]?.AsValue().GetValue<string>();
|
||||
WbRd? rd = null;
|
||||
@@ -695,18 +807,22 @@ namespace Elwig.Helpers.Export {
|
||||
}
|
||||
var createdAt = json["created_at"]?.AsValue().GetValue<string>();
|
||||
var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>();
|
||||
return (new AreaCom {
|
||||
return (new AreaComContract {
|
||||
FbNr = json["fbnr"]!.AsValue().GetValue<int>(),
|
||||
KgNr = kgnr,
|
||||
RdNr = rd?.RdNr ?? json["rdnr"]?.AsValue().GetValue<int>(),
|
||||
Comment = json["comment"]?.AsValue().GetValue<string>(),
|
||||
ImportedAt = DateTime.Now,
|
||||
}, new AreaCom {
|
||||
FbNr = json["fbnr"]!.AsValue().GetValue<int>(),
|
||||
RevNr = 1,
|
||||
MgNr = json["mgnr"]!.AsValue().GetValue<int>(),
|
||||
VtrgId = json["vtrgid"]!.AsValue().GetValue<string>(),
|
||||
CultId = json["cultid"]?.AsValue().GetValue<string>(),
|
||||
Area = json["area"]!.AsValue().GetValue<int>(),
|
||||
KgNr = kgnr,
|
||||
GstNr = json["gstnr"]?.AsValue().GetValue<string>() ?? "-",
|
||||
RdNr = rd?.RdNr ?? json["rdnr"]?.AsValue().GetValue<int>(),
|
||||
YearFrom = json["year_from"]?.AsValue().GetValue<int>(),
|
||||
YearTo = json["year_to"]?.AsValue().GetValue<int>(),
|
||||
Comment = json["comment"]?.AsValue().GetValue<string>(),
|
||||
ImportedAt = DateTime.Now,
|
||||
}, newRd ? rd : null,
|
||||
createdAt == null || modifiedAt == null ? null :
|
||||
@@ -723,43 +839,45 @@ namespace Elwig.Helpers.Export {
|
||||
["lnr"] = d.LNr,
|
||||
["time"] = d.Time != null ? $"{d.Time:HH:mm:ss}" : null,
|
||||
["mgnr"] = d.MgNr,
|
||||
["parts"] = new JsonArray(d.Parts.OrderBy(p => p.DPNr).Select(p => {
|
||||
var obj = new JsonObject {
|
||||
["dpnr"] = p.DPNr,
|
||||
["sortid"] = p.SortId,
|
||||
["attrid"] = p.AttrId,
|
||||
["cultid"] = p.CultId,
|
||||
["weight"] = p.Weight,
|
||||
["kmw"] = p.Kmw,
|
||||
["qualid"] = p.QualId,
|
||||
["hkid"] = p.HkId,
|
||||
["kgnr"] = p.KgNr,
|
||||
["ried"] = p.Rd?.Name,
|
||||
["net_weight"] = p.IsNetWeight,
|
||||
["manual_weighing"] = p.IsManualWeighing,
|
||||
["modids"] = new JsonArray(p.Modifiers.Select(m => (JsonNode)m.ModId).ToArray()),
|
||||
["comment"] = p.Comment,
|
||||
["created_at"] = $"{p.CreatedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||
["modified_at"] = $"{p.ModifiedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||
};
|
||||
if (p.IsSplCheck) obj["spl_check"] = p.IsSplCheck;
|
||||
if (p.IsHandPicked != null) obj["hand_picked"] = p.IsHandPicked;
|
||||
if (p.IsGebunden != null) obj["gebunden"] = p.IsGebunden;
|
||||
if (p.Unloading != null) obj["unloading"] = p.Unloading;
|
||||
if (p.Temperature != null) obj["temperature"] = p.Temperature;
|
||||
if (p.Acid != null) obj["acid"] = p.Acid;
|
||||
if (p.ScaleId != null) obj["scale_id"] = p.ScaleId;
|
||||
if (p.WeighingData != null) obj["weighing_data"] = JsonNode.Parse(p.WeighingData);
|
||||
if (p.WeighingReason != null) obj["weighing_reason"] = p.WeighingReason;
|
||||
return obj;
|
||||
}).ToArray()),
|
||||
["parts"] = new JsonArray(d.Parts.OrderBy(p => p.DPNr).Select(p => p.ToJson()).ToArray()),
|
||||
["comment"] = d.Comment,
|
||||
["created_at"] = $"{d.CreatedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||
["modified_at"] = $"{d.ModifiedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||
};
|
||||
}
|
||||
|
||||
public static (Delivery, List<DeliveryPart>, List<DeliveryPartModifier>, List<WbRd>, (DateTime CreatedAt, DateTime ModifiedAt)?) ToDelivery(this JsonNode json, Dictionary<string, int> currentLsNrs, Dictionary<int, int> currentDids, Dictionary<int, AT_Kg> kgs, Dictionary<int, List<WbRd>> riede) {
|
||||
private static JsonObject ToJson(this DeliveryPart p) {
|
||||
var obj = new JsonObject {
|
||||
["dpnr"] = p.DPNr,
|
||||
["sortid"] = p.SortId,
|
||||
["attrid"] = p.AttrId,
|
||||
["cultid"] = p.CultId,
|
||||
["weight"] = p.Weight,
|
||||
["kmw"] = p.Kmw,
|
||||
["qualid"] = p.QualId,
|
||||
["hkid"] = p.HkId,
|
||||
["kgnr"] = p.KgNr,
|
||||
["ried"] = p.Rd?.Name,
|
||||
["net_weight"] = p.IsNetWeight,
|
||||
["manual_weighing"] = p.IsManualWeighing,
|
||||
["modids"] = new JsonArray(p.Modifiers.Select(m => (JsonNode)m.ModId).ToArray()),
|
||||
["comment"] = p.Comment,
|
||||
["created_at"] = $"{p.CreatedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||
["modified_at"] = $"{p.ModifiedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||
};
|
||||
if (p.IsSplCheck) obj["spl_check"] = p.IsSplCheck;
|
||||
if (p.IsHandPicked != null) obj["hand_picked"] = p.IsHandPicked;
|
||||
if (p.IsGebunden != null) obj["gebunden"] = p.IsGebunden;
|
||||
if (p.Unloading != null) obj["unloading"] = p.Unloading;
|
||||
if (p.Temperature != null) obj["temperature"] = p.Temperature;
|
||||
if (p.Acid != null) obj["acid"] = p.Acid;
|
||||
if (p.ScaleId != null) obj["scale_id"] = p.ScaleId;
|
||||
if (p.WeighingData != null) obj["weighing_data"] = JsonNode.Parse(p.WeighingData);
|
||||
if (p.WeighingReason != null) obj["weighing_reason"] = p.WeighingReason;
|
||||
return obj;
|
||||
}
|
||||
|
||||
public static (Delivery, List<(DeliveryPart, (DateTime CreatedAt, DateTime ModifiedAt)?)>, List<DeliveryPartModifier>, List<WbRd>, (DateTime CreatedAt, DateTime ModifiedAt)?) ToDelivery(this JsonNode json, Dictionary<string, int> currentLsNrs, Dictionary<int, int> currentDids, Dictionary<int, AT_Kg> kgs, Dictionary<int, List<WbRd>> riede) {
|
||||
var year = json["year"]!.AsValue().GetValue<int>();
|
||||
var lsnr = json["lsnr"]!.AsValue().GetValue<string>();
|
||||
var did = currentLsNrs.GetValueOrDefault(lsnr, -1);
|
||||
@@ -782,7 +900,7 @@ namespace Elwig.Helpers.Export {
|
||||
MgNr = json["mgnr"]!.AsValue().GetValue<int>(),
|
||||
Comment = json["comment"]?.AsValue().GetValue<string>(),
|
||||
ImportedAt = DateTime.Now,
|
||||
}, json["parts"]!.AsArray().Select(p => p!.AsObject()).Select(p => {
|
||||
}, [.. json["parts"]!.AsArray().Select(p => p!.AsObject()).Select<JsonObject, (DeliveryPart, (DateTime, DateTime)?)>(p => {
|
||||
var kgnr = p["kgnr"]?.AsValue().GetValue<int>();
|
||||
var ried = p["ried"]?.AsValue().GetValue<string>();
|
||||
WbRd? rd = null;
|
||||
@@ -800,7 +918,9 @@ namespace Elwig.Helpers.Export {
|
||||
wbRde.Add(rd);
|
||||
}
|
||||
}
|
||||
return new DeliveryPart {
|
||||
var createdAt = p["created_at"]?.AsValue().GetValue<string>();
|
||||
var modifiedAt = p["modified_at"]?.AsValue().GetValue<string>();
|
||||
return (new DeliveryPart {
|
||||
Year = year,
|
||||
DId = did,
|
||||
DPNr = p["dpnr"]!.AsValue().GetValue<int>(),
|
||||
@@ -825,13 +945,15 @@ namespace Elwig.Helpers.Export {
|
||||
ScaleId = p["scale_id"]?.AsValue().GetValue<string>(),
|
||||
WeighingData = p["weighing_data"]?.AsObject().ToJsonString(Utils.JsonOpts),
|
||||
WeighingReason = p["weighing_reason"]?.AsValue().GetValue<string>(),
|
||||
};
|
||||
}).ToList(), json["parts"]!.AsArray().SelectMany(p => p!["modids"]!.AsArray().Select(m => new DeliveryPartModifier {
|
||||
}, createdAt == null || modifiedAt == null ? null :
|
||||
(DateTime.ParseExact(createdAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None),
|
||||
DateTime.ParseExact(modifiedAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None)));
|
||||
})], [.. json["parts"]!.AsArray().SelectMany(p => p!["modids"]!.AsArray().Select(m => new DeliveryPartModifier {
|
||||
Year = year,
|
||||
DId = did,
|
||||
DPNr = p["dpnr"]!.AsValue().GetValue<int>(),
|
||||
ModId = m!.AsValue().GetValue<string>(),
|
||||
})).ToList(),
|
||||
}))],
|
||||
wbRde,
|
||||
createdAt == null || modifiedAt == null ? null :
|
||||
(DateTime.ParseExact(createdAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None),
|
||||
|
||||
@@ -580,7 +580,7 @@ namespace Elwig.Helpers {
|
||||
}
|
||||
}
|
||||
|
||||
public static ValidationResult CheckFbNr(TextBox input, bool required, AreaCom? c) {
|
||||
public static ValidationResult CheckFbNr(TextBox input, bool required, AreaComContract? c) {
|
||||
var res = CheckInteger(input, required);
|
||||
if (!res.IsValid) {
|
||||
return res;
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
using Elwig.Helpers;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace Elwig.Models.Entities {
|
||||
[Table("area_commitment"), PrimaryKey("FbNr")]
|
||||
[Table("area_commitment"), PrimaryKey("FbNr", "RevNr")]
|
||||
public class AreaCom {
|
||||
[Column("fbnr")]
|
||||
public int FbNr { get; set; }
|
||||
|
||||
[Column("revnr")]
|
||||
public int RevNr { get; set; }
|
||||
|
||||
[Column("mgnr")]
|
||||
public int MgNr { get; set; }
|
||||
|
||||
@@ -22,24 +23,15 @@ namespace Elwig.Models.Entities {
|
||||
[Column("area")]
|
||||
public int Area { get; set; }
|
||||
|
||||
[Column("kgnr")]
|
||||
public int KgNr { get; set; }
|
||||
|
||||
[Column("gstnr")]
|
||||
public required string GstNr { get; set; }
|
||||
|
||||
[Column("rdnr")]
|
||||
public int? RdNr { get; set; }
|
||||
|
||||
[Column("year_from")]
|
||||
public int? YearFrom { get; set; }
|
||||
|
||||
[Column("year_to")]
|
||||
public int? YearTo { get; set; }
|
||||
|
||||
[Column("comment")]
|
||||
public string? Comment { get; set; }
|
||||
|
||||
[Column("ctime"), DatabaseGenerated(DatabaseGeneratedOption.Computed)]
|
||||
public long CTime { get; set; }
|
||||
[NotMapped]
|
||||
@@ -72,6 +64,9 @@ namespace Elwig.Models.Entities {
|
||||
set => ITime = value == null ? null : ((DateTimeOffset)value.Value.ToUniversalTime()).ToUnixTimeSeconds();
|
||||
}
|
||||
|
||||
[ForeignKey("FbNr")]
|
||||
public virtual AreaComContract Contract { get; private set; } = null!;
|
||||
|
||||
[ForeignKey("MgNr")]
|
||||
public virtual Member Member { get; private set; } = null!;
|
||||
|
||||
@@ -80,17 +75,5 @@ namespace Elwig.Models.Entities {
|
||||
|
||||
[ForeignKey("CultId")]
|
||||
public virtual WineCult? WineCult { get; private set; }
|
||||
|
||||
[ForeignKey("KgNr")]
|
||||
public virtual WbKg Kg { get; private set; } = null!;
|
||||
|
||||
[ForeignKey("KgNr, RdNr")]
|
||||
public virtual WbRd? Rd { get; private set; }
|
||||
|
||||
public int SearchScore(IEnumerable<string> keywords) {
|
||||
return Utils.GetSearchScore([
|
||||
WineCult?.Name, Kg.AtKg.Name, Rd?.Name, GstNr, Comment,
|
||||
], keywords);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
78
Elwig/Models/Entities/AreaComContract.cs
Normal file
78
Elwig/Models/Entities/AreaComContract.cs
Normal file
@@ -0,0 +1,78 @@
|
||||
using Elwig.Helpers;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
|
||||
namespace Elwig.Models.Entities {
|
||||
[Table("area_commitment_contract"), PrimaryKey("FbNr")]
|
||||
public class AreaComContract {
|
||||
[Column("fbnr")]
|
||||
public int FbNr { get; set; }
|
||||
|
||||
[Column("kgnr")]
|
||||
public int KgNr { get; set; }
|
||||
|
||||
[Column("rdnr")]
|
||||
public int? RdNr { get; set; }
|
||||
|
||||
[Column("comment")]
|
||||
public string? Comment { get; set; }
|
||||
|
||||
[Column("ctime"), DatabaseGenerated(DatabaseGeneratedOption.Computed)]
|
||||
public long CTime { get; set; }
|
||||
[NotMapped]
|
||||
public DateTime CreatedAt {
|
||||
get => DateTimeOffset.FromUnixTimeSeconds(CTime).LocalDateTime;
|
||||
set => CTime = ((DateTimeOffset)value.ToUniversalTime()).ToUnixTimeSeconds();
|
||||
}
|
||||
|
||||
[Column("mtime"), DatabaseGenerated(DatabaseGeneratedOption.Computed)]
|
||||
public long MTime { get; set; }
|
||||
[NotMapped]
|
||||
public DateTime ModifiedAt {
|
||||
get => DateTimeOffset.FromUnixTimeSeconds(MTime).LocalDateTime;
|
||||
set => MTime = ((DateTimeOffset)value.ToUniversalTime()).ToUnixTimeSeconds();
|
||||
}
|
||||
|
||||
[Column("xtime")]
|
||||
public long? XTime { get; set; }
|
||||
[NotMapped]
|
||||
public DateTime? ExportedAt {
|
||||
get => XTime == null ? null : DateTimeOffset.FromUnixTimeSeconds(XTime.Value).LocalDateTime;
|
||||
set => XTime = value == null ? null : ((DateTimeOffset)value.Value.ToUniversalTime()).ToUnixTimeSeconds();
|
||||
}
|
||||
|
||||
[Column("itime")]
|
||||
public long? ITime { get; set; }
|
||||
[NotMapped]
|
||||
public DateTime? ImportedAt {
|
||||
get => ITime == null ? null : DateTimeOffset.FromUnixTimeSeconds(ITime.Value).LocalDateTime;
|
||||
set => ITime = value == null ? null : ((DateTimeOffset)value.Value.ToUniversalTime()).ToUnixTimeSeconds();
|
||||
}
|
||||
|
||||
[ForeignKey("KgNr")]
|
||||
public virtual WbKg Kg { get; private set; } = null!;
|
||||
|
||||
[ForeignKey("KgNr, RdNr")]
|
||||
public virtual WbRd? Rd { get; private set; }
|
||||
|
||||
[InverseProperty(nameof(AreaCom.Contract))]
|
||||
public virtual ICollection<AreaCom> Revisions { get; private set; } = null!;
|
||||
|
||||
[NotMapped]
|
||||
public AreaCom? Latest => Revisions.OrderBy(r => r.RevNr).LastOrDefault();
|
||||
|
||||
[NotMapped]
|
||||
public int? YearFrom => Revisions.Any(r => r.YearFrom == null) ? null : Revisions.Min(r => r.YearFrom);
|
||||
[NotMapped]
|
||||
public int? YearTo => Revisions.Any(r => r.YearTo == null) ? null : Revisions.Max(r => r.YearTo);
|
||||
|
||||
public int SearchScore(IEnumerable<string> keywords) {
|
||||
return Utils.GetSearchScore([
|
||||
..Revisions.Select(r => r.WineCult?.Name), Kg.AtKg.Name, Rd?.Name, ..Revisions.Select(r => r.GstNr), Comment,
|
||||
], keywords);
|
||||
}
|
||||
}
|
||||
}
|
||||
239
Elwig/Resources/Sql/37-38.sql
Normal file
239
Elwig/Resources/Sql/37-38.sql
Normal file
@@ -0,0 +1,239 @@
|
||||
-- schema version 37 to 38
|
||||
|
||||
UPDATE client_parameter SET value = '0' WHERE param = 'ENABLE_TIME_TRIGGERS';
|
||||
|
||||
DROP TRIGGER t_area_commitment_i_ctime;
|
||||
DROP TRIGGER t_area_commitment_u_ctime;
|
||||
DROP TRIGGER t_area_commitment_i_mtime;
|
||||
DROP TRIGGER t_area_commitment_u_mtime;
|
||||
|
||||
CREATE TABLE area_commitment_contract (
|
||||
fbnr INTEGER NOT NULL,
|
||||
|
||||
kgnr INTEGER NOT NULL,
|
||||
rdnr INTEGER,
|
||||
|
||||
comment TEXT DEFAULT NULL,
|
||||
ctime INTEGER NOT NULL DEFAULT (UNIXEPOCH()),
|
||||
mtime INTEGER NOT NULL DEFAULT (UNIXEPOCH()),
|
||||
xtime INTEGER DEFAULT NULL,
|
||||
itime INTEGER DEFAULT NULL,
|
||||
|
||||
CONSTRAINT area_commitment_contract PRIMARY KEY (fbnr),
|
||||
CONSTRAINT fk_area_commitment_contract_wb_kg FOREIGN KEY (kgnr) REFERENCES wb_kg (kgnr)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE RESTRICT,
|
||||
CONSTRAINT fk_area_commitment_contract_wb_rd FOREIGN KEY (kgnr, rdnr) REFERENCES wb_rd (kgnr, rdnr)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE RESTRICT
|
||||
) STRICT;
|
||||
|
||||
CREATE TABLE area_commitment_new (
|
||||
fbnr INTEGER NOT NULL,
|
||||
revnr INTEGER NOT NULL,
|
||||
mgnr INTEGER NOT NULL,
|
||||
|
||||
vtrgid TEXT NOT NULL,
|
||||
cultid TEXT DEFAULT NULL,
|
||||
area INTEGER NOT NULL,
|
||||
gstnr TEXT NOT NULL,
|
||||
|
||||
year_from INTEGER CHECK (year_from >= 1000 AND year_from <= 9999) DEFAULT NULL,
|
||||
year_to INTEGER CHECK (year_to >= 1000 AND year_to <= 9999) DEFAULT NULL,
|
||||
|
||||
ctime INTEGER NOT NULL DEFAULT (UNIXEPOCH()),
|
||||
mtime INTEGER NOT NULL DEFAULT (UNIXEPOCH()),
|
||||
xtime INTEGER DEFAULT NULL,
|
||||
itime INTEGER DEFAULT NULL,
|
||||
|
||||
CONSTRAINT pk_area_commitment PRIMARY KEY (fbnr, revnr),
|
||||
CONSTRAINT fk_area_commitment_area_commitment_contract FOREIGN KEY (fbnr) REFERENCES area_commitment_contract (fbnr)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE,
|
||||
CONSTRAINT fk_area_commitment_member FOREIGN KEY (mgnr) REFERENCES member (mgnr)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE RESTRICT,
|
||||
CONSTRAINT fk_area_commitment_area_commitment_type FOREIGN KEY (vtrgid) REFERENCES area_commitment_type (vtrgid)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE RESTRICT,
|
||||
CONSTRAINT fk_area_commitment_wine_cultivation FOREIGN KEY (cultid) REFERENCES wine_cultivation (cultid)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE RESTRICT
|
||||
) STRICT;
|
||||
|
||||
INSERT INTO area_commitment_contract (fbnr, kgnr, rdnr, comment, ctime, mtime, xtime, itime)
|
||||
SELECT fbnr, kgnr, rdnr, comment, ctime, mtime, xtime, itime
|
||||
FROM area_commitment;
|
||||
|
||||
INSERT INTO area_commitment_new (fbnr, revnr, mgnr, vtrgid, cultid, area, gstnr, year_from, year_to, ctime, mtime, xtime, itime)
|
||||
SELECT fbnr, 1, mgnr, vtrgid, cultid, area, gstnr, year_from, year_to, ctime, mtime, xtime, itime
|
||||
FROM area_commitment;
|
||||
|
||||
PRAGMA foreign_keys = OFF;
|
||||
PRAGMA writable_schema = ON;
|
||||
DROP TABLE area_commitment;
|
||||
ALTER TABLE area_commitment_new RENAME TO area_commitment;
|
||||
PRAGMA writable_schema = OFF;
|
||||
PRAGMA foreign_keys = ON;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_contract_i_ctime
|
||||
AFTER INSERT ON area_commitment_contract FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1 AND NEW.ctime != UNIXEPOCH()
|
||||
BEGIN
|
||||
UPDATE area_commitment_contract SET ctime = UNIXEPOCH() WHERE fbnr = NEW.fbnr;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_contract_u_ctime
|
||||
BEFORE UPDATE ON area_commitment_contract FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1 AND OLD.ctime != NEW.ctime
|
||||
BEGIN
|
||||
SELECT RAISE(ABORT, 'It is not allowed to change ctime');
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_contract_i_mtime
|
||||
AFTER INSERT ON area_commitment_contract FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1 AND NEW.mtime != UNIXEPOCH()
|
||||
BEGIN
|
||||
UPDATE area_commitment_contract SET mtime = UNIXEPOCH() WHERE fbnr = NEW.fbnr;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_contract_u_mtime
|
||||
AFTER UPDATE ON area_commitment_contract FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1 AND NEW.mtime != UNIXEPOCH()
|
||||
BEGIN
|
||||
UPDATE area_commitment_contract SET mtime = UNIXEPOCH() WHERE fbnr = NEW.fbnr;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_i_ctime
|
||||
AFTER INSERT ON area_commitment FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1 AND NEW.ctime != UNIXEPOCH()
|
||||
BEGIN
|
||||
UPDATE area_commitment SET ctime = UNIXEPOCH() WHERE (fbnr, revnr) = (NEW.fbnr, NEW.revnr);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_u_ctime
|
||||
BEFORE UPDATE ON area_commitment FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1 AND OLD.ctime != NEW.ctime
|
||||
BEGIN
|
||||
SELECT RAISE(ABORT, 'It is not allowed to change ctime');
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_i_mtime
|
||||
AFTER INSERT ON area_commitment FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1 AND NEW.mtime != UNIXEPOCH()
|
||||
BEGIN
|
||||
UPDATE area_commitment SET mtime = UNIXEPOCH() WHERE (fbnr, revnr) = (NEW.fbnr, NEW.revnr);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_u_mtime
|
||||
AFTER UPDATE ON area_commitment FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1 AND NEW.mtime != UNIXEPOCH()
|
||||
BEGIN
|
||||
UPDATE area_commitment SET mtime = UNIXEPOCH() WHERE (fbnr, revnr) = (NEW.fbnr, NEW.revnr);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_i_mtime_contract
|
||||
AFTER INSERT ON area_commitment FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1
|
||||
BEGIN
|
||||
UPDATE area_commitment_contract SET mtime = UNIXEPOCH() WHERE fbnr = NEW.fbnr;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_u_mtime_contract
|
||||
AFTER UPDATE ON area_commitment FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1
|
||||
BEGIN
|
||||
UPDATE area_commitment_contract SET mtime = UNIXEPOCH() WHERE fbnr = NEW.fbnr OR fbnr = OLD.fbnr;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_d_mtime_contract
|
||||
AFTER DELETE ON area_commitment FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1
|
||||
BEGIN
|
||||
UPDATE area_commitment_contract SET mtime = UNIXEPOCH() WHERE fbnr = OLD.fbnr;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_i_mtime_member
|
||||
AFTER INSERT ON area_commitment FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1
|
||||
BEGIN
|
||||
UPDATE member SET mtime = UNIXEPOCH() WHERE mgnr = NEW.mgnr;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_u_mtime_member
|
||||
AFTER UPDATE ON area_commitment FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1
|
||||
BEGIN
|
||||
UPDATE member SET mtime = UNIXEPOCH() WHERE mgnr = NEW.mgnr OR mgnr = OLD.mgnr;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER t_area_commitment_d_mtime_member
|
||||
AFTER DELETE ON area_commitment FOR EACH ROW
|
||||
WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_TIME_TRIGGERS') = 1
|
||||
BEGIN
|
||||
UPDATE member SET mtime = UNIXEPOCH() WHERE mgnr = OLD.mgnr;
|
||||
END;
|
||||
|
||||
-- fix user fiddling - set actual year_from
|
||||
UPDATE area_commitment AS b
|
||||
SET fbnr = a.fbnr, revnr = b.fbnr, year_from = a.year_to + 1
|
||||
FROM area_commitment AS a
|
||||
WHERE a.fbnr < b.fbnr
|
||||
AND COALESCE(a.year_from <= a.year_to, TRUE)
|
||||
AND COALESCE(b.year_from <= b.year_to, TRUE)
|
||||
AND SUBSTR(a.vtrgid, 0, 2) = SUBSTR(b.vtrgid, 0, 2)
|
||||
AND (SELECT c.kgnr = d.kgnr AND COALESCE(c.rdnr = d.rdnr, TRUE) FROM area_commitment_contract c, area_commitment_contract d WHERE c.fbnr = a.fbnr AND d.fbnr = b.fbnr)
|
||||
AND ((IIF(INSTR(a.gstnr, b.gstnr) > 0, 1, 0) + IIF(INSTR(b.gstnr, a.gstnr) > 0, 1, 0) + IIF(a.area = b.area, 2, 0) + (a.mgnr = b.mgnr)) > 1)
|
||||
AND ((a.year_from = b.year_from AND b.year_to IS NULL AND a.year_to IS NOT NULL));
|
||||
|
||||
-- simple
|
||||
UPDATE area_commitment AS b
|
||||
SET fbnr = a.fbnr, revnr = b.fbnr
|
||||
FROM area_commitment AS a
|
||||
WHERE a.fbnr < b.fbnr
|
||||
AND COALESCE(a.year_from <= a.year_to, TRUE)
|
||||
AND COALESCE(b.year_from <= b.year_to, TRUE)
|
||||
AND SUBSTR(a.vtrgid, 0, 2) = SUBSTR(b.vtrgid, 0, 2)
|
||||
AND (SELECT c.kgnr = d.kgnr AND COALESCE(c.rdnr = d.rdnr, TRUE) FROM area_commitment_contract c, area_commitment_contract d WHERE c.fbnr = a.fbnr AND d.fbnr = b.fbnr)
|
||||
AND (a.gstnr = b.gstnr OR a.gstnr IN ('offen', '', '-')) AND a.area = b.area
|
||||
AND a.year_to + 1 = b.year_from;
|
||||
|
||||
-- copy comments
|
||||
UPDATE area_commitment_contract AS b
|
||||
SET comment = IIF(b.comment IS NULL, a.comment, CONCAT(b.comment, '; ', a.comment))
|
||||
FROM area_commitment_contract AS a
|
||||
WHERE a.comment IS NOT NULL AND a.fbnr IN (SELECT revnr FROM area_commitment WHERE revnr > 1 AND fbnr = b.fbnr);
|
||||
|
||||
-- fix revnr
|
||||
UPDATE area_commitment AS b
|
||||
SET revnr = a.revnr + 1
|
||||
FROM area_commitment AS a
|
||||
WHERE a.fbnr = b.fbnr AND a.revnr < b.revnr;
|
||||
UPDATE area_commitment AS b
|
||||
SET revnr = a.revnr + 1
|
||||
FROM area_commitment AS a
|
||||
WHERE a.fbnr = b.fbnr AND a.revnr < b.revnr;
|
||||
UPDATE area_commitment AS b
|
||||
SET revnr = a.revnr + 1
|
||||
FROM area_commitment AS a
|
||||
WHERE a.fbnr = b.fbnr AND a.revnr < b.revnr;
|
||||
|
||||
-- fix year_from
|
||||
UPDATE area_commitment AS b
|
||||
SET year_from = a.year_to + 1
|
||||
FROM area_commitment AS a
|
||||
WHERE a.fbnr = b.fbnr AND a.revnr = b.revnr - 1
|
||||
AND a.year_to = b.year_from;
|
||||
UPDATE area_commitment AS b
|
||||
SET year_from = a.year_to + 1
|
||||
FROM area_commitment AS a
|
||||
WHERE a.fbnr = b.fbnr AND a.revnr = b.revnr - 1
|
||||
AND a.year_to = b.year_from;
|
||||
|
||||
-- delete unreferenced contracts
|
||||
DELETE FROM area_commitment_contract
|
||||
WHERE fbnr IN (SELECT c.fbnr FROM area_commitment_contract c
|
||||
LEFT JOIN area_commitment a ON a.fbnr = c.fbnr
|
||||
WHERE a.fbnr IS NULL);
|
||||
|
||||
UPDATE client_parameter SET value = '1' WHERE param = 'ENABLE_TIME_TRIGGERS';
|
||||
@@ -20,35 +20,39 @@ namespace Elwig.Services {
|
||||
}
|
||||
|
||||
public static void ClearInputs(this AreaComAdminViewModel vm) {
|
||||
vm.Period = null;
|
||||
}
|
||||
|
||||
public static void FillInputs(this AreaComAdminViewModel vm, AreaComContract c) {
|
||||
vm.FbNr = c.FbNr;
|
||||
vm.Period = c.YearTo == null ? $"ab {c.YearFrom}" : $"{c.YearFrom}\u2013{c.YearTo}";
|
||||
vm.Comment = c.Comment;
|
||||
vm.Kg = ControlUtils.GetItemFromSourceWithPk(vm.KgSource, c.KgNr) as AT_Kg;
|
||||
vm.Rd = ControlUtils.GetItemFromSourceWithPk(vm.RdSource, c.KgNr, c.RdNr) as WbRd;
|
||||
}
|
||||
|
||||
public static void FillInputs(this AreaComAdminViewModel vm, AreaCom a) {
|
||||
vm.FbNr = a.FbNr;
|
||||
vm.MgNr = a.MgNr;
|
||||
vm.YearFrom = a.YearFrom;
|
||||
vm.YearTo = a.YearTo;
|
||||
vm.AreaComType = ControlUtils.GetItemFromSourceWithPk(vm.AreaComTypeSource, a.VtrgId) as AreaComType;
|
||||
vm.WineCult = ControlUtils.GetItemFromSourceWithPk(vm.WineCultSource, a.CultId) as WineCult;
|
||||
vm.Comment = a.Comment;
|
||||
vm.Kg = ControlUtils.GetItemFromSourceWithPk(vm.KgSource, a.KgNr) as AT_Kg;
|
||||
vm.Rd = ControlUtils.GetItemFromSourceWithPk(vm.RdSource, a.KgNr, a.RdNr) as WbRd;
|
||||
vm.GstNr = a.GstNr;
|
||||
vm.Area = a.Area;
|
||||
}
|
||||
|
||||
public static async Task<(List<string>, IQueryable<AreaCom>, List<string>)> GetFilters(this AreaComAdminViewModel vm, AppDbContext ctx) {
|
||||
public static async Task<(List<string>, IQueryable<AreaComContract>, IQueryable<AreaCom>, List<string>)> GetFilters(this AreaComAdminViewModel vm, AppDbContext ctx) {
|
||||
List<string> filterNames = [];
|
||||
IQueryable<AreaCom> areaComQuery = ctx.AreaCommitments.Where(a => a.MgNr == vm.FilterMember.MgNr).OrderBy(a => a.FbNr);
|
||||
if (vm.ShowOnlyActiveAreaComs) {
|
||||
areaComQuery = Utils.ActiveAreaCommitments(areaComQuery, Utils.CurrentLastSeason);
|
||||
filterNames.Add($"laufend {Utils.CurrentLastSeason}");
|
||||
if (vm.FilterSeason is int season) {
|
||||
areaComQuery = Utils.ActiveAreaCommitments(areaComQuery, season);
|
||||
filterNames.Add($"laufend {season}");
|
||||
}
|
||||
|
||||
var filterVar = new List<string>();
|
||||
var filterNotVar = new List<string>();
|
||||
var filterAttr = new List<string>();
|
||||
var filterNotAttr = new List<string>();
|
||||
var filterSeasons = new List<int>();
|
||||
|
||||
var filter = vm.TextFilter;
|
||||
if (filter.Count > 0) {
|
||||
@@ -88,10 +92,6 @@ namespace Elwig.Services {
|
||||
filter.RemoveAt(i--);
|
||||
filterNames.Add($"ohne {var[e[1..3].ToUpper()].Name}");
|
||||
filterNames.Add($"ohne Attribut {attrId[e[3..].ToUpper()].Name}");
|
||||
} else if (e.Length == 4 && int.TryParse(e, out var year)) {
|
||||
filterSeasons.Add(year);
|
||||
filter.RemoveAt(i--);
|
||||
filterNames.Add($"laufend {e}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,38 +99,50 @@ namespace Elwig.Services {
|
||||
if (filterNotVar.Count > 0) areaComQuery = areaComQuery.Where(a => !filterNotVar.Contains(a.AreaComType.WineVar.SortId));
|
||||
if (filterAttr.Count > 0) areaComQuery = areaComQuery.Where(a => a.AreaComType.WineAttr!.AttrId != null && filterAttr.Contains(a.AreaComType.WineAttr.AttrId));
|
||||
if (filterNotAttr.Count > 0) areaComQuery = areaComQuery.Where(a => a.AreaComType.WineAttr!.AttrId == null || !filterNotAttr.Contains(a.AreaComType.WineAttr.AttrId));
|
||||
foreach (var year in filterSeasons) areaComQuery = Utils.ActiveAreaCommitments(areaComQuery, year);
|
||||
}
|
||||
|
||||
return (filterNames, areaComQuery, filter);
|
||||
IQueryable<AreaComContract> contracts = areaComQuery
|
||||
.Select(c => c.Contract).Distinct()
|
||||
.OrderBy(c => c.FbNr);
|
||||
|
||||
return (filterNames, contracts, areaComQuery, filter);
|
||||
}
|
||||
|
||||
public static async Task<int> UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr) {
|
||||
public static async Task<(int FbNr, int RevNr)> UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr, int? revNr) {
|
||||
int newFbNr = vm.FbNr!.Value;
|
||||
|
||||
return await Task.Run(async () => {
|
||||
using var ctx = new AppDbContext();
|
||||
var c = new AreaComContract {
|
||||
FbNr = oldFbNr ?? newFbNr,
|
||||
Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
|
||||
KgNr = vm.Kg!.KgNr,
|
||||
RdNr = vm.Rd?.RdNr,
|
||||
};
|
||||
var a = new AreaCom {
|
||||
FbNr = oldFbNr ?? newFbNr,
|
||||
RevNr = revNr ?? await ctx.NextRevNr(oldFbNr ?? newFbNr),
|
||||
MgNr = vm.MgNr!.Value,
|
||||
YearFrom = vm.YearFrom,
|
||||
YearTo = vm.YearTo,
|
||||
VtrgId = vm.AreaComType!.VtrgId,
|
||||
CultId = vm.WineCult?.CultId,
|
||||
Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
|
||||
KgNr = vm.Kg!.KgNr,
|
||||
RdNr = vm.Rd?.RdNr,
|
||||
GstNr = vm.GstNr?.Trim() ?? "-",
|
||||
Area = vm.Area!.Value,
|
||||
};
|
||||
|
||||
if (vm.Rd?.RdNr == 0) {
|
||||
vm.Rd.RdNr = await ctx.NextRdNr(a.KgNr);
|
||||
a.RdNr = vm.Rd.RdNr;
|
||||
vm.Rd.RdNr = await ctx.NextRdNr(c.KgNr);
|
||||
c.RdNr = vm.Rd.RdNr;
|
||||
ctx.Add(vm.Rd);
|
||||
}
|
||||
|
||||
if (oldFbNr != null) {
|
||||
ctx.Update(c);
|
||||
} else {
|
||||
ctx.Add(c);
|
||||
}
|
||||
if (revNr != null) {
|
||||
ctx.Update(a);
|
||||
} else {
|
||||
ctx.Add(a);
|
||||
@@ -139,10 +151,10 @@ namespace Elwig.Services {
|
||||
await ctx.SaveChangesAsync();
|
||||
|
||||
if (newFbNr != a.FbNr) {
|
||||
await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}");
|
||||
await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment_contract SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}");
|
||||
}
|
||||
|
||||
return newFbNr;
|
||||
return (newFbNr, a.RevNr);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -256,7 +268,16 @@ namespace Elwig.Services {
|
||||
public static async Task DeleteAreaCom(int fbnr) {
|
||||
await Task.Run(async () => {
|
||||
using var ctx = new AppDbContext();
|
||||
var l = (await ctx.AreaCommitments.FindAsync(fbnr))!;
|
||||
var l = (await ctx.AreaCommitmentContracts.FindAsync(fbnr))!;
|
||||
ctx.Remove(l);
|
||||
await ctx.SaveChangesAsync();
|
||||
});
|
||||
}
|
||||
|
||||
public static async Task DeleteAreaComRevision(int fbnr, int revnr) {
|
||||
await Task.Run(async () => {
|
||||
using var ctx = new AppDbContext();
|
||||
var l = (await ctx.AreaCommitments.FindAsync(fbnr, revnr))!;
|
||||
ctx.Remove(l);
|
||||
await ctx.SaveChangesAsync();
|
||||
});
|
||||
|
||||
@@ -556,8 +556,10 @@ namespace Elwig.Services {
|
||||
.ToListAsync();
|
||||
var areaComs = await query
|
||||
.SelectMany(m => m.AreaCommitments)
|
||||
.Select(c => c.Contract).Distinct()
|
||||
.Include(c => c.Rd)
|
||||
.Include(c => c.Kg.Gl)
|
||||
.Include(c => c.Revisions)
|
||||
.ToListAsync();
|
||||
var wbKgs = members
|
||||
.Where(m => m.DefaultWbKg != null)
|
||||
@@ -681,19 +683,17 @@ namespace Elwig.Services {
|
||||
.Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year))
|
||||
.ToListAsync();
|
||||
|
||||
var fbNr = await ctx.NextFbNr();
|
||||
ctx.AddRange(areaComs.Select((c, i) => new AreaCom {
|
||||
FbNr = fbNr + i,
|
||||
ctx.AddRange(await Task.WhenAll(areaComs.Select(async (c, i) => new AreaCom {
|
||||
FbNr = c.FbNr,
|
||||
RevNr = await ctx.NextRevNr(c.FbNr),
|
||||
MgNr = m.MgNr,
|
||||
VtrgId = c.VtrgId,
|
||||
CultId = c.CultId,
|
||||
Area = c.Area,
|
||||
KgNr = c.KgNr,
|
||||
GstNr = c.GstNr,
|
||||
RdNr = c.RdNr,
|
||||
YearFrom = vm.MaintainAreaComYearFrom ? c.YearFrom : year,
|
||||
YearFrom = year,
|
||||
YearTo = c.YearTo,
|
||||
}));
|
||||
})));
|
||||
|
||||
foreach (var ac in areaComs)
|
||||
ac.YearTo = year - 1;
|
||||
|
||||
@@ -16,6 +16,7 @@ namespace Elwig.Services {
|
||||
public static class SyncService {
|
||||
|
||||
public static readonly Expression<Func<Member, bool>> ChangedMembers = (m) => ((m.XTime == null && m.MTime > 1751328000) || m.MTime > m.XTime) && (m.ITime == null || m.MTime > m.ITime);
|
||||
public static readonly Expression<Func<AreaComContract, bool>> ChangedAreaComContracts = (c) => ((c.XTime == null && c.MTime > 1751328000) || c.MTime > c.XTime) && (c.ITime == null || c.MTime > c.ITime);
|
||||
public static readonly Expression<Func<Delivery, bool>> ChangedDeliveries = (d) => ((d.XTime == null && d.MTime > 1751328000) || d.MTime > d.XTime) && (d.ITime == null || d.MTime > d.ITime);
|
||||
|
||||
public static async Task Upload(string url, string username, string password, IQueryable<Member> query, IEnumerable<string> filterNames) {
|
||||
@@ -32,9 +33,11 @@ namespace Elwig.Services {
|
||||
.ToListAsync();
|
||||
var areaComs = await query
|
||||
.SelectMany(m => m.AreaCommitments)
|
||||
.OrderBy(c => c.MgNr).ThenBy(c => c.FbNr)
|
||||
.Select(c => c.Contract).Distinct()
|
||||
.OrderBy(c => c.FbNr)
|
||||
.Include(c => c.Rd)
|
||||
.Include(c => c.Kg.Gl)
|
||||
.Include(c => c.Revisions)
|
||||
.ToListAsync();
|
||||
var wbKgs = members
|
||||
.Where(m => m.DefaultWbKg != null)
|
||||
@@ -50,7 +53,7 @@ namespace Elwig.Services {
|
||||
var exportedAt = DateTime.Now;
|
||||
await ElwigData.Export(path, members, areaComs, wbKgs, filterNames);
|
||||
await Utils.UploadExportData(path, url, username, password);
|
||||
await UpdateExportedAt(members, [], exportedAt);
|
||||
await UpdateExportedAt(members, areaComs, [], exportedAt);
|
||||
MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern erfolgreich!", "Mitglieder hochgeladen",
|
||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
@@ -89,7 +92,7 @@ namespace Elwig.Services {
|
||||
var exportedAt = DateTime.Now;
|
||||
await ElwigData.Export(path, list, wbKgs, filterNames);
|
||||
await Utils.UploadExportData(path, url, username, password);
|
||||
await UpdateExportedAt([], list, exportedAt);
|
||||
await UpdateExportedAt([], [], list, exportedAt);
|
||||
MessageBox.Show($"Hochladen von {list.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochgeladen",
|
||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
@@ -106,7 +109,7 @@ namespace Elwig.Services {
|
||||
try {
|
||||
var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip");
|
||||
List<Member> members;
|
||||
List<AreaCom> areaComs;
|
||||
List<AreaComContract> areaComs;
|
||||
List<Delivery> deliveries;
|
||||
using (var ctx = new AppDbContext()) {
|
||||
members = await ctx.Members
|
||||
@@ -118,12 +121,12 @@ namespace Elwig.Services {
|
||||
.OrderBy(m => m.MgNr)
|
||||
.AsSplitQuery()
|
||||
.ToListAsync();
|
||||
areaComs = await ctx.Members
|
||||
.Where(ChangedMembers)
|
||||
.SelectMany(m => m.AreaCommitments)
|
||||
areaComs = await ctx.AreaCommitmentContracts
|
||||
.Where(ChangedAreaComContracts)
|
||||
.Include(c => c.Rd)
|
||||
.Include(c => c.Kg.Gl)
|
||||
.OrderBy(c => c.MgNr).ThenBy(c => c.FbNr)
|
||||
.Include(c => c.Revisions)
|
||||
.OrderBy(c => c.FbNr)
|
||||
.ToListAsync();
|
||||
deliveries = await ctx.Deliveries
|
||||
.Where(ChangedDeliveries)
|
||||
@@ -151,13 +154,13 @@ namespace Elwig.Services {
|
||||
var exportedAt = DateTime.Now;
|
||||
await (new ElwigData.ElwigExport {
|
||||
Members = (members, ["geändert seit letztem Export"]),
|
||||
AreaComs = (areaComs, ["von exportierten Mitgliedern"]),
|
||||
AreaComs = (areaComs, ["geändert seit letztem Export"]),
|
||||
Deliveries = (deliveries, ["geändert seit letzem Export"]),
|
||||
WbKgs = (wbKgs, ["von exportierten Mitgliedern, Flächenbindungen und Lieferungen"]),
|
||||
}).Export(path);
|
||||
await Utils.UploadExportData(path, url, username, password);
|
||||
await UpdateExportedAt(members, deliveries, exportedAt);
|
||||
MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern und {deliveries.Count:N0} Lieferungen erfolgreich!", "Mitglieder und Lieferungen hochladen",
|
||||
await UpdateExportedAt(members, areaComs, deliveries, exportedAt);
|
||||
MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern, {areaComs.Count:N0} Flächenbindungsverträgen, und {deliveries.Count:N0} Lieferungen erfolgreich!", "Mitglieder und Lieferungen hochladen",
|
||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
} catch (HttpRequestException exc) {
|
||||
@@ -195,7 +198,7 @@ namespace Elwig.Services {
|
||||
var exportedAt = DateTime.Now;
|
||||
await ElwigData.Export(path, deliveries, wbKgs, [$"{year}", $"Zweigstelle {App.BranchName}"]);
|
||||
await Utils.UploadExportData(path, url, username, password);
|
||||
await UpdateExportedAt([], deliveries, exportedAt);
|
||||
await UpdateExportedAt([], [], deliveries, exportedAt);
|
||||
MessageBox.Show($"Hochladen von {deliveries.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochladen",
|
||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
@@ -251,19 +254,21 @@ namespace Elwig.Services {
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task UpdateExportedAt(IEnumerable<Member> member, IEnumerable<Delivery> deliveries, DateTime dateTime) {
|
||||
private static async Task UpdateExportedAt(IEnumerable<Member> member, IEnumerable<AreaComContract> contracts, IEnumerable<Delivery> deliveries, DateTime dateTime) {
|
||||
var timestamp = ((DateTimeOffset)dateTime.ToUniversalTime()).ToUnixTimeSeconds();
|
||||
var mgnrs = string.Join(",", member.Select(m => $"{m.MgNr}").Append("0"));
|
||||
var fbnrs = string.Join(",", contracts.Select(c => $"{c.FbNr}").Append("0"));
|
||||
var dids = string.Join(",", deliveries.Select(d => $"({d.Year},{d.DId})").Append("(0,0)"));
|
||||
using (var cnx = await AppDbContext.ConnectAsync()) {
|
||||
await cnx.ExecuteBatch($"""
|
||||
BEGIN;
|
||||
UPDATE client_parameter SET value = '0' WHERE param = 'ENABLE_TIME_TRIGGERS';
|
||||
UPDATE member SET xtime = {timestamp} WHERE mgnr IN ({mgnrs});
|
||||
UPDATE area_commitment SET xtime = {timestamp} WHERE mgnr IN ({mgnrs});
|
||||
UPDATE delivery SET xtime = {timestamp} WHERE (year, did) IN ({dids});
|
||||
UPDATE delivery_part SET xtime = {timestamp} WHERE (year, did) IN ({dids});
|
||||
UPDATE client_parameter SET value = '1' WHERE param = 'ENABLE_TIME_TRIGGERS';
|
||||
UPDATE client_parameter SET value = '0' WHERE param = 'ENABLE_TIME_TRIGGERS';
|
||||
UPDATE member SET xtime = {timestamp} WHERE mgnr IN ({mgnrs});
|
||||
UPDATE area_commitment_contract SET xtime = {timestamp} WHERE fbnr IN ({fbnrs});
|
||||
UPDATE area_commitment SET xtime = {timestamp} WHERE fbnr IN ({fbnrs});
|
||||
UPDATE delivery SET xtime = {timestamp} WHERE (year, did) IN ({dids});
|
||||
UPDATE delivery_part SET xtime = {timestamp} WHERE (year, did) IN ({dids});
|
||||
UPDATE client_parameter SET value = '1' WHERE param = 'ENABLE_TIME_TRIGGERS';
|
||||
COMMIT;
|
||||
""");
|
||||
}
|
||||
@@ -272,7 +277,7 @@ namespace Elwig.Services {
|
||||
|
||||
public static async Task<bool> ChangesAvailable(AppDbContext ctx, string url, string username, string password) {
|
||||
try {
|
||||
return await ctx.Members.AnyAsync(ChangedMembers) || await ctx.Deliveries.AnyAsync(ChangedDeliveries) || (Utils.HasInternetConnectivity() && (await GetFilesToImport(url, username, password)).Count > 0);
|
||||
return await ctx.Members.AnyAsync(ChangedMembers) || await ctx.AreaCommitmentContracts.AnyAsync(ChangedAreaComContracts) || await ctx.Deliveries.AnyAsync(ChangedDeliveries) || (Utils.HasInternetConnectivity() && (await GetFilesToImport(url, username, password)).Count > 0);
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -20,7 +20,11 @@ namespace Elwig.ViewModels {
|
||||
}
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _showOnlyActiveAreaComs;
|
||||
private string? _filterSeasonString;
|
||||
public int? FilterSeason {
|
||||
get => int.TryParse(FilterSeasonString, out var year) ? year : null;
|
||||
set => FilterSeasonString = $"{value}";
|
||||
}
|
||||
|
||||
[ObservableProperty]
|
||||
private string? _fbNrString;
|
||||
@@ -46,6 +50,8 @@ namespace Elwig.ViewModels {
|
||||
get => int.TryParse(YearToString, out var year) ? year : null;
|
||||
set => YearToString = $"{value}";
|
||||
}
|
||||
[ObservableProperty]
|
||||
private string? _period;
|
||||
|
||||
[ObservableProperty]
|
||||
private AreaComType? _areaComType;
|
||||
|
||||
@@ -11,7 +11,6 @@ namespace Elwig.ViewModels {
|
||||
public partial class MemberAdminViewModel : ObservableObject {
|
||||
|
||||
public int? TransferPredecessorAreaComs = null;
|
||||
public bool MaintainAreaComYearFrom = false;
|
||||
public int? CancelAreaComs = null;
|
||||
|
||||
public ObservableCollection<KeyValuePair<string, string>> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
xmlns:local="clr-namespace:Elwig.Windows"
|
||||
xmlns:ctrl="clr-namespace:Elwig.Controls"
|
||||
xmlns:vm="clr-namespace:Elwig.ViewModels"
|
||||
Title="{Binding Title}" Height="600" MinHeight="450" Width="1000" MinWidth="860">
|
||||
Title="{Binding Title}" Height="600" MinHeight="550" Width="1000" MinWidth="860">
|
||||
<Window.DataContext>
|
||||
<vm:AreaComAdminViewModel/>
|
||||
</Window.DataContext>
|
||||
@@ -56,7 +56,7 @@
|
||||
<RowDefinition Height="24"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="3*" MinWidth="500"/>
|
||||
<ColumnDefinition Width="2*" MinWidth="500"/>
|
||||
<ColumnDefinition Width="5"/>
|
||||
<ColumnDefinition Width="*" MinWidth="280"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
@@ -77,7 +77,7 @@
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<TextBox x:Name="SearchInput" Text="{Binding SearchQuery, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Grid.ColumnSpan="3" Margin="5,5,190,0" IsReadOnly="False"
|
||||
Grid.ColumnSpan="3" Margin="5,5,66,0" IsReadOnly="False"
|
||||
TextChanged="SearchInput_TextChanged">
|
||||
<TextBox.ToolTip>
|
||||
<TextBlock>
|
||||
@@ -93,9 +93,10 @@
|
||||
</TextBlock>
|
||||
</TextBox.ToolTip>
|
||||
</TextBox>
|
||||
<CheckBox x:Name="ActiveAreaCommitmentInput" Content="Nur laufende anzeigen (2020)" IsChecked="{Binding ShowOnlyActiveAreaComs}"
|
||||
Checked="ActiveAreaCommitmentInput_Changed" Unchecked="ActiveAreaCommitmentInput_Changed"
|
||||
HorizontalAlignment="Right" Margin="0,10,10,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"/>
|
||||
<ctrl:IntegerUpDown x:Name="SeasonInput" Text="{Binding FilterSeasonString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Grid.ColumnSpan="3" Height="25" Width="56" FontSize="14" Minimum="1900" Maximum="9999"
|
||||
Margin="0,5,5,0" VerticalAlignment="Top" HorizontalAlignment="Right"
|
||||
TextChanged="SeasonInput_TextChanged"/>
|
||||
|
||||
<DataGrid x:Name="AreaCommitmentList" AutoGenerateColumns="False" HeadersVisibility="Column" IsReadOnly="True" GridLinesVisibility="None" SelectionMode="Single"
|
||||
CanUserDeleteRows="False" CanUserResizeRows="False" CanUserAddRows="False" SelectionChanged="AreaCommitmentList_SelectionChanged" Grid.Column="0" Grid.Row="1"
|
||||
@@ -109,25 +110,24 @@
|
||||
</DataGridTextColumn.CellStyle>
|
||||
</DataGridTextColumn>
|
||||
<DataGridTextColumn Header="Katastralgemeinde" Binding="{Binding Kg.AtKg.Name}" Width="130"/>
|
||||
<DataGridTextColumn Header="Sorte" Binding="{Binding AreaComType.WineVar.SortId}" Width="50">
|
||||
<DataGridTextColumn Header="Sorte" Binding="{Binding Latest.AreaComType.VtrgId}" Width="50">
|
||||
<DataGridTextColumn.CellStyle>
|
||||
<Style>
|
||||
<Setter Property="TextBlock.Foreground" Value="{Binding AreaComType.WineVar.Color}"/>
|
||||
<Setter Property="TextBlock.Foreground" Value="{Binding Latest.AreaComType.WineVar.Color}"/>
|
||||
<Setter Property="TextBlock.TextAlignment" Value="Center"/>
|
||||
</Style>
|
||||
</DataGridTextColumn.CellStyle>
|
||||
</DataGridTextColumn>
|
||||
<DataGridTextColumn Header="Fläche" Binding="{Binding Area, StringFormat='{}{0:N0} m² '}" Width="80">
|
||||
<DataGridTextColumn Header="Fläche" Binding="{Binding Latest.Area, StringFormat='{}{0:N0} m² '}" Width="80">
|
||||
<DataGridTextColumn.CellStyle>
|
||||
<Style>
|
||||
<Setter Property="TextBlock.TextAlignment" Value="Right"/>
|
||||
</Style>
|
||||
</DataGridTextColumn.CellStyle>
|
||||
</DataGridTextColumn>
|
||||
<DataGridTextColumn Header="Attribut" Binding="{Binding AreaComType.WineAttr.Name}" Width="100"/>
|
||||
<DataGridTextColumn Header="Ried" Binding="{Binding Rd.Name}" Width="130"/>
|
||||
<DataGridTextColumn Header="Parzelle" Binding="{Binding GstNr}" Width="130"/>
|
||||
<DataGridTextColumn Header="Bewirt." Binding="{Binding WineCult.Name}" Width="60"/>
|
||||
<DataGridTextColumn Header="Parzelle" Binding="{Binding Latest.GstNr}" Width="130"/>
|
||||
<DataGridTextColumn Header="Bewirt." Binding="{Binding Latest.WineCult.Name}" Width="60"/>
|
||||
<DataGridTextColumn Header="Von" Binding="{Binding YearFrom}" Width="48"/>
|
||||
<DataGridTextColumn Header="Bis" Binding="{Binding YearTo}" Width="48"/>
|
||||
</DataGrid.Columns>
|
||||
@@ -176,91 +176,119 @@
|
||||
|
||||
<Grid Grid.Column="2" Grid.Row="1">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="1.125*"/>
|
||||
<RowDefinition Height="1*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="230"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<GroupBox Header="Vertrag" Grid.Column="2" Grid.Row="0" Grid.RowSpan="1" Margin="5,5,5,5">
|
||||
<GroupBox Header="Vertrag" Grid.Row="0" Margin="5,5,5,5">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="80"/>
|
||||
<ColumnDefinition Width="48"/>
|
||||
<ColumnDefinition Width="60"/>
|
||||
<ColumnDefinition Width="60"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Label Content="MgNr.:" Margin="10,10,0,0" Grid.Column="0"/>
|
||||
<TextBox x:Name="MgNrInput" Text="{Binding MgNrString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="False"
|
||||
Margin="0,10,0,0" Width="48" HorizontalAlignment="Left" Grid.Column="1" TextAlignment="Right"/>
|
||||
|
||||
<Label Content="FbNr.:" Margin="10,10,0,0" Grid.Column="2"/>
|
||||
<Label Content="FB-Nr.:" Margin="10,10,0,0" Grid.Column="0"/>
|
||||
<TextBox x:Name="FbNrInput" Text="{Binding FbNrString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Margin="0,10,10,0" Width="56" HorizontalAlignment="Left" Grid.Column="3" TextAlignment="Right"
|
||||
Margin="0,10,0,0" Width="56" HorizontalAlignment="Left" Grid.Column="1" TextAlignment="Right"
|
||||
TextChanged="FbNrInput_TextChanged" LostFocus="FbNrInput_LostFocus"/>
|
||||
|
||||
<Label Content="Zeitraum:" Margin="10,40,0,0" Grid.Column="0"/>
|
||||
<TextBox x:Name="YearFromInput" Text="{Binding YearFromString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Margin="0,40,10,0" Width="40" HorizontalAlignment="Left" Grid.Column="1" Grid.ColumnSpan="2" TextAlignment="Right"
|
||||
TextChanged="IntegerInput_TextChanged"/>
|
||||
<Label Content="–" Grid.Column="1" Grid.ColumnSpan="3" Margin="45,40,0,0"/>
|
||||
<TextBox x:Name="YearToInput" Text="{Binding YearToString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Margin="60,40,10,0" Width="40" HorizontalAlignment="Left" Grid.Column="1" Grid.ColumnSpan="3" TextAlignment="Right"
|
||||
TextChanged="IntegerInput_TextChanged"/>
|
||||
<Label Content="Laufzeit:" Margin="10,10,0,0" Grid.Column="2"/>
|
||||
<TextBlock x:Name="Period" Text="{Binding Period}"
|
||||
Margin="0,14,10,0" Grid.Column="3" TextWrapping="NoWrap" VerticalAlignment="Top"/>
|
||||
|
||||
<Label Content="Vertragsart:" Margin="10,70,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
||||
<ComboBox x:Name="AreaComTypeInput" SelectedItem="{Binding AreaComType, Mode=TwoWay}" ItemsSource="{Binding AreaComTypeSource, Mode=TwoWay}"
|
||||
ItemTemplate="{StaticResource AreaCommitmentTypeTemplate}" TextSearch.TextPath="DisplayName"
|
||||
HorizontalAlignment="Stretch" Margin="0,70,40,10" Grid.Column="1" Grid.ColumnSpan="3"/>
|
||||
<Button x:Name="AreaComTypeDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
||||
Click="AreaComTypeDetailsButton_Click"
|
||||
<Label Content="KG:" Margin="10,40,0,0" Grid.Column="0"/>
|
||||
<ComboBox x:Name="KgInput" SelectedItem="{Binding Kg, Mode=TwoWay}" ItemsSource="{Binding KgSource, Mode=TwoWay}"
|
||||
ItemTemplate="{StaticResource KgNrTemplate}" TextSearch.TextPath="Name"
|
||||
HorizontalAlignment="Stretch" Margin="0,40,40,10" Grid.Column="1" Grid.ColumnSpan="3"
|
||||
SelectionChanged="KgInput_SelectionChanged"/>
|
||||
<Button x:Name="KgDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
||||
Click="KgDetailsButton_Click"
|
||||
Grid.Column="3" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,40,10,10"/>
|
||||
|
||||
<Label Content="Ried:" Margin="10,70,0,0" Grid.Column="0"/>
|
||||
<ComboBox x:Name="RdInput" SelectedItem="{Binding RdObj, Mode=TwoWay}" ItemsSource="{Binding RdSource, Mode=TwoWay}"
|
||||
DisplayMemberPath="Name" TextSearch.TextPath="Name" IsEditable="True"
|
||||
HorizontalAlignment="Stretch" Margin="0,70,40,10" Grid.Column="1" Grid.ColumnSpan="3"
|
||||
SelectionChanged="RdInput_SelectionChanged"/>
|
||||
<Button x:Name="RdAddButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="16" Padding="0,0,0,0" IsEnabled="False"
|
||||
Click="RdAddButton_Click"
|
||||
Grid.Column="3" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,70,10,10"/>
|
||||
|
||||
<Label Content="Bewirt.-Art:" Margin="10,100,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
||||
<ComboBox x:Name="WineCultivationInput" SelectedItem="{Binding WineCultObj, Mode=TwoWay}" ItemsSource="{Binding WineCultSource, Mode=TwoWay}"
|
||||
DisplayMemberPath="Name" TextSearch.TextPath="Name"
|
||||
HorizontalAlignment="Stretch" Margin="0,100,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
|
||||
|
||||
<Label Content="Anmerkung:" Margin="10,130,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
||||
<Label Content="Anmerkung:" Margin="10,100,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
||||
<TextBox x:Name="CommentInput" Text="{Binding Comment, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
TextChanged="TextBox_TextChanged"
|
||||
HorizontalAlignment="Stretch" Margin="0,130,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
|
||||
HorizontalAlignment="Stretch" Margin="0,100,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
|
||||
|
||||
<ListBox x:Name="RevisionList" Grid.ColumnSpan="4" Margin="5,135,5,5"
|
||||
SelectionChanged="RevisionList_SelectionChanged">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="{Binding YearFrom}" Width="28" TextAlignment="Right" Margin="0,0,0,0"/>
|
||||
<TextBlock Text="–" TextAlignment="Center" Margin="0,0,0,0"/>
|
||||
<TextBlock Text="{Binding YearTo}" Width="28" TextAlignment="Left" Margin="0,0,0,0"/>
|
||||
<TextBlock Text="{Binding VtrgId}" Width="40" TextAlignment="Center" Foreground="{Binding AreaComType.WineVar.Color}"/>
|
||||
<TextBlock Text="{Binding Area, StringFormat='{}{0:N0} m²'}" Width="60" TextAlignment="Right" Padding="0,0,10,0"/>
|
||||
<TextBlock Text="{Binding Member.AdministrativeName}"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<GroupBox Header="Lage" Grid.Column="2" Grid.Row="1" Grid.RowSpan="1" Margin="5,5,5,10">
|
||||
<GroupBox Header="Revision" Grid.Row="1" Margin="5,5,5,10">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="80"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Label Content="KG:" Margin="10,10,0,0" Grid.Column="0"/>
|
||||
<ComboBox x:Name="KgInput" SelectedItem="{Binding Kg, Mode=TwoWay}" ItemsSource="{Binding KgSource, Mode=TwoWay}"
|
||||
ItemTemplate="{StaticResource KgNrTemplate}" TextSearch.TextPath="Name"
|
||||
HorizontalAlignment="Stretch" Margin="0,10,40,10" Grid.Column="1"
|
||||
SelectionChanged="KgInput_SelectionChanged"/>
|
||||
<Button x:Name="KgDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
||||
Click="KgDetailsButton_Click"
|
||||
Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,10,10,10"/>
|
||||
<Label Content="Mitglied:" Margin="10,10,0,0" Grid.Column="0"/>
|
||||
<TextBox x:Name="MgNrInput" Text="{Binding MgNrString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Width="48" Grid.Row="1" Grid.Column="1" Margin="0,10,0,0" HorizontalAlignment="Left" TextAlignment="Right"
|
||||
TextChanged="MgNrInput_TextChanged" LostFocus="MgNrInput_LostFocus"/>
|
||||
<ComboBox x:Name="MemberInput"
|
||||
Grid.Column="1" Margin="53,10,40,10" IsEditable="True"
|
||||
ItemTemplate="{StaticResource MemberAdminNameTemplate}" TextSearch.TextPath="AdministrativeName"
|
||||
SelectionChanged="MemberInput_SelectionChanged"/>
|
||||
<Button x:Name="MemberReferenceButton" Grid.Column="1" Height="25" Width="25" FontFamily="Segoe MDL2 Assets" Content="" Padding="0,0,0,0"
|
||||
Margin="10,10,10,10" VerticalAlignment="Top" HorizontalAlignment="Right" ToolTip="Zu Mitglied springen"
|
||||
Click="MemberReferenceButton_Click"/>
|
||||
|
||||
<Label Content="Ried:" Margin="10,40,0,0" Grid.Column="0"/>
|
||||
<ComboBox x:Name="RdInput" SelectedItem="{Binding RdObj, Mode=TwoWay}" ItemsSource="{Binding RdSource, Mode=TwoWay}"
|
||||
DisplayMemberPath="Name" TextSearch.TextPath="Name" IsEditable="True"
|
||||
HorizontalAlignment="Stretch" Margin="0,40,40,10" Grid.Column="1"
|
||||
SelectionChanged="RdInput_SelectionChanged"/>
|
||||
<Button x:Name="RdAddButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="16" Padding="0,0,0,0" IsEnabled="False"
|
||||
Click="RdAddButton_Click"
|
||||
Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,40,10,10"/>
|
||||
<Label Content="Laufzeit:" Margin="10,40,0,0" Grid.Column="0"/>
|
||||
<TextBox x:Name="YearFromInput" Text="{Binding YearFromString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Margin="0,40,10,0" Width="40" HorizontalAlignment="Left" Grid.Column="1" TextAlignment="Right"
|
||||
TextChanged="IntegerInput_TextChanged"/>
|
||||
<Label Content="–" Grid.Column="1" Margin="45,40,0,0"/>
|
||||
<TextBox x:Name="YearToInput" Text="{Binding YearToString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Margin="60,40,10,0" Width="40" HorizontalAlignment="Left" Grid.Column="1" TextAlignment="Right"
|
||||
TextChanged="IntegerInput_TextChanged"/>
|
||||
|
||||
<Label Content="Parzelle(n):" Margin="10,70,0,0" Grid.Column="0"/>
|
||||
<TextBox x:Name="GstNrInput" Text="{Binding GstNr, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Margin="0,70,10,0" Grid.Column="1" HorizontalAlignment="Stretch"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
<Label Content="Vertragsart:" Margin="10,70,0,0" Grid.Column="0"/>
|
||||
<ComboBox x:Name="AreaComTypeInput" SelectedItem="{Binding AreaComType, Mode=TwoWay}" ItemsSource="{Binding AreaComTypeSource, Mode=TwoWay}"
|
||||
ItemTemplate="{StaticResource AreaCommitmentTypeTemplate}" TextSearch.TextPath="DisplayName"
|
||||
HorizontalAlignment="Stretch" Margin="0,70,40,10" Grid.Column="1"/>
|
||||
<Button x:Name="AreaComTypeDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
||||
Click="AreaComTypeDetailsButton_Click"
|
||||
Grid.Column="3" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,70,10,10"/>
|
||||
|
||||
<Label Content="Fläche:" Margin="10,100,0,0" Grid.Column="0"/>
|
||||
<Label Content="Bewirt.-Art:" Margin="10,100,0,0" Grid.Column="0"/>
|
||||
<ComboBox x:Name="WineCultivationInput" SelectedItem="{Binding WineCultObj, Mode=TwoWay}" ItemsSource="{Binding WineCultSource, Mode=TwoWay}"
|
||||
DisplayMemberPath="Name" TextSearch.TextPath="Name"
|
||||
HorizontalAlignment="Stretch" Margin="0,100,10,0" Grid.Column="1"/>
|
||||
|
||||
<Label Content="Fläche:" Margin="10,130,0,0" Grid.Column="0"/>
|
||||
<ctrl:UnitTextBox x:Name="AreaInput" Unit="m²" Text="{Binding AreaString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
TextChanged="IntegerInput_TextChanged"
|
||||
Grid.Column="1" Width="70" Margin="0,100,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||
Grid.Column="1" Width="70" Margin="0,130,10,10" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||
|
||||
<Label Content="Parzelle(n):" Margin="10,160,0,0" Grid.Column="0"/>
|
||||
<TextBox x:Name="GstNrInput" Text="{Binding GstNr, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Margin="0,160,10,0" Grid.Column="1" HorizontalAlignment="Stretch"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
|
||||
@@ -25,19 +25,18 @@ namespace Elwig.Windows {
|
||||
ViewModel.FilterMember = ctx.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value");
|
||||
ViewModel.Title = $"Flächenbindungen - {ViewModel.FilterMember.AdministrativeName} - Elwig";
|
||||
ExemptInputs = [
|
||||
MgNrInput, AreaCommitmentList, NewAreaCommitmentButton,
|
||||
EditAreaCommitmentButton, DeleteAreaCommitmentButton, SaveButton,
|
||||
ResetButton, CancelButton, SearchInput, ActiveAreaCommitmentInput
|
||||
AreaCommitmentList, RevisionList,
|
||||
NewAreaCommitmentButton, EditAreaCommitmentButton, DeleteAreaCommitmentButton, SaveButton,
|
||||
ResetButton, CancelButton, SearchInput, SeasonInput
|
||||
];
|
||||
RequiredInputs = [
|
||||
FbNrInput, YearFromInput, KgInput, RdInput,
|
||||
FbNrInput, MgNrInput, MemberInput, YearFromInput, KgInput, RdInput,
|
||||
GstNrInput, AreaInput, AreaComTypeInput, WineCultivationInput
|
||||
];
|
||||
|
||||
ControlUtils.InitializeDelayTimer(SearchInput, SearchInput_TextChanged);
|
||||
SearchInput.TextChanged -= SearchInput_TextChanged;
|
||||
ActiveAreaCommitmentInput.Content = ((string)ActiveAreaCommitmentInput.Content).Replace("2020", $"{Utils.CurrentLastSeason}");
|
||||
ActiveAreaCommitmentInput.IsChecked = true;
|
||||
ViewModel.FilterSeason = Utils.CurrentYear;
|
||||
}
|
||||
|
||||
protected override async Task OnInit(AppDbContext ctx) {
|
||||
@@ -55,38 +54,46 @@ namespace Elwig.Windows {
|
||||
var vm = ViewModel;
|
||||
var cursor = Mouse.OverrideCursor != null;
|
||||
if (!cursor) Mouse.OverrideCursor = Cursors.Wait;
|
||||
var query = (vm.SearchQuery, vm.ShowOnlyActiveAreaComs);
|
||||
var (filter, areaComs, areaComCount, stat) = await Task.Run(async () => {
|
||||
var query = (vm.SearchQuery, vm.FilterSeason);
|
||||
var (filter, contracts, areaComs, areaComCount, stat) = await Task.Run(async () => {
|
||||
using var ctx = new AppDbContext();
|
||||
var (_, areaComQuery, filter) = await vm.GetFilters(ctx);
|
||||
var (_, contractQuery, areaComQuery, filter) = await vm.GetFilters(ctx);
|
||||
var contracts = await contractQuery
|
||||
.Include(c => c.Kg.AtKg)
|
||||
.Include(c => c.Rd!.Kg.AtKg)
|
||||
.Include(c => c.Revisions).ThenInclude(a => a.WineCult)
|
||||
.Include(c => c.Revisions).ThenInclude(a => a.AreaComType.WineAttr)
|
||||
.Include(c => c.Revisions).ThenInclude(a => a.AreaComType.WineVar)
|
||||
.Include(c => c.Revisions).ThenInclude(a => a.Member)
|
||||
.ToListAsync();
|
||||
var areaComs = await areaComQuery
|
||||
.Include(a => a.Kg.AtKg)
|
||||
.Include(a => a.Rd!.Kg.AtKg)
|
||||
.Include(c => c.Contract.Kg.AtKg)
|
||||
.Include(c => c.Contract.Rd!.Kg.AtKg)
|
||||
.Include(a => a.WineCult)
|
||||
.Include(a => a.AreaComType.WineAttr)
|
||||
.Include(a => a.AreaComType.WineVar)
|
||||
.ToListAsync();
|
||||
|
||||
if (filter.Count > 0 && areaComs.Count > 0) {
|
||||
var dict = areaComs.AsParallel()
|
||||
if (filter.Count > 0 && contracts.Count > 0) {
|
||||
var dict = contracts.AsParallel()
|
||||
.ToDictionary(d => d, d => d.SearchScore(vm.TextFilter))
|
||||
.OrderByDescending(c => c.Value);
|
||||
var threshold = dict.Max(a => a.Value) * 3 / 4;
|
||||
areaComs = [.. dict
|
||||
.Where(a => a.Value > threshold)
|
||||
.Select(a => a.Key)];
|
||||
contracts = [.. dict
|
||||
.Where(a => a.Value > threshold)
|
||||
.Select(a => a.Key)];
|
||||
}
|
||||
|
||||
var areaComCount = await areaComQuery.CountAsync();
|
||||
var season = await ctx.Seasons.FindAsync(await ctx.Seasons.MaxAsync(s => s.Year));
|
||||
var stat = await AreaComService.GenerateToolTipData(areaComQuery, season?.MaxKgPerHa ?? 10_000);
|
||||
|
||||
return (filter, areaComs, areaComCount, stat);
|
||||
return (filter, contracts, areaComs, areaComCount, stat);
|
||||
});
|
||||
if (!cursor) Mouse.OverrideCursor = null;
|
||||
if (query != (ViewModel.SearchQuery, ViewModel.ShowOnlyActiveAreaComs)) return;
|
||||
if (query != (ViewModel.SearchQuery, ViewModel.FilterSeason)) return;
|
||||
|
||||
ControlUtils.RenewItemsSource(AreaCommitmentList, areaComs,
|
||||
ControlUtils.RenewItemsSource(AreaCommitmentList, contracts,
|
||||
AreaCommitmentList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort);
|
||||
RefreshInputs();
|
||||
|
||||
@@ -96,8 +103,8 @@ namespace Elwig.Windows {
|
||||
ViewModel.StatusArea = text;
|
||||
ViewModel.StatusAreaToolTip = AreaComService.GenerateToolTip(gridData);
|
||||
} else {
|
||||
ViewModel.StatusAreaCommitments = $"{areaComs.Count:N0}";
|
||||
ViewModel.StatusArea = $"{areaComs.Select(a => a.Area).Sum():N0} m²";
|
||||
ViewModel.StatusAreaCommitments = $"{contracts.Count:N0}";
|
||||
ViewModel.StatusArea = $"{areaComs.Sum(a => a.Area):N0} m²";
|
||||
ViewModel.StatusAreaToolTip = null;
|
||||
}
|
||||
var groups = areaComs.GroupBy(a => $"{a.AreaComType.SortId}{a.AreaComType.AttrId}").Select(a => (a.Key, a.Sum(b => b.Area))).OrderByDescending(a => a.Item2).ToList();
|
||||
@@ -106,12 +113,25 @@ namespace Elwig.Windows {
|
||||
ViewModel.StatusContracts += $" ({string.Join(", ", groups.Select(g => g.Key))})";
|
||||
}
|
||||
|
||||
private async Task RefreshRevisions() {
|
||||
using var ctx = new AppDbContext();
|
||||
if (AreaCommitmentList.SelectedItem is AreaComContract c) {
|
||||
ControlUtils.RenewItemsSource(RevisionList, c.Revisions.OrderByDescending(p => p.RevNr).ToList(), RevisionList_SelectionChanged, ControlUtils.RenewSourceDefault.First);
|
||||
} else {
|
||||
RevisionList.ItemsSource = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void RefreshInputs(bool validate = false) {
|
||||
ClearInputStates();
|
||||
if (AreaCommitmentList.SelectedItem is AreaCom a) {
|
||||
if (RevisionList.SelectedItem is AreaCom a) {
|
||||
EditAreaCommitmentButton.IsEnabled = true;
|
||||
DeleteAreaCommitmentButton.IsEnabled = true;
|
||||
FillInputs(a);
|
||||
} else if (AreaCommitmentList.SelectedItem is AreaComContract c) {
|
||||
EditAreaCommitmentButton.IsEnabled = true;
|
||||
DeleteAreaCommitmentButton.IsEnabled = true;
|
||||
FillInputs(c);
|
||||
} else {
|
||||
EditAreaCommitmentButton.IsEnabled = false;
|
||||
DeleteAreaCommitmentButton.IsEnabled = false;
|
||||
@@ -123,7 +143,15 @@ namespace Elwig.Windows {
|
||||
GC.Collect();
|
||||
}
|
||||
|
||||
private void FillInputs(AreaComContract c) {
|
||||
ClearOriginalValues();
|
||||
ClearDefaultValues();
|
||||
ViewModel.FillInputs(c);
|
||||
FinishInputFilling();
|
||||
}
|
||||
|
||||
private void FillInputs(AreaCom a) {
|
||||
FillInputs(a.Contract);
|
||||
ClearOriginalValues();
|
||||
ClearDefaultValues();
|
||||
ViewModel.FillInputs(a);
|
||||
@@ -138,6 +166,11 @@ namespace Elwig.Windows {
|
||||
ValidateRequiredInputs();
|
||||
}
|
||||
|
||||
new protected void ClearInputs(bool validate = false) {
|
||||
ViewModel.ClearInputs();
|
||||
base.ClearInputs(validate);
|
||||
}
|
||||
|
||||
protected override async Task OnRenewContext(AppDbContext ctx) {
|
||||
await base.OnRenewContext(ctx);
|
||||
|
||||
@@ -158,6 +191,9 @@ namespace Elwig.Windows {
|
||||
.Include(c => c.WineAttr)
|
||||
.OrderBy(v => v.VtrgId)
|
||||
.ToListAsync());
|
||||
ControlUtils.RenewItemsSource(MemberInput, await ctx.Members
|
||||
.OrderBy(m => m.Name).ThenBy(m => m.GivenName).ThenBy(m => m.MgNr)
|
||||
.ToListAsync());
|
||||
var cultList = await ctx.WineCultivations
|
||||
.OrderBy(c => c.Name)
|
||||
.Cast<object>().ToListAsync();
|
||||
@@ -176,6 +212,7 @@ namespace Elwig.Windows {
|
||||
IsCreating = true;
|
||||
AreaCommitmentList.IsEnabled = false;
|
||||
AreaCommitmentList.SelectedItem = null;
|
||||
RevisionList.IsEnabled = false;
|
||||
HideNewEditDeleteButtons();
|
||||
ShowSaveResetCancelButtons();
|
||||
UnlockInputs();
|
||||
@@ -196,6 +233,7 @@ namespace Elwig.Windows {
|
||||
|
||||
IsEditing = true;
|
||||
AreaCommitmentList.IsEnabled = false;
|
||||
RevisionList.IsEnabled = false;
|
||||
|
||||
HideNewEditDeleteButtons();
|
||||
ShowSaveResetCancelButtons();
|
||||
@@ -210,10 +248,10 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
private async void DeleteAreaCommitmentButton_Click(object? sender, RoutedEventArgs? evt) {
|
||||
if (AreaCommitmentList.SelectedItem is not AreaCom a)
|
||||
if (RevisionList.SelectedItem is not AreaCom a)
|
||||
return;
|
||||
|
||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, true);
|
||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, true, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a);
|
||||
if (d.ShowDialog() != true)
|
||||
return;
|
||||
|
||||
@@ -221,7 +259,7 @@ namespace Elwig.Windows {
|
||||
try {
|
||||
if (d.YearTo is int yearTo) {
|
||||
ViewModel.YearTo = yearTo;
|
||||
await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaCom)?.FbNr);
|
||||
await ViewModel.UpdateAreaCommitment(a.FbNr, a.RevNr);
|
||||
} else {
|
||||
await AreaComService.DeleteAreaCom(a.FbNr);
|
||||
}
|
||||
@@ -244,42 +282,38 @@ namespace Elwig.Windows {
|
||||
SaveButton.IsEnabled = false;
|
||||
|
||||
int? yearTo = null;
|
||||
if (InputHasChanged(AreaInput) || InputHasChanged(AreaComTypeInput)) {
|
||||
var a = (AreaCommitmentList.SelectedItem as AreaCom)!;
|
||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, false);
|
||||
if (d.ShowDialog() != true)
|
||||
if (InputHasChanged(AreaInput) || InputHasChanged(AreaComTypeInput) || InputHasChanged(MgNrInput)) {
|
||||
var a = (RevisionList.SelectedItem as AreaCom)!;
|
||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, false, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a);
|
||||
if (d.ShowDialog() != true) {
|
||||
SaveButton.IsEnabled = true;
|
||||
return;
|
||||
}
|
||||
yearTo = d.YearTo;
|
||||
}
|
||||
|
||||
int fbnr;
|
||||
int fbnr, revnr;
|
||||
Mouse.OverrideCursor = Cursors.Wait;
|
||||
try {
|
||||
AreaCom? temp = null;
|
||||
if (yearTo != null && (!ViewModel.YearTo.HasValue || yearTo < ViewModel.YearTo)) {
|
||||
temp = new AreaCom {
|
||||
FbNr = ViewModel.FbNr!.Value,
|
||||
MgNr = ViewModel.MgNr!.Value,
|
||||
YearFrom = ViewModel.YearFrom,
|
||||
YearTo = ViewModel.YearTo,
|
||||
VtrgId = ViewModel.AreaComType!.VtrgId,
|
||||
CultId = ViewModel.WineCult?.CultId,
|
||||
Comment = ViewModel.Comment,
|
||||
KgNr = ViewModel.Kg!.KgNr,
|
||||
RdNr = ViewModel.Rd?.RdNr,
|
||||
GstNr = ViewModel.GstNr?.Trim() ?? "-",
|
||||
Area = ViewModel.Area!.Value,
|
||||
};
|
||||
RefreshInputs();
|
||||
ViewModel.YearTo = yearTo;
|
||||
}
|
||||
fbnr = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaCom)?.FbNr);
|
||||
(fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaComContract)?.FbNr, (RevisionList.SelectedItem as AreaCom)?.RevNr);
|
||||
if (temp is AreaCom t) {
|
||||
await ViewModel.InitInputs();
|
||||
t.FbNr = ViewModel.FbNr!.Value;
|
||||
t.YearFrom = yearTo + 1;
|
||||
ViewModel.FillInputs(t);
|
||||
fbnr = await ViewModel.UpdateAreaCommitment(null);
|
||||
(fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaComContract)?.FbNr, null);
|
||||
}
|
||||
App.HintContextChange();
|
||||
} catch (Exception exc) {
|
||||
@@ -294,6 +328,7 @@ namespace Elwig.Windows {
|
||||
IsEditing = false;
|
||||
IsCreating = false;
|
||||
AreaCommitmentList.IsEnabled = true;
|
||||
RevisionList.IsEnabled = true;
|
||||
HideSaveResetCancelButtons();
|
||||
ShowNewEditDeleteButtons();
|
||||
LockInputs();
|
||||
@@ -302,7 +337,9 @@ namespace Elwig.Windows {
|
||||
await EnsureContextRenewed();
|
||||
Mouse.OverrideCursor = null;
|
||||
ViewModel.SearchQuery = "";
|
||||
ControlUtils.SelectItem(AreaCommitmentList, AreaCommitmentList.ItemsSource.Cast<AreaCom>().Where(a => a.FbNr == fbnr).FirstOrDefault());
|
||||
ViewModel.FilterSeason = ViewModel.YearTo ?? ViewModel.YearFrom ?? ViewModel.FilterSeason;
|
||||
ControlUtils.SelectItemWithPk(AreaCommitmentList, fbnr);
|
||||
ControlUtils.SelectItemWithPk(RevisionList, fbnr, revnr);
|
||||
}
|
||||
|
||||
protected override void ShortcutReset() {
|
||||
@@ -324,6 +361,7 @@ namespace Elwig.Windows {
|
||||
IsEditing = false;
|
||||
IsCreating = false;
|
||||
AreaCommitmentList.IsEnabled = true;
|
||||
RevisionList.IsEnabled = true;
|
||||
HideSaveResetCancelButtons();
|
||||
ShowNewEditDeleteButtons();
|
||||
RefreshInputs();
|
||||
@@ -385,22 +423,46 @@ namespace Elwig.Windows {
|
||||
|
||||
private void LockSearchInputs() {
|
||||
SearchInput.IsEnabled = false;
|
||||
ActiveAreaCommitmentInput.IsEnabled = false;
|
||||
SeasonInput.IsEnabled = false;
|
||||
}
|
||||
|
||||
private void UnlockSearchInputs() {
|
||||
SearchInput.IsEnabled = true;
|
||||
ActiveAreaCommitmentInput.IsEnabled = true;
|
||||
SeasonInput.IsEnabled = true;
|
||||
}
|
||||
|
||||
private void AreaCommitmentList_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||
private async void AreaCommitmentList_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||
if (AreaCommitmentList.SelectedItem != null)
|
||||
AreaCommitmentList.ScrollIntoView(AreaCommitmentList.SelectedItem);
|
||||
RefreshInputs();
|
||||
await RefreshRevisions();
|
||||
}
|
||||
|
||||
private void AttributesInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||
private void RevisionList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
|
||||
RefreshInputs();
|
||||
if (RevisionList.SelectedItem is AreaCom c) {
|
||||
EditAreaCommitmentButton.IsEnabled = true;
|
||||
} else {
|
||||
EditAreaCommitmentButton.IsEnabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void MgNrInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
var valid = InputTextChanged((TextBox)sender, Validator.CheckMgNr);
|
||||
var text = MgNrInput.Text;
|
||||
var caret = MgNrInput.CaretIndex;
|
||||
ControlUtils.SelectItemWithPk(MemberInput, valid ? ViewModel.MgNr : null);
|
||||
MgNrInput.Text = text;
|
||||
MgNrInput.CaretIndex = caret;
|
||||
}
|
||||
|
||||
private void MgNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||
var valid = InputLostFocus((TextBox)sender, Validator.CheckMgNr);
|
||||
ControlUtils.SelectItemWithPk(MemberInput, valid ? ViewModel.MgNr : null);
|
||||
}
|
||||
|
||||
private void MemberInput_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
|
||||
var m = MemberInput.SelectedItem as Member;
|
||||
ViewModel.MgNr = m?.MgNr;
|
||||
}
|
||||
|
||||
private async void ActiveAreaCommitmentInput_Changed(object sender, RoutedEventArgs evt) {
|
||||
@@ -413,6 +475,11 @@ namespace Elwig.Windows {
|
||||
await RefreshList(true);
|
||||
}
|
||||
|
||||
private async void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||
if (ViewModel.FilterSeason == null) return;
|
||||
await RefreshList();
|
||||
}
|
||||
|
||||
private void KgInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||
if (KgInput.SelectedItem is AT_Kg kg) {
|
||||
var rdList = kg.WbKg!.Rds.OrderBy(r => r.Name).Cast<object>().ToList();
|
||||
@@ -450,12 +517,12 @@ namespace Elwig.Windows {
|
||||
RdInput.SelectedIndex = s.Count();
|
||||
}
|
||||
|
||||
protected void InputTextChanged(TextBox input, Func<TextBox, bool, AreaCom?, ValidationResult> checker) {
|
||||
InputTextChanged(input, checker(input, SenderIsRequired(input), (AreaCom)AreaCommitmentList.SelectedItem));
|
||||
protected void InputTextChanged(TextBox input, Func<TextBox, bool, AreaComContract?, ValidationResult> checker) {
|
||||
InputTextChanged(input, checker(input, SenderIsRequired(input), (AreaComContract)AreaCommitmentList.SelectedItem));
|
||||
}
|
||||
|
||||
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AreaCom?, ValidationResult> checker, string? msg = null) {
|
||||
InputLostFocus(input, checker(input, SenderIsRequired(input), (AreaCom)AreaCommitmentList.SelectedItem), msg);
|
||||
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AreaComContract?, ValidationResult> checker, string? msg = null) {
|
||||
InputLostFocus(input, checker(input, SenderIsRequired(input), (AreaComContract)AreaCommitmentList.SelectedItem), msg);
|
||||
}
|
||||
|
||||
private void FbNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||
@@ -465,5 +532,10 @@ namespace Elwig.Windows {
|
||||
private void FbNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||
InputLostFocus((TextBox)sender, Validator.CheckFbNr);
|
||||
}
|
||||
|
||||
private void MemberReferenceButton_Click(object sender, RoutedEventArgs evt) {
|
||||
if (MemberInput.SelectedItem is not Member m) return;
|
||||
App.FocusMember(m.MgNr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -807,7 +807,6 @@ namespace Elwig.Windows {
|
||||
if (d.ShowDialog() != true)
|
||||
return;
|
||||
ViewModel.TransferPredecessorAreaComs = d.SuccessorSeason;
|
||||
ViewModel.MaintainAreaComYearFrom = d.MaintainYearFrom;
|
||||
if (IsEditing)
|
||||
SetOriginalValue(PredecessorMgNrInput, -1); // hack to allow user to save
|
||||
UpdateButtons();
|
||||
|
||||
@@ -100,8 +100,8 @@ namespace Elwig.Windows {
|
||||
var allMembers = await ctx.Members.Where(m => m.DefaultKgNr == k.KgNr).CountAsync();
|
||||
StatusDefaultKgs.Text += $"{activeMembers:N0} ({allMembers:N0})";
|
||||
var year = Utils.CurrentNextSeason;
|
||||
var activeAreaComs = await Utils.ActiveAreaCommitments(ctx.AreaCommitments.Where(c => c.KgNr == k.KgNr), year).CountAsync();
|
||||
var allAreaComs = await ctx.AreaCommitments.Where(c => c.KgNr == k.KgNr).CountAsync();
|
||||
var activeAreaComs = await Utils.ActiveAreaCommitments(ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr), year).CountAsync();
|
||||
var allAreaComs = await ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr).CountAsync();
|
||||
StatusAreaCommitments.Text += $"{activeAreaComs:N0} ({allAreaComs:N0})";
|
||||
var deliveryParts = await ctx.DeliveryParts.Where(p => p.KgNr == k.KgNr).CountAsync();
|
||||
var deliveries = await ctx.Deliveries.Where(d => d.Parts.Any(p => p.KgNr == k.KgNr)).CountAsync();
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
DELETE FROM credit;
|
||||
DELETE FROM payment_variant;
|
||||
DELETE FROM delivery;
|
||||
DELETE FROM area_commitment;
|
||||
DELETE FROM area_commitment_contract;
|
||||
DELETE FROM area_commitment_type;
|
||||
DELETE FROM season;
|
||||
DELETE FROM wine_attribute;
|
||||
|
||||
@@ -22,10 +22,15 @@ INSERT INTO area_commitment_type (vtrgid, sortid, attrid, disc, min_kg_per_ha, p
|
||||
('GVQ', 'GV', 'Q', NULL, 5000, 1000, 1000000, NULL),
|
||||
('GVR', 'GV', 'R', NULL, 5000, 1000, 1000000, NULL);
|
||||
|
||||
INSERT INTO area_commitment (fbnr, mgnr, vtrgid, cultid, area, kgnr, gstnr, rdnr, year_from, year_to) VALUES
|
||||
( 1, 101, 'GV', 'KIP', 10000, 06109, '123/4', NULL, 2000, 2019),
|
||||
( 2, 101, 'GV', 'KIP', 10000, 06109, '123/5', NULL, 2025, 2030),
|
||||
( 3, 101, 'GV', 'KIP', 10000, 06109, '123/6', NULL, 2021, 2031);
|
||||
INSERT INTO area_commitment_contract (fbnr, kgnr, rdnr) VALUES
|
||||
( 1, 06109, NULL),
|
||||
( 2, 06109, NULL),
|
||||
( 3, 06109, NULL);
|
||||
|
||||
INSERT INTO area_commitment (fbnr, revnr, mgnr, vtrgid, cultid, area, gstnr, year_from, year_to) VALUES
|
||||
( 1, 1, 101, 'GV', 'KIP', 10000, '123/4', 2000, 2019),
|
||||
( 2, 1, 101, 'GV', 'KIP', 10000, '123/5', 2025, 2030),
|
||||
( 3, 1, 101, 'GV', 'KIP', 10000, '123/6', 2021, 2031);
|
||||
|
||||
INSERT INTO season (year, currency, min_kg_per_bs, max_kg_per_bs, penalty_per_kg, penalty_amount, penalty_none, start_date, end_date) VALUES
|
||||
(2020, 'EUR', 1000, 2000, NULL, NULL, NULL, NULL, NULL),
|
||||
|
||||
@@ -4,7 +4,7 @@ DELETE FROM credit;
|
||||
DELETE FROM payment_variant;
|
||||
DELETE FROM delivery;
|
||||
DELETE FROM season;
|
||||
DELETE FROM area_commitment;
|
||||
DELETE FROM area_commitment_contract;
|
||||
DELETE FROM area_commitment_type;
|
||||
DELETE FROM member WHERE mgnr >= 200;
|
||||
DELETE FROM wine_cultivation;
|
||||
|
||||
@@ -29,11 +29,17 @@ INSERT INTO member_email_address (mgnr, nr, address, comment) VALUES
|
||||
INSERT INTO area_commitment_type (vtrgid, sortid, attrid, disc, min_kg_per_ha, penalty_per_kg, penalty_amount, penalty_none) VALUES
|
||||
('GV', 'GV', NULL, NULL, 5000, 500, NULL, NULL);
|
||||
|
||||
INSERT INTO area_commitment (fbnr, mgnr, vtrgid, cultid, area, kgnr, gstnr, rdnr, year_from, year_to) VALUES
|
||||
( 1, 203, 'GV', NULL, 10000, 15224, '321/9', NULL, NULL, NULL),
|
||||
( 2, 204, 'GV', NULL, 10000, 15224, '123/1', NULL, 2000, 2019),
|
||||
( 3, 204, 'GV', NULL, 10000, 15224, '123/2', NULL, 2025, 2030),
|
||||
( 4, 204, 'GV', NULL, 10000, 15224, '123/3', NULL, 2021, 2031);
|
||||
INSERT INTO area_commitment_contract (fbnr, kgnr, rdnr) VALUES
|
||||
( 1, 15224, NULL),
|
||||
( 2, 15224, NULL),
|
||||
( 3, 15224, NULL),
|
||||
( 4, 15224, NULL);
|
||||
|
||||
INSERT INTO area_commitment (fbnr, revnr, mgnr, vtrgid, cultid, area, gstnr, year_from, year_to) VALUES
|
||||
( 1, 1, 203, 'GV', NULL, 10000, '321/9', NULL, NULL),
|
||||
( 2, 1, 204, 'GV', NULL, 10000, '123/1', 2000, 2019),
|
||||
( 3, 1, 204, 'GV', NULL, 10000, '123/2', 2025, 2030),
|
||||
( 4, 1, 204, 'GV', NULL, 10000, '123/3', 2021, 2031);
|
||||
|
||||
|
||||
INSERT INTO season (year, currency, min_kg_per_bs, max_kg_per_bs, penalty_per_kg, penalty_amount, penalty_none, start_date, end_date) VALUES
|
||||
|
||||
@@ -1 +1 @@
|
||||
curl --fail -s -L "https://elwig.at/files/create.sql?v=36" -u "elwig:ganzGeheim123!" -o "Resources\Sql\Create.sql"
|
||||
curl --fail -s -L "https://elwig.at/files/create.sql?v=38" -u "elwig:ganzGeheim123!" -o "Resources\Sql\Create.sql"
|
||||
|
||||
Reference in New Issue
Block a user