[#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;
|
incButton!.Click += IncrementButton_Click;
|
||||||
decButton!.Click += DecrementButton_Click;
|
decButton!.Click += DecrementButton_Click;
|
||||||
base.OnApplyTemplate();
|
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) {
|
private void IntegerUpDown_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||||
var idx = CaretIndex;
|
var idx = CaretIndex;
|
||||||
Text = new string(Text.Where(char.IsAsciiDigit).Take(4).ToArray());
|
Text = new string([.. Text.Where(char.IsAsciiDigit).Take(4)]);
|
||||||
CaretIndex = idx;
|
CaretIndex = idx;
|
||||||
evt.Handled = !(Value >= Minimum && Value <= Maximum);
|
evt.Handled = !((!Minimum.HasValue || Value >= Minimum) && (!Maximum.HasValue || Value <= Maximum));
|
||||||
if (idx >= 4) {
|
if (idx >= 4) {
|
||||||
if (Value < Minimum) {
|
if (Value < Minimum) {
|
||||||
Value = Minimum;
|
Value = Minimum;
|
||||||
@@ -56,6 +64,7 @@ namespace Elwig.Controls {
|
|||||||
}
|
}
|
||||||
CaretIndex = 4;
|
CaretIndex = 4;
|
||||||
}
|
}
|
||||||
|
UpdateButtons();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void IntegerUpDown_LostFocus(object sender, RoutedEventArgs evt) {
|
private void IntegerUpDown_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Elwig.Helpers;
|
using Elwig.Helpers;
|
||||||
|
using System;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
|
||||||
@@ -12,23 +13,27 @@ namespace Elwig.Dialogs {
|
|||||||
public string OrigYearTo { get; set; }
|
public string OrigYearTo { get; set; }
|
||||||
public string Area { 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}";
|
Area = $"{area:N0}";
|
||||||
OrigYearFrom = $"{yearFrom}";
|
OrigYearFrom = $"{yearFrom}";
|
||||||
OrigYearTo = $"{yearTo}";
|
OrigYearTo = $"{yearTo}";
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Title = delete ? "Flächenbindung löschen" : "Flächenbindung bearbeiten";
|
Title = delete ? "Flächenbindung löschen" : "Flächenbindung bearbeiten";
|
||||||
RetroactiveInput.Content = delete ? "Rückwirkend löschen" : "Rückwirkend 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) {
|
if (delete) {
|
||||||
QuestionBlock1.Visibility = Visibility.Hidden;
|
QuestionBlock1.Visibility = Visibility.Hidden;
|
||||||
QuestionBlock2.Visibility = Visibility.Visible;
|
QuestionBlock2.Visibility = Visibility.Visible;
|
||||||
DescBlock1.Visibility = Visibility.Hidden;
|
DescBlock1.Visibility = Visibility.Hidden;
|
||||||
DescBlock2.Visibility = Visibility.Visible;
|
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;
|
RetroactiveInput.IsChecked = true;
|
||||||
} else {
|
} else {
|
||||||
SeasonInput.Text = $"{Utils.CurrentNextSeason}";
|
SeasonInput.Text = $"{Utils.CurrentYear}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,7 +53,7 @@ namespace Elwig.Dialogs {
|
|||||||
DescBlock2.Visibility = Visibility.Hidden;
|
DescBlock2.Visibility = Visibility.Hidden;
|
||||||
} else {
|
} else {
|
||||||
SeasonInput.IsEnabled = true;
|
SeasonInput.IsEnabled = true;
|
||||||
SeasonInput.Text = $"{Utils.CurrentNextSeason}";
|
SeasonInput.Text = $"{Math.Max(SeasonInput.Minimum ?? Utils.CurrentYear, Utils.CurrentYear)}";
|
||||||
DescBlock1.Visibility = QuestionBlock1.Visibility;
|
DescBlock1.Visibility = QuestionBlock1.Visibility;
|
||||||
DescBlock2.Visibility = QuestionBlock2.Visibility;
|
DescBlock2.Visibility = QuestionBlock2.Visibility;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
ResizeMode="NoResize" ShowInTaskbar="False" Topmost="True"
|
ResizeMode="NoResize" ShowInTaskbar="False" Topmost="True"
|
||||||
WindowStartupLocation="CenterOwner"
|
WindowStartupLocation="CenterOwner"
|
||||||
DataContext="{Binding RelativeSource={RelativeSource Self}}"
|
DataContext="{Binding RelativeSource={RelativeSource Self}}"
|
||||||
Title="Flächenbindungen übertragen" Height="260" Width="450">
|
Title="Flächenbindungen übertragen" Height="240" Width="450">
|
||||||
<Window.Resources>
|
<Window.Resources>
|
||||||
<Style TargetType="Label">
|
<Style TargetType="Label">
|
||||||
<Setter Property="HorizontalAlignment" Value="Left"/>
|
<Setter Property="HorizontalAlignment" Value="Left"/>
|
||||||
@@ -48,12 +48,8 @@
|
|||||||
Minimum="1900" Maximum="9999"
|
Minimum="1900" Maximum="9999"
|
||||||
HorizontalAlignment="Center" VerticalAlignment="Top"
|
HorizontalAlignment="Center" VerticalAlignment="Top"
|
||||||
TextChanged="SeasonInput_TextChanged"/>
|
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">
|
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/>
|
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.
|
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 {
|
namespace Elwig.Dialogs {
|
||||||
public partial class AreaComTransferDialog : Window {
|
public partial class AreaComTransferDialog : Window {
|
||||||
|
|
||||||
public int CancelSeason { get; set; }
|
public int CancelSeason => SuccessorSeason - 1;
|
||||||
public int SuccessorSeason => CancelSeason + 1;
|
public int SuccessorSeason { get; set; }
|
||||||
public bool MaintainYearFrom { get; set; }
|
|
||||||
|
|
||||||
public string AreaComNum { get; set; }
|
public string AreaComNum { get; set; }
|
||||||
public string Area { get; set; }
|
public string Area { get; set; }
|
||||||
|
|
||||||
public AreaComTransferDialog(string name, int areaComNum, int area) {
|
public AreaComTransferDialog(string name, int areaComNum, int area) {
|
||||||
CancelSeason = Utils.FollowingSeason - 1;
|
SuccessorSeason = Utils.FollowingSeason;
|
||||||
AreaComNum = $"{areaComNum:N0}";
|
AreaComNum = $"{areaComNum:N0}";
|
||||||
Area = $"{area:N0}";
|
Area = $"{area:N0}";
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
SeasonInput.Text = $"{CancelSeason}";
|
SeasonInput.Text = $"{SuccessorSeason}";
|
||||||
|
SeasonInput.Minimum = Utils.CurrentLastSeason;
|
||||||
Title = $"Aktive Flächenbindungen kündigen - {name}";
|
Title = $"Aktive Flächenbindungen kündigen - {name}";
|
||||||
QuestionBlock1.Visibility = Visibility.Hidden;
|
QuestionBlock1.Visibility = Visibility.Hidden;
|
||||||
QuestionBlock2.Visibility = Visibility.Visible;
|
QuestionBlock2.Visibility = Visibility.Visible;
|
||||||
DescBlock1.Visibility = Visibility.Hidden;
|
DescBlock1.Visibility = Visibility.Hidden;
|
||||||
DescBlock2.Visibility = Visibility.Visible;
|
DescBlock2.Visibility = Visibility.Visible;
|
||||||
CopyYearToInput.Visibility = Visibility.Hidden;
|
|
||||||
Height = 240;
|
Height = 240;
|
||||||
SeasonInput.Margin = new(0, 40, 0, 0);
|
SeasonInput.Margin = new(0, 40, 0, 0);
|
||||||
SeasonLabel.Margin = new(0, 40, 100, 0);
|
SeasonLabel.Margin = new(0, 40, 100, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AreaComTransferDialog(string name, string successorName, int areaComNum, int area) {
|
public AreaComTransferDialog(string name, string successorName, int areaComNum, int area) {
|
||||||
CancelSeason = Utils.FollowingSeason - 1;
|
SuccessorSeason = Utils.FollowingSeason;
|
||||||
AreaComNum = $"{areaComNum:N0}";
|
AreaComNum = $"{areaComNum:N0}";
|
||||||
Area = $"{area:N0}";
|
Area = $"{area:N0}";
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
SeasonInput.Text = $"{CancelSeason}";
|
SeasonInput.Text = $"{SuccessorSeason}";
|
||||||
|
SeasonInput.Minimum = Utils.CurrentLastSeason;
|
||||||
Title = $"Aktive Flächenbindungen übertragen - {name} - {successorName}";
|
Title = $"Aktive Flächenbindungen übertragen - {name} - {successorName}";
|
||||||
InfoBlock.Visibility = Visibility.Hidden;
|
InfoBlock.Visibility = Visibility.Hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
private void SeasonInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||||
CancelSeason = (int)SeasonInput.Value!;
|
SuccessorSeason = (int)SeasonInput.Value!;
|
||||||
CancelSeason1.Text = $"{CancelSeason}";
|
CancelSeason1.Text = $"{CancelSeason}";
|
||||||
CancelSeason2.Text = $"{CancelSeason}";
|
CancelSeason2.Text = $"{CancelSeason}";
|
||||||
TransferSeason.Text = MaintainYearFrom ? "" : $"{SuccessorSeason}";
|
TransferSeason.Text = $"{SuccessorSeason}";
|
||||||
DescBlock1Season.Text = MaintainYearFrom ? "dem originalen Beginn der FB" : "inkl. Saison ";
|
DescBlock1Season.Text = "inkl. Saison ";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CopyYearToInput_Changed(object sender, RoutedEventArgs evt) {
|
private void CopyYearToInput_Changed(object sender, RoutedEventArgs evt) {
|
||||||
TransferSeason.Text = MaintainYearFrom ? "" : $"{SuccessorSeason}";
|
TransferSeason.Text = $"{SuccessorSeason}";
|
||||||
DescBlock1Season.Text = MaintainYearFrom ? "dem originalen Beginn der FB" : "inkl. Saison ";
|
DescBlock1Season.Text = "inkl. Saison ";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ConfirmButton_Click(object sender, RoutedEventArgs evt) {
|
private void ConfirmButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ namespace Elwig.Documents {
|
|||||||
public Dictionary<string, MemberBucket> MemberBuckets;
|
public Dictionary<string, MemberBucket> MemberBuckets;
|
||||||
public List<AreaCom> ActiveAreaCommitments;
|
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}";
|
DocumentId = $"{Name} {m.MgNr}";
|
||||||
Season = ctx.Seasons.ToList().MaxBy(s => s.Year) ?? throw new ArgumentException("invalid season");
|
Season = ctx.Seasons.ToList().MaxBy(s => s.Year) ?? throw new ArgumentException("invalid season");
|
||||||
MemberBuckets = ctx.GetMemberBuckets(Utils.CurrentYear, m.MgNr).GetAwaiter().GetResult();
|
MemberBuckets = ctx.GetMemberBuckets(Utils.CurrentYear, m.MgNr).GetAwaiter().GetResult();
|
||||||
@@ -136,7 +137,7 @@ namespace Elwig.Documents {
|
|||||||
protected Table NewAreaComTable() {
|
protected Table NewAreaComTable() {
|
||||||
var areaComs = ActiveAreaCommitments.GroupBy(a => a.AreaComType).Select(group => new {
|
var areaComs = ActiveAreaCommitments.GroupBy(a => a.AreaComType).Select(group => new {
|
||||||
Type = group.Key,
|
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)
|
Size = group.Sum(c => c.Area)
|
||||||
}).OrderByDescending(a => a.Size).ToList();
|
}).OrderByDescending(a => a.Size).ToList();
|
||||||
|
|
||||||
@@ -164,12 +165,13 @@ namespace Elwig.Documents {
|
|||||||
.SetBorderTop(contractType.Type.DisplayName != lastContract && lastContract != "" ? new SolidBorder(BorderThickness) : Border.NO_BORDER));
|
.SetBorderTop(contractType.Type.DisplayName != lastContract && lastContract != "" ? new SolidBorder(BorderThickness) : Border.NO_BORDER));
|
||||||
|
|
||||||
foreach (var areaCom in contractType.AreaComs) {
|
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))))
|
var c = areaCom.Contract;
|
||||||
.AddCell(NewTd(areaCom.Rd?.Name))
|
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(Regex.Replace(areaCom.GstNr.Replace(",", ", ").Replace("-", "\u2013"), @"\s+", " "), 10))
|
||||||
.AddCell(NewTd($"{areaCom.Area:N0}", right: true))
|
.AddCell(NewTd($"{areaCom.Area:N0}", right: true))
|
||||||
.AddCell(NewTd(areaCom.WineCult?.Name, center: 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;
|
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.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.Data;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
namespace Elwig.Helpers {
|
namespace Elwig.Helpers {
|
||||||
|
|
||||||
@@ -48,6 +48,7 @@ namespace Elwig.Helpers {
|
|||||||
public DbSet<MemberTelNr> MemberTelephoneNrs { get; private set; }
|
public DbSet<MemberTelNr> MemberTelephoneNrs { get; private set; }
|
||||||
public DbSet<MemberEmailAddr> MemberEmailAddrs { get; private set; }
|
public DbSet<MemberEmailAddr> MemberEmailAddrs { get; private set; }
|
||||||
public DbSet<MemberHistory> MemberHistory { 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<AreaCom> AreaCommitments { get; private set; }
|
||||||
public DbSet<Season> Seasons { get; private set; }
|
public DbSet<Season> Seasons { get; private set; }
|
||||||
public DbSet<DeliverySchedule> DeliverySchedules { get; private set; }
|
public DbSet<DeliverySchedule> DeliverySchedules { get; private set; }
|
||||||
@@ -142,7 +143,7 @@ namespace Elwig.Helpers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> FbNrExists(int fbnr) {
|
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) {
|
public async Task<bool> SortIdExists(string sortId) {
|
||||||
@@ -166,11 +167,18 @@ namespace Elwig.Helpers {
|
|||||||
|
|
||||||
public async Task<int> NextFbNr() {
|
public async Task<int> NextFbNr() {
|
||||||
int c = 0;
|
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; });
|
.ForEach(a => { if (a <= c + 10000) c = a; });
|
||||||
return c + 1;
|
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) {
|
public async Task<int> NextLNr(DateOnly date, string zwstid) {
|
||||||
var dateStr = date.ToString("yyyy-MM-dd");
|
var dateStr = date.ToString("yyyy-MM-dd");
|
||||||
int c = 0;
|
int c = 0;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace Elwig.Helpers {
|
|||||||
public static class AppDbUpdater {
|
public static class AppDbUpdater {
|
||||||
|
|
||||||
// Don't forget to update value in Tests/fetch-resources.bat!
|
// 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;
|
private static int VersionOffset = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -60,13 +60,14 @@ namespace Elwig.Helpers.Export {
|
|||||||
List<MemberTelNr> TelephoneNumbers,
|
List<MemberTelNr> TelephoneNumbers,
|
||||||
List<MemberEmailAddr> EmailAddresses,
|
List<MemberEmailAddr> EmailAddresses,
|
||||||
List<AreaCom> AreaCommitments,
|
List<AreaCom> AreaCommitments,
|
||||||
|
List<AreaComContract> Contracts,
|
||||||
List<WbRd> Riede,
|
List<WbRd> Riede,
|
||||||
List<WbKg> WbKgs,
|
List<WbKg> WbKgs,
|
||||||
List<WbGl> WbGls,
|
List<WbGl> WbGls,
|
||||||
List<Delivery> Deliveries,
|
List<Delivery> Deliveries,
|
||||||
List<DeliveryPart> DeliveryParts,
|
List<DeliveryPart> DeliveryParts,
|
||||||
List<DeliveryPartModifier> Modifiers,
|
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,
|
var metaData = new List<(string FileName, string ZwstId, string Device,
|
||||||
int? MemberNum, string? MemberFilters,
|
int? MemberNum, string? MemberFilters,
|
||||||
@@ -75,10 +76,12 @@ namespace Elwig.Helpers.Export {
|
|||||||
|
|
||||||
foreach (var filename in filenames) {
|
foreach (var filename in filenames) {
|
||||||
try {
|
try {
|
||||||
data.Add(new([], [], [], [], [], [], [], new([], [], [], [], new() {
|
data.Add(new([], [], [], [], [], [], [], new([], [], [], [], [], new() {
|
||||||
["member"] = [],
|
["member"] = [],
|
||||||
|
["area_commitment_contract"] = [],
|
||||||
["area_commitment"] = [],
|
["area_commitment"] = [],
|
||||||
["delivery"] = [],
|
["delivery"] = [],
|
||||||
|
["delivery_part"] = [],
|
||||||
})));
|
})));
|
||||||
var r = data[^1];
|
var r = data[^1];
|
||||||
|
|
||||||
@@ -86,9 +89,11 @@ namespace Elwig.Helpers.Export {
|
|||||||
using var zip = ZipFile.Open(filename, ZipArchiveMode.Read);
|
using var zip = ZipFile.Open(filename, ZipArchiveMode.Read);
|
||||||
await zip.CheckIntegrity();
|
await zip.CheckIntegrity();
|
||||||
|
|
||||||
|
string[] acceptableVersions = ["1", "2"];
|
||||||
var version = zip.GetEntry("version");
|
var version = zip.GetEntry("version");
|
||||||
using (var reader = new StreamReader(version!.Open(), Utils.UTF8)) {
|
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})");
|
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 meta = await JsonNode.ParseAsync(metaJson!.Open());
|
||||||
var memberCount = meta!["members"]?["count"]?.AsValue().GetValue<int>();
|
var memberCount = meta!["members"]?["count"]?.AsValue().GetValue<int>();
|
||||||
var memberFilters = meta!["members"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
var memberFilters = meta!["members"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
||||||
var areaComCount = meta!["area_commitments"]?["count"]?.AsValue().GetValue<int>();
|
var areaComCount = meta!["area_commitment_contracts"]?["count"]?.AsValue().GetValue<int>();
|
||||||
var areaComFilters = meta!["area_commitments"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
var areaComFilters = meta!["area_commitment_contracts"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
||||||
var deliveryCount = meta!["deliveries"]?["count"]?.AsValue().GetValue<int>();
|
var deliveryCount = meta!["deliveries"]?["count"]?.AsValue().GetValue<int>();
|
||||||
var deliveryFilters = meta!["deliveries"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
var deliveryFilters = meta!["deliveries"]?["filters"]?.AsArray().Select(f => f!.AsValue().GetValue<string>()).ToArray();
|
||||||
metaData.Add((Path.GetFileName(filename),
|
metaData.Add((Path.GetFileName(filename),
|
||||||
@@ -133,23 +138,48 @@ namespace Elwig.Helpers.Export {
|
|||||||
r.TelephoneNumbers.AddRange(telNrs);
|
r.TelephoneNumbers.AddRange(telNrs);
|
||||||
r.EmailAddresses.AddRange(emailAddrs);
|
r.EmailAddresses.AddRange(emailAddrs);
|
||||||
if (timestamps.HasValue)
|
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");
|
var areaComsJson = zip.GetEntry("area_commitments.json");
|
||||||
if (areaComsJson != null) {
|
if (areaComsJson != null) {
|
||||||
using var reader = new StreamReader(areaComsJson.Open(), Utils.UTF8);
|
using var reader = new StreamReader(areaComsJson.Open(), Utils.UTF8);
|
||||||
string? line;
|
string? line;
|
||||||
while ((line = await reader.ReadLineAsync()) != null) {
|
while ((line = await reader.ReadLineAsync()) != null) {
|
||||||
var obj = JsonNode.Parse(line)!.AsObject();
|
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);
|
r.AreaCommitments.Add(areaCom);
|
||||||
if (wbrd != null) {
|
if (wbrd != null) {
|
||||||
r.Riede.Add(wbrd);
|
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)
|
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 obj = JsonNode.Parse(line)!.AsObject();
|
||||||
var (d, parts, mods, rde, timestamps) = obj.ToDelivery(currentLsNrs, currentDids, kgs, currentWbRde);
|
var (d, parts, mods, rde, timestamps) = obj.ToDelivery(currentLsNrs, currentDids, kgs, currentWbRde);
|
||||||
r.Deliveries.Add(d);
|
r.Deliveries.Add(d);
|
||||||
r.DeliveryParts.AddRange(parts);
|
r.DeliveryParts.AddRange(parts.Select(p => p.Item1));
|
||||||
r.Modifiers.AddRange(mods);
|
r.Modifiers.AddRange(mods);
|
||||||
r.Riede.AddRange(rde);
|
r.Riede.AddRange(rde);
|
||||||
if (timestamps.HasValue)
|
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 (
|
} 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 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 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 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 branch = branches[meta.ZwstId];
|
||||||
var device = meta.Device;
|
var device = meta.Device;
|
||||||
|
|
||||||
@@ -220,11 +254,20 @@ namespace Elwig.Helpers.Export {
|
|||||||
if (duplicateMgNrs.Count > 0)
|
if (duplicateMgNrs.Count > 0)
|
||||||
importDuplicateMembers = ImportQuestion(branch.Name, device, "Mitglieder", true, duplicateMgNrs.Count);
|
importDuplicateMembers = ImportQuestion(branch.Name, device, "Mitglieder", true, duplicateMgNrs.Count);
|
||||||
|
|
||||||
var fbnrs = areaCommitments.Select(c => c.FbNr).ToList();
|
var fbnrs = contracts.Select(c => c.FbNr).ToList();
|
||||||
var duplicateFbNrs = await ctx.AreaCommitments
|
var duplicateFbNrs = await ctx.AreaCommitmentContracts
|
||||||
.Where(c => fbnrs.Contains(c.FbNr))
|
.Where(c => fbnrs.Contains(c.FbNr))
|
||||||
.Select(c => c.FbNr)
|
.Select(c => c.FbNr)
|
||||||
.ToListAsync();
|
.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 lsnrs = deliveries.Select(d => d.LsNr).ToList();
|
||||||
var duplicateLsNrs = await ctx.Deliveries
|
var duplicateLsNrs = await ctx.Deliveries
|
||||||
@@ -258,7 +301,7 @@ namespace Elwig.Helpers.Export {
|
|||||||
importDuplicateDeliveries = ImportQuestion(branch.Name, device, "Lieferungen", true, duplicateLsNrs.Count);
|
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.AddRange(wbGls);
|
||||||
ctx.UpdateRange(wbKgs.Where(k => duplicateKgNrs.Contains(k.KgNr)));
|
ctx.UpdateRange(wbKgs.Where(k => duplicateKgNrs.Contains(k.KgNr)));
|
||||||
ctx.AddRange(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(billingAddresses.Where(a => duplicateMgNrs.Contains(a.MgNr)));
|
||||||
ctx.AddRange(telephoneNumbers.Where(n => duplicateMgNrs.Contains(n.MgNr)));
|
ctx.AddRange(telephoneNumbers.Where(n => duplicateMgNrs.Contains(n.MgNr)));
|
||||||
ctx.AddRange(emailAddresses.Where(a => duplicateMgNrs.Contains(a.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) {
|
if (importNewMembers) {
|
||||||
ctx.AddRange(members.Where(m => !duplicateMgNrs.Contains(m.MgNr)));
|
ctx.AddRange(members.Where(m => !duplicateMgNrs.Contains(m.MgNr)));
|
||||||
ctx.AddRange(billingAddresses.Where(a => !duplicateMgNrs.Contains(a.MgNr)));
|
ctx.AddRange(billingAddresses.Where(a => !duplicateMgNrs.Contains(a.MgNr)));
|
||||||
ctx.AddRange(telephoneNumbers.Where(n => !duplicateMgNrs.Contains(n.MgNr)));
|
ctx.AddRange(telephoneNumbers.Where(n => !duplicateMgNrs.Contains(n.MgNr)));
|
||||||
ctx.AddRange(emailAddresses.Where(a => !duplicateMgNrs.Contains(a.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) {
|
if (members.Count > 0) {
|
||||||
var n = importNewMembers ? members.Count - duplicateMgNrs.Count : 0;
|
var n = importNewMembers ? members.Count - duplicateMgNrs.Count : 0;
|
||||||
var o = importDuplicateMembers ? 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));
|
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);
|
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));
|
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();
|
await ctx.SaveChangesAsync();
|
||||||
|
|
||||||
var primaryKeys = new Dictionary<string, string>() {
|
var primaryKeys = new Dictionary<string, string>() {
|
||||||
["member"] = "mgnr, 0",
|
["member"] = "mgnr, 0, 0",
|
||||||
["area_commitment"] = "fbnr, 0",
|
["area_commitment_contract"] = "fbnr, 0, 0",
|
||||||
["delivery"] = "year, did",
|
["area_commitment"] = "fbnr, revnr, 0",
|
||||||
|
["delivery"] = "year, did, 0",
|
||||||
|
["delivery_part"] = "year, did, dpnr",
|
||||||
};
|
};
|
||||||
var updateStmts = timestamps
|
var updateStmts = timestamps
|
||||||
.SelectMany(e => e.Value.Select(m => $"UPDATE {e.Key} " +
|
.SelectMany(e => e.Value.Select(m => $"UPDATE {e.Key} " +
|
||||||
$"SET ctime = {((DateTimeOffset)m.CreatedAt.ToUniversalTime()).ToUnixTimeSeconds()}, " +
|
$"SET ctime = {((DateTimeOffset)m.CreatedAt.ToUniversalTime()).ToUnixTimeSeconds()}, " +
|
||||||
$"mtime = {((DateTimeOffset)m.ModifiedAt.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();
|
using var cnx = AppDbContext.Connect();
|
||||||
await cnx.ExecuteBatch($"""
|
await cnx.ExecuteBatch($"""
|
||||||
BEGIN;
|
BEGIN;
|
||||||
@@ -407,7 +458,7 @@ namespace Elwig.Helpers.Export {
|
|||||||
}.Export(filename);
|
}.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 {
|
return new ElwigExport {
|
||||||
Members = (members, filters),
|
Members = (members, filters),
|
||||||
AreaComs = (areaComs, ["von exportierten Mitgliedern"]),
|
AreaComs = (areaComs, ["von exportierten Mitgliedern"]),
|
||||||
@@ -425,7 +476,7 @@ namespace Elwig.Helpers.Export {
|
|||||||
public class ElwigExport {
|
public class ElwigExport {
|
||||||
public (IEnumerable<WbKg> WbKgs, IEnumerable<string> Filters)? WbKgs { get; set; }
|
public (IEnumerable<WbKg> WbKgs, IEnumerable<string> Filters)? WbKgs { get; set; }
|
||||||
public (IEnumerable<Member> Members, IEnumerable<string> Filters)? Members { 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 (IEnumerable<Delivery> Deliveries, IEnumerable<string> Filters)? Deliveries { get; set; }
|
||||||
|
|
||||||
public async Task Export(string filename) {
|
public async Task Export(string filename) {
|
||||||
@@ -434,7 +485,7 @@ namespace Elwig.Helpers.Export {
|
|||||||
|
|
||||||
var version = zip.CreateEntry("version", CompressionLevel.NoCompression);
|
var version = zip.CreateEntry("version", CompressionLevel.NoCompression);
|
||||||
using (var writer = new StreamWriter(version.Open(), Utils.UTF8)) {
|
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);
|
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()),
|
["filters"] = new JsonArray(Members.Value.Filters.Select(f => (JsonNode)f).ToArray()),
|
||||||
};
|
};
|
||||||
if (AreaComs != null)
|
if (AreaComs != null)
|
||||||
obj["area_commitments"] = new JsonObject {
|
obj["area_commitment_contracts"] = new JsonObject {
|
||||||
["count"] = AreaComs.Value.AreaComs.Count(),
|
["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()),
|
["filters"] = new JsonArray(AreaComs.Value.Filters.Select(f => (JsonNode)f).ToArray()),
|
||||||
};
|
};
|
||||||
if (Deliveries != null)
|
if (Deliveries != null)
|
||||||
@@ -485,7 +537,7 @@ namespace Elwig.Helpers.Export {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (AreaComs != null) {
|
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);
|
using var writer = new StreamWriter(json.Open(), Utils.UTF8);
|
||||||
foreach (var c in AreaComs.Value.AreaComs) {
|
foreach (var c in AreaComs.Value.AreaComs) {
|
||||||
await writer.WriteLineAsync(c.ToJson().ToJsonString(Utils.JsonOpts));
|
await writer.WriteLineAsync(c.ToJson().ToJsonString(Utils.JsonOpts));
|
||||||
@@ -639,42 +691,102 @@ namespace Elwig.Helpers.Export {
|
|||||||
CountryNum = a["country"]!.AsValue().GetValue<int>(),
|
CountryNum = a["country"]!.AsValue().GetValue<int>(),
|
||||||
PostalDestId = a["postal_dest"]!.AsValue().GetValue<string>(),
|
PostalDestId = a["postal_dest"]!.AsValue().GetValue<string>(),
|
||||||
Address = a["address"]!.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,
|
MgNr = mgnr,
|
||||||
Nr = i + 1,
|
Nr = i + 1,
|
||||||
Type = n["type"]!.AsValue().GetValue<string>(),
|
Type = n["type"]!.AsValue().GetValue<string>(),
|
||||||
Number = n["number"]!.AsValue().GetValue<string>(),
|
Number = n["number"]!.AsValue().GetValue<string>(),
|
||||||
Comment = n["comment"]?.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,
|
MgNr = mgnr,
|
||||||
Nr = i + 1,
|
Nr = i + 1,
|
||||||
Address = a["address"]!.AsValue().GetValue<string>(),
|
Address = a["address"]!.AsValue().GetValue<string>(),
|
||||||
Comment = a["comment"]?.AsValue().GetValue<string>(),
|
Comment = a["comment"]?.AsValue().GetValue<string>(),
|
||||||
}).ToList(),
|
})],
|
||||||
createdAt == null || modifiedAt == null ? null :
|
createdAt == null || modifiedAt == null ? null :
|
||||||
(DateTime.ParseExact(createdAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None),
|
(DateTime.ParseExact(createdAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None),
|
||||||
DateTime.ParseExact(modifiedAt, "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 {
|
return new JsonObject {
|
||||||
["fbnr"] = c.FbNr,
|
["fbnr"] = c.FbNr,
|
||||||
["mgnr"] = c.MgNr,
|
|
||||||
["vtrgid"] = c.VtrgId,
|
|
||||||
["cultid"] = c.CultId,
|
|
||||||
["area"] = c.Area,
|
|
||||||
["kgnr"] = c.KgNr,
|
["kgnr"] = c.KgNr,
|
||||||
["gstnr"] = c.GstNr,
|
|
||||||
["ried"] = c.Rd?.Name,
|
["ried"] = c.Rd?.Name,
|
||||||
["year_from"] = c.YearFrom,
|
["revisions"] = new JsonArray(c.Revisions.OrderBy(r => r.RevNr).Select(r => r.ToJson()).ToArray()),
|
||||||
["year_to"] = c.YearTo,
|
|
||||||
["comment"] = c.Comment,
|
["comment"] = c.Comment,
|
||||||
["created_at"] = $"{c.CreatedAt:yyyy-MM-ddTHH:mm:ssK}",
|
["created_at"] = $"{c.CreatedAt:yyyy-MM-ddTHH:mm:ssK}",
|
||||||
["modified_at"] = $"{c.ModifiedAt: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 kgnr = json["kgnr"]!.AsValue().GetValue<int>();
|
||||||
var ried = json["ried"]?.AsValue().GetValue<string>();
|
var ried = json["ried"]?.AsValue().GetValue<string>();
|
||||||
WbRd? rd = null;
|
WbRd? rd = null;
|
||||||
@@ -695,18 +807,22 @@ namespace Elwig.Helpers.Export {
|
|||||||
}
|
}
|
||||||
var createdAt = json["created_at"]?.AsValue().GetValue<string>();
|
var createdAt = json["created_at"]?.AsValue().GetValue<string>();
|
||||||
var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>();
|
var modifiedAt = json["modified_at"]?.AsValue().GetValue<string>();
|
||||||
return (new AreaCom {
|
return (new AreaComContract {
|
||||||
FbNr = json["fbnr"]!.AsValue().GetValue<int>(),
|
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>(),
|
MgNr = json["mgnr"]!.AsValue().GetValue<int>(),
|
||||||
VtrgId = json["vtrgid"]!.AsValue().GetValue<string>(),
|
VtrgId = json["vtrgid"]!.AsValue().GetValue<string>(),
|
||||||
CultId = json["cultid"]?.AsValue().GetValue<string>(),
|
CultId = json["cultid"]?.AsValue().GetValue<string>(),
|
||||||
Area = json["area"]!.AsValue().GetValue<int>(),
|
Area = json["area"]!.AsValue().GetValue<int>(),
|
||||||
KgNr = kgnr,
|
|
||||||
GstNr = json["gstnr"]?.AsValue().GetValue<string>() ?? "-",
|
GstNr = json["gstnr"]?.AsValue().GetValue<string>() ?? "-",
|
||||||
RdNr = rd?.RdNr ?? json["rdnr"]?.AsValue().GetValue<int>(),
|
|
||||||
YearFrom = json["year_from"]?.AsValue().GetValue<int>(),
|
YearFrom = json["year_from"]?.AsValue().GetValue<int>(),
|
||||||
YearTo = json["year_to"]?.AsValue().GetValue<int>(),
|
YearTo = json["year_to"]?.AsValue().GetValue<int>(),
|
||||||
Comment = json["comment"]?.AsValue().GetValue<string>(),
|
|
||||||
ImportedAt = DateTime.Now,
|
ImportedAt = DateTime.Now,
|
||||||
}, newRd ? rd : null,
|
}, newRd ? rd : null,
|
||||||
createdAt == null || modifiedAt == null ? null :
|
createdAt == null || modifiedAt == null ? null :
|
||||||
@@ -723,7 +839,14 @@ namespace Elwig.Helpers.Export {
|
|||||||
["lnr"] = d.LNr,
|
["lnr"] = d.LNr,
|
||||||
["time"] = d.Time != null ? $"{d.Time:HH:mm:ss}" : null,
|
["time"] = d.Time != null ? $"{d.Time:HH:mm:ss}" : null,
|
||||||
["mgnr"] = d.MgNr,
|
["mgnr"] = d.MgNr,
|
||||||
["parts"] = new JsonArray(d.Parts.OrderBy(p => p.DPNr).Select(p => {
|
["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}",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static JsonObject ToJson(this DeliveryPart p) {
|
||||||
var obj = new JsonObject {
|
var obj = new JsonObject {
|
||||||
["dpnr"] = p.DPNr,
|
["dpnr"] = p.DPNr,
|
||||||
["sortid"] = p.SortId,
|
["sortid"] = p.SortId,
|
||||||
@@ -752,14 +875,9 @@ namespace Elwig.Helpers.Export {
|
|||||||
if (p.WeighingData != null) obj["weighing_data"] = JsonNode.Parse(p.WeighingData);
|
if (p.WeighingData != null) obj["weighing_data"] = JsonNode.Parse(p.WeighingData);
|
||||||
if (p.WeighingReason != null) obj["weighing_reason"] = p.WeighingReason;
|
if (p.WeighingReason != null) obj["weighing_reason"] = p.WeighingReason;
|
||||||
return obj;
|
return obj;
|
||||||
}).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) {
|
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 year = json["year"]!.AsValue().GetValue<int>();
|
||||||
var lsnr = json["lsnr"]!.AsValue().GetValue<string>();
|
var lsnr = json["lsnr"]!.AsValue().GetValue<string>();
|
||||||
var did = currentLsNrs.GetValueOrDefault(lsnr, -1);
|
var did = currentLsNrs.GetValueOrDefault(lsnr, -1);
|
||||||
@@ -782,7 +900,7 @@ namespace Elwig.Helpers.Export {
|
|||||||
MgNr = json["mgnr"]!.AsValue().GetValue<int>(),
|
MgNr = json["mgnr"]!.AsValue().GetValue<int>(),
|
||||||
Comment = json["comment"]?.AsValue().GetValue<string>(),
|
Comment = json["comment"]?.AsValue().GetValue<string>(),
|
||||||
ImportedAt = DateTime.Now,
|
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 kgnr = p["kgnr"]?.AsValue().GetValue<int>();
|
||||||
var ried = p["ried"]?.AsValue().GetValue<string>();
|
var ried = p["ried"]?.AsValue().GetValue<string>();
|
||||||
WbRd? rd = null;
|
WbRd? rd = null;
|
||||||
@@ -800,7 +918,9 @@ namespace Elwig.Helpers.Export {
|
|||||||
wbRde.Add(rd);
|
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,
|
Year = year,
|
||||||
DId = did,
|
DId = did,
|
||||||
DPNr = p["dpnr"]!.AsValue().GetValue<int>(),
|
DPNr = p["dpnr"]!.AsValue().GetValue<int>(),
|
||||||
@@ -825,13 +945,15 @@ namespace Elwig.Helpers.Export {
|
|||||||
ScaleId = p["scale_id"]?.AsValue().GetValue<string>(),
|
ScaleId = p["scale_id"]?.AsValue().GetValue<string>(),
|
||||||
WeighingData = p["weighing_data"]?.AsObject().ToJsonString(Utils.JsonOpts),
|
WeighingData = p["weighing_data"]?.AsObject().ToJsonString(Utils.JsonOpts),
|
||||||
WeighingReason = p["weighing_reason"]?.AsValue().GetValue<string>(),
|
WeighingReason = p["weighing_reason"]?.AsValue().GetValue<string>(),
|
||||||
};
|
}, createdAt == null || modifiedAt == null ? null :
|
||||||
}).ToList(), json["parts"]!.AsArray().SelectMany(p => p!["modids"]!.AsArray().Select(m => new DeliveryPartModifier {
|
(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,
|
Year = year,
|
||||||
DId = did,
|
DId = did,
|
||||||
DPNr = p["dpnr"]!.AsValue().GetValue<int>(),
|
DPNr = p["dpnr"]!.AsValue().GetValue<int>(),
|
||||||
ModId = m!.AsValue().GetValue<string>(),
|
ModId = m!.AsValue().GetValue<string>(),
|
||||||
})).ToList(),
|
}))],
|
||||||
wbRde,
|
wbRde,
|
||||||
createdAt == null || modifiedAt == null ? null :
|
createdAt == null || modifiedAt == null ? null :
|
||||||
(DateTime.ParseExact(createdAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None),
|
(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);
|
var res = CheckInteger(input, required);
|
||||||
if (!res.IsValid) {
|
if (!res.IsValid) {
|
||||||
return res;
|
return res;
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
using Elwig.Helpers;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace Elwig.Models.Entities {
|
namespace Elwig.Models.Entities {
|
||||||
[Table("area_commitment"), PrimaryKey("FbNr")]
|
[Table("area_commitment"), PrimaryKey("FbNr", "RevNr")]
|
||||||
public class AreaCom {
|
public class AreaCom {
|
||||||
[Column("fbnr")]
|
[Column("fbnr")]
|
||||||
public int FbNr { get; set; }
|
public int FbNr { get; set; }
|
||||||
|
|
||||||
|
[Column("revnr")]
|
||||||
|
public int RevNr { get; set; }
|
||||||
|
|
||||||
[Column("mgnr")]
|
[Column("mgnr")]
|
||||||
public int MgNr { get; set; }
|
public int MgNr { get; set; }
|
||||||
|
|
||||||
@@ -22,24 +23,15 @@ namespace Elwig.Models.Entities {
|
|||||||
[Column("area")]
|
[Column("area")]
|
||||||
public int Area { get; set; }
|
public int Area { get; set; }
|
||||||
|
|
||||||
[Column("kgnr")]
|
|
||||||
public int KgNr { get; set; }
|
|
||||||
|
|
||||||
[Column("gstnr")]
|
[Column("gstnr")]
|
||||||
public required string GstNr { get; set; }
|
public required string GstNr { get; set; }
|
||||||
|
|
||||||
[Column("rdnr")]
|
|
||||||
public int? RdNr { get; set; }
|
|
||||||
|
|
||||||
[Column("year_from")]
|
[Column("year_from")]
|
||||||
public int? YearFrom { get; set; }
|
public int? YearFrom { get; set; }
|
||||||
|
|
||||||
[Column("year_to")]
|
[Column("year_to")]
|
||||||
public int? YearTo { get; set; }
|
public int? YearTo { get; set; }
|
||||||
|
|
||||||
[Column("comment")]
|
|
||||||
public string? Comment { get; set; }
|
|
||||||
|
|
||||||
[Column("ctime"), DatabaseGenerated(DatabaseGeneratedOption.Computed)]
|
[Column("ctime"), DatabaseGenerated(DatabaseGeneratedOption.Computed)]
|
||||||
public long CTime { get; set; }
|
public long CTime { get; set; }
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
@@ -72,6 +64,9 @@ namespace Elwig.Models.Entities {
|
|||||||
set => ITime = value == null ? null : ((DateTimeOffset)value.Value.ToUniversalTime()).ToUnixTimeSeconds();
|
set => ITime = value == null ? null : ((DateTimeOffset)value.Value.ToUniversalTime()).ToUnixTimeSeconds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[ForeignKey("FbNr")]
|
||||||
|
public virtual AreaComContract Contract { get; private set; } = null!;
|
||||||
|
|
||||||
[ForeignKey("MgNr")]
|
[ForeignKey("MgNr")]
|
||||||
public virtual Member Member { get; private set; } = null!;
|
public virtual Member Member { get; private set; } = null!;
|
||||||
|
|
||||||
@@ -80,17 +75,5 @@ namespace Elwig.Models.Entities {
|
|||||||
|
|
||||||
[ForeignKey("CultId")]
|
[ForeignKey("CultId")]
|
||||||
public virtual WineCult? WineCult { get; private set; }
|
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) {
|
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) {
|
public static void FillInputs(this AreaComAdminViewModel vm, AreaCom a) {
|
||||||
vm.FbNr = a.FbNr;
|
|
||||||
vm.MgNr = a.MgNr;
|
vm.MgNr = a.MgNr;
|
||||||
vm.YearFrom = a.YearFrom;
|
vm.YearFrom = a.YearFrom;
|
||||||
vm.YearTo = a.YearTo;
|
vm.YearTo = a.YearTo;
|
||||||
vm.AreaComType = ControlUtils.GetItemFromSourceWithPk(vm.AreaComTypeSource, a.VtrgId) as AreaComType;
|
vm.AreaComType = ControlUtils.GetItemFromSourceWithPk(vm.AreaComTypeSource, a.VtrgId) as AreaComType;
|
||||||
vm.WineCult = ControlUtils.GetItemFromSourceWithPk(vm.WineCultSource, a.CultId) as WineCult;
|
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.GstNr = a.GstNr;
|
||||||
vm.Area = a.Area;
|
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 = [];
|
List<string> filterNames = [];
|
||||||
IQueryable<AreaCom> areaComQuery = ctx.AreaCommitments.Where(a => a.MgNr == vm.FilterMember.MgNr).OrderBy(a => a.FbNr);
|
IQueryable<AreaCom> areaComQuery = ctx.AreaCommitments.Where(a => a.MgNr == vm.FilterMember.MgNr).OrderBy(a => a.FbNr);
|
||||||
if (vm.ShowOnlyActiveAreaComs) {
|
if (vm.FilterSeason is int season) {
|
||||||
areaComQuery = Utils.ActiveAreaCommitments(areaComQuery, Utils.CurrentLastSeason);
|
areaComQuery = Utils.ActiveAreaCommitments(areaComQuery, season);
|
||||||
filterNames.Add($"laufend {Utils.CurrentLastSeason}");
|
filterNames.Add($"laufend {season}");
|
||||||
}
|
}
|
||||||
|
|
||||||
var filterVar = new List<string>();
|
var filterVar = new List<string>();
|
||||||
var filterNotVar = new List<string>();
|
var filterNotVar = new List<string>();
|
||||||
var filterAttr = new List<string>();
|
var filterAttr = new List<string>();
|
||||||
var filterNotAttr = new List<string>();
|
var filterNotAttr = new List<string>();
|
||||||
var filterSeasons = new List<int>();
|
|
||||||
|
|
||||||
var filter = vm.TextFilter;
|
var filter = vm.TextFilter;
|
||||||
if (filter.Count > 0) {
|
if (filter.Count > 0) {
|
||||||
@@ -88,10 +92,6 @@ namespace Elwig.Services {
|
|||||||
filter.RemoveAt(i--);
|
filter.RemoveAt(i--);
|
||||||
filterNames.Add($"ohne {var[e[1..3].ToUpper()].Name}");
|
filterNames.Add($"ohne {var[e[1..3].ToUpper()].Name}");
|
||||||
filterNames.Add($"ohne Attribut {attrId[e[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 (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 (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));
|
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;
|
int newFbNr = vm.FbNr!.Value;
|
||||||
|
|
||||||
return await Task.Run(async () => {
|
return await Task.Run(async () => {
|
||||||
using var ctx = new AppDbContext();
|
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 {
|
var a = new AreaCom {
|
||||||
FbNr = oldFbNr ?? newFbNr,
|
FbNr = oldFbNr ?? newFbNr,
|
||||||
|
RevNr = revNr ?? await ctx.NextRevNr(oldFbNr ?? newFbNr),
|
||||||
MgNr = vm.MgNr!.Value,
|
MgNr = vm.MgNr!.Value,
|
||||||
YearFrom = vm.YearFrom,
|
YearFrom = vm.YearFrom,
|
||||||
YearTo = vm.YearTo,
|
YearTo = vm.YearTo,
|
||||||
VtrgId = vm.AreaComType!.VtrgId,
|
VtrgId = vm.AreaComType!.VtrgId,
|
||||||
CultId = vm.WineCult?.CultId,
|
CultId = vm.WineCult?.CultId,
|
||||||
Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
|
|
||||||
KgNr = vm.Kg!.KgNr,
|
|
||||||
RdNr = vm.Rd?.RdNr,
|
|
||||||
GstNr = vm.GstNr?.Trim() ?? "-",
|
GstNr = vm.GstNr?.Trim() ?? "-",
|
||||||
Area = vm.Area!.Value,
|
Area = vm.Area!.Value,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (vm.Rd?.RdNr == 0) {
|
if (vm.Rd?.RdNr == 0) {
|
||||||
vm.Rd.RdNr = await ctx.NextRdNr(a.KgNr);
|
vm.Rd.RdNr = await ctx.NextRdNr(c.KgNr);
|
||||||
a.RdNr = vm.Rd.RdNr;
|
c.RdNr = vm.Rd.RdNr;
|
||||||
ctx.Add(vm.Rd);
|
ctx.Add(vm.Rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oldFbNr != null) {
|
if (oldFbNr != null) {
|
||||||
|
ctx.Update(c);
|
||||||
|
} else {
|
||||||
|
ctx.Add(c);
|
||||||
|
}
|
||||||
|
if (revNr != null) {
|
||||||
ctx.Update(a);
|
ctx.Update(a);
|
||||||
} else {
|
} else {
|
||||||
ctx.Add(a);
|
ctx.Add(a);
|
||||||
@@ -139,10 +151,10 @@ namespace Elwig.Services {
|
|||||||
await ctx.SaveChangesAsync();
|
await ctx.SaveChangesAsync();
|
||||||
|
|
||||||
if (newFbNr != a.FbNr) {
|
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) {
|
public static async Task DeleteAreaCom(int fbnr) {
|
||||||
await Task.Run(async () => {
|
await Task.Run(async () => {
|
||||||
using var ctx = new AppDbContext();
|
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);
|
ctx.Remove(l);
|
||||||
await ctx.SaveChangesAsync();
|
await ctx.SaveChangesAsync();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -556,8 +556,10 @@ namespace Elwig.Services {
|
|||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
var areaComs = await query
|
var areaComs = await query
|
||||||
.SelectMany(m => m.AreaCommitments)
|
.SelectMany(m => m.AreaCommitments)
|
||||||
|
.Select(c => c.Contract).Distinct()
|
||||||
.Include(c => c.Rd)
|
.Include(c => c.Rd)
|
||||||
.Include(c => c.Kg.Gl)
|
.Include(c => c.Kg.Gl)
|
||||||
|
.Include(c => c.Revisions)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
var wbKgs = members
|
var wbKgs = members
|
||||||
.Where(m => m.DefaultWbKg != null)
|
.Where(m => m.DefaultWbKg != null)
|
||||||
@@ -681,19 +683,17 @@ namespace Elwig.Services {
|
|||||||
.Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year))
|
.Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year))
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
var fbNr = await ctx.NextFbNr();
|
ctx.AddRange(await Task.WhenAll(areaComs.Select(async (c, i) => new AreaCom {
|
||||||
ctx.AddRange(areaComs.Select((c, i) => new AreaCom {
|
FbNr = c.FbNr,
|
||||||
FbNr = fbNr + i,
|
RevNr = await ctx.NextRevNr(c.FbNr),
|
||||||
MgNr = m.MgNr,
|
MgNr = m.MgNr,
|
||||||
VtrgId = c.VtrgId,
|
VtrgId = c.VtrgId,
|
||||||
CultId = c.CultId,
|
CultId = c.CultId,
|
||||||
Area = c.Area,
|
Area = c.Area,
|
||||||
KgNr = c.KgNr,
|
|
||||||
GstNr = c.GstNr,
|
GstNr = c.GstNr,
|
||||||
RdNr = c.RdNr,
|
YearFrom = year,
|
||||||
YearFrom = vm.MaintainAreaComYearFrom ? c.YearFrom : year,
|
|
||||||
YearTo = c.YearTo,
|
YearTo = c.YearTo,
|
||||||
}));
|
})));
|
||||||
|
|
||||||
foreach (var ac in areaComs)
|
foreach (var ac in areaComs)
|
||||||
ac.YearTo = year - 1;
|
ac.YearTo = year - 1;
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ namespace Elwig.Services {
|
|||||||
public static class SyncService {
|
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<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 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) {
|
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();
|
.ToListAsync();
|
||||||
var areaComs = await query
|
var areaComs = await query
|
||||||
.SelectMany(m => m.AreaCommitments)
|
.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.Rd)
|
||||||
.Include(c => c.Kg.Gl)
|
.Include(c => c.Kg.Gl)
|
||||||
|
.Include(c => c.Revisions)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
var wbKgs = members
|
var wbKgs = members
|
||||||
.Where(m => m.DefaultWbKg != null)
|
.Where(m => m.DefaultWbKg != null)
|
||||||
@@ -50,7 +53,7 @@ namespace Elwig.Services {
|
|||||||
var exportedAt = DateTime.Now;
|
var exportedAt = DateTime.Now;
|
||||||
await ElwigData.Export(path, members, areaComs, wbKgs, filterNames);
|
await ElwigData.Export(path, members, areaComs, wbKgs, filterNames);
|
||||||
await Utils.UploadExportData(path, url, username, password);
|
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",
|
MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern erfolgreich!", "Mitglieder hochgeladen",
|
||||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
}
|
}
|
||||||
@@ -89,7 +92,7 @@ namespace Elwig.Services {
|
|||||||
var exportedAt = DateTime.Now;
|
var exportedAt = DateTime.Now;
|
||||||
await ElwigData.Export(path, list, wbKgs, filterNames);
|
await ElwigData.Export(path, list, wbKgs, filterNames);
|
||||||
await Utils.UploadExportData(path, url, username, password);
|
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",
|
MessageBox.Show($"Hochladen von {list.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochgeladen",
|
||||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
}
|
}
|
||||||
@@ -106,7 +109,7 @@ namespace Elwig.Services {
|
|||||||
try {
|
try {
|
||||||
var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip");
|
var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip");
|
||||||
List<Member> members;
|
List<Member> members;
|
||||||
List<AreaCom> areaComs;
|
List<AreaComContract> areaComs;
|
||||||
List<Delivery> deliveries;
|
List<Delivery> deliveries;
|
||||||
using (var ctx = new AppDbContext()) {
|
using (var ctx = new AppDbContext()) {
|
||||||
members = await ctx.Members
|
members = await ctx.Members
|
||||||
@@ -118,12 +121,12 @@ namespace Elwig.Services {
|
|||||||
.OrderBy(m => m.MgNr)
|
.OrderBy(m => m.MgNr)
|
||||||
.AsSplitQuery()
|
.AsSplitQuery()
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
areaComs = await ctx.Members
|
areaComs = await ctx.AreaCommitmentContracts
|
||||||
.Where(ChangedMembers)
|
.Where(ChangedAreaComContracts)
|
||||||
.SelectMany(m => m.AreaCommitments)
|
|
||||||
.Include(c => c.Rd)
|
.Include(c => c.Rd)
|
||||||
.Include(c => c.Kg.Gl)
|
.Include(c => c.Kg.Gl)
|
||||||
.OrderBy(c => c.MgNr).ThenBy(c => c.FbNr)
|
.Include(c => c.Revisions)
|
||||||
|
.OrderBy(c => c.FbNr)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
deliveries = await ctx.Deliveries
|
deliveries = await ctx.Deliveries
|
||||||
.Where(ChangedDeliveries)
|
.Where(ChangedDeliveries)
|
||||||
@@ -151,13 +154,13 @@ namespace Elwig.Services {
|
|||||||
var exportedAt = DateTime.Now;
|
var exportedAt = DateTime.Now;
|
||||||
await (new ElwigData.ElwigExport {
|
await (new ElwigData.ElwigExport {
|
||||||
Members = (members, ["geändert seit letztem Export"]),
|
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"]),
|
Deliveries = (deliveries, ["geändert seit letzem Export"]),
|
||||||
WbKgs = (wbKgs, ["von exportierten Mitgliedern, Flächenbindungen und Lieferungen"]),
|
WbKgs = (wbKgs, ["von exportierten Mitgliedern, Flächenbindungen und Lieferungen"]),
|
||||||
}).Export(path);
|
}).Export(path);
|
||||||
await Utils.UploadExportData(path, url, username, password);
|
await Utils.UploadExportData(path, url, username, password);
|
||||||
await UpdateExportedAt(members, deliveries, exportedAt);
|
await UpdateExportedAt(members, areaComs, deliveries, exportedAt);
|
||||||
MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern und {deliveries.Count:N0} Lieferungen erfolgreich!", "Mitglieder und Lieferungen hochladen",
|
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);
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
}
|
}
|
||||||
} catch (HttpRequestException exc) {
|
} catch (HttpRequestException exc) {
|
||||||
@@ -195,7 +198,7 @@ namespace Elwig.Services {
|
|||||||
var exportedAt = DateTime.Now;
|
var exportedAt = DateTime.Now;
|
||||||
await ElwigData.Export(path, deliveries, wbKgs, [$"{year}", $"Zweigstelle {App.BranchName}"]);
|
await ElwigData.Export(path, deliveries, wbKgs, [$"{year}", $"Zweigstelle {App.BranchName}"]);
|
||||||
await Utils.UploadExportData(path, url, username, password);
|
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",
|
MessageBox.Show($"Hochladen von {deliveries.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochladen",
|
||||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
}
|
}
|
||||||
@@ -251,16 +254,18 @@ 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 timestamp = ((DateTimeOffset)dateTime.ToUniversalTime()).ToUnixTimeSeconds();
|
||||||
var mgnrs = string.Join(",", member.Select(m => $"{m.MgNr}").Append("0"));
|
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)"));
|
var dids = string.Join(",", deliveries.Select(d => $"({d.Year},{d.DId})").Append("(0,0)"));
|
||||||
using (var cnx = await AppDbContext.ConnectAsync()) {
|
using (var cnx = await AppDbContext.ConnectAsync()) {
|
||||||
await cnx.ExecuteBatch($"""
|
await cnx.ExecuteBatch($"""
|
||||||
BEGIN;
|
BEGIN;
|
||||||
UPDATE client_parameter SET value = '0' 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 member SET xtime = {timestamp} WHERE mgnr IN ({mgnrs});
|
||||||
UPDATE area_commitment 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 SET xtime = {timestamp} WHERE (year, did) IN ({dids});
|
||||||
UPDATE delivery_part 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 = '1' WHERE param = 'ENABLE_TIME_TRIGGERS';
|
||||||
@@ -272,7 +277,7 @@ namespace Elwig.Services {
|
|||||||
|
|
||||||
public static async Task<bool> ChangesAvailable(AppDbContext ctx, string url, string username, string password) {
|
public static async Task<bool> ChangesAvailable(AppDbContext ctx, string url, string username, string password) {
|
||||||
try {
|
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 {
|
} catch {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,11 @@ namespace Elwig.ViewModels {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private bool _showOnlyActiveAreaComs;
|
private string? _filterSeasonString;
|
||||||
|
public int? FilterSeason {
|
||||||
|
get => int.TryParse(FilterSeasonString, out var year) ? year : null;
|
||||||
|
set => FilterSeasonString = $"{value}";
|
||||||
|
}
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private string? _fbNrString;
|
private string? _fbNrString;
|
||||||
@@ -46,6 +50,8 @@ namespace Elwig.ViewModels {
|
|||||||
get => int.TryParse(YearToString, out var year) ? year : null;
|
get => int.TryParse(YearToString, out var year) ? year : null;
|
||||||
set => YearToString = $"{value}";
|
set => YearToString = $"{value}";
|
||||||
}
|
}
|
||||||
|
[ObservableProperty]
|
||||||
|
private string? _period;
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private AreaComType? _areaComType;
|
private AreaComType? _areaComType;
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ namespace Elwig.ViewModels {
|
|||||||
public partial class MemberAdminViewModel : ObservableObject {
|
public partial class MemberAdminViewModel : ObservableObject {
|
||||||
|
|
||||||
public int? TransferPredecessorAreaComs = null;
|
public int? TransferPredecessorAreaComs = null;
|
||||||
public bool MaintainAreaComYearFrom = false;
|
|
||||||
public int? CancelAreaComs = null;
|
public int? CancelAreaComs = null;
|
||||||
|
|
||||||
public ObservableCollection<KeyValuePair<string, string>> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes);
|
public ObservableCollection<KeyValuePair<string, string>> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
xmlns:local="clr-namespace:Elwig.Windows"
|
xmlns:local="clr-namespace:Elwig.Windows"
|
||||||
xmlns:ctrl="clr-namespace:Elwig.Controls"
|
xmlns:ctrl="clr-namespace:Elwig.Controls"
|
||||||
xmlns:vm="clr-namespace:Elwig.ViewModels"
|
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>
|
<Window.DataContext>
|
||||||
<vm:AreaComAdminViewModel/>
|
<vm:AreaComAdminViewModel/>
|
||||||
</Window.DataContext>
|
</Window.DataContext>
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
<RowDefinition Height="24"/>
|
<RowDefinition Height="24"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="3*" MinWidth="500"/>
|
<ColumnDefinition Width="2*" MinWidth="500"/>
|
||||||
<ColumnDefinition Width="5"/>
|
<ColumnDefinition Width="5"/>
|
||||||
<ColumnDefinition Width="*" MinWidth="280"/>
|
<ColumnDefinition Width="*" MinWidth="280"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<TextBox x:Name="SearchInput" Text="{Binding SearchQuery, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
<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">
|
TextChanged="SearchInput_TextChanged">
|
||||||
<TextBox.ToolTip>
|
<TextBox.ToolTip>
|
||||||
<TextBlock>
|
<TextBlock>
|
||||||
@@ -93,9 +93,10 @@
|
|||||||
</TextBlock>
|
</TextBlock>
|
||||||
</TextBox.ToolTip>
|
</TextBox.ToolTip>
|
||||||
</TextBox>
|
</TextBox>
|
||||||
<CheckBox x:Name="ActiveAreaCommitmentInput" Content="Nur laufende anzeigen (2020)" IsChecked="{Binding ShowOnlyActiveAreaComs}"
|
<ctrl:IntegerUpDown x:Name="SeasonInput" Text="{Binding FilterSeasonString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
Checked="ActiveAreaCommitmentInput_Changed" Unchecked="ActiveAreaCommitmentInput_Changed"
|
Grid.ColumnSpan="3" Height="25" Width="56" FontSize="14" Minimum="1900" Maximum="9999"
|
||||||
HorizontalAlignment="Right" Margin="0,10,10,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"/>
|
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"
|
<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"
|
CanUserDeleteRows="False" CanUserResizeRows="False" CanUserAddRows="False" SelectionChanged="AreaCommitmentList_SelectionChanged" Grid.Column="0" Grid.Row="1"
|
||||||
@@ -109,25 +110,24 @@
|
|||||||
</DataGridTextColumn.CellStyle>
|
</DataGridTextColumn.CellStyle>
|
||||||
</DataGridTextColumn>
|
</DataGridTextColumn>
|
||||||
<DataGridTextColumn Header="Katastralgemeinde" Binding="{Binding Kg.AtKg.Name}" Width="130"/>
|
<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>
|
<DataGridTextColumn.CellStyle>
|
||||||
<Style>
|
<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"/>
|
<Setter Property="TextBlock.TextAlignment" Value="Center"/>
|
||||||
</Style>
|
</Style>
|
||||||
</DataGridTextColumn.CellStyle>
|
</DataGridTextColumn.CellStyle>
|
||||||
</DataGridTextColumn>
|
</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>
|
<DataGridTextColumn.CellStyle>
|
||||||
<Style>
|
<Style>
|
||||||
<Setter Property="TextBlock.TextAlignment" Value="Right"/>
|
<Setter Property="TextBlock.TextAlignment" Value="Right"/>
|
||||||
</Style>
|
</Style>
|
||||||
</DataGridTextColumn.CellStyle>
|
</DataGridTextColumn.CellStyle>
|
||||||
</DataGridTextColumn>
|
</DataGridTextColumn>
|
||||||
<DataGridTextColumn Header="Attribut" Binding="{Binding AreaComType.WineAttr.Name}" Width="100"/>
|
|
||||||
<DataGridTextColumn Header="Ried" Binding="{Binding Rd.Name}" Width="130"/>
|
<DataGridTextColumn Header="Ried" Binding="{Binding Rd.Name}" Width="130"/>
|
||||||
<DataGridTextColumn Header="Parzelle" Binding="{Binding GstNr}" Width="130"/>
|
<DataGridTextColumn Header="Parzelle" Binding="{Binding Latest.GstNr}" Width="130"/>
|
||||||
<DataGridTextColumn Header="Bewirt." Binding="{Binding WineCult.Name}" Width="60"/>
|
<DataGridTextColumn Header="Bewirt." Binding="{Binding Latest.WineCult.Name}" Width="60"/>
|
||||||
<DataGridTextColumn Header="Von" Binding="{Binding YearFrom}" Width="48"/>
|
<DataGridTextColumn Header="Von" Binding="{Binding YearFrom}" Width="48"/>
|
||||||
<DataGridTextColumn Header="Bis" Binding="{Binding YearTo}" Width="48"/>
|
<DataGridTextColumn Header="Bis" Binding="{Binding YearTo}" Width="48"/>
|
||||||
</DataGrid.Columns>
|
</DataGrid.Columns>
|
||||||
@@ -176,91 +176,119 @@
|
|||||||
|
|
||||||
<Grid Grid.Column="2" Grid.Row="1">
|
<Grid Grid.Column="2" Grid.Row="1">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="1.125*"/>
|
<RowDefinition Height="*"/>
|
||||||
<RowDefinition Height="1*"/>
|
<RowDefinition Height="230"/>
|
||||||
</Grid.RowDefinitions>
|
</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>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="80"/>
|
<ColumnDefinition Width="80"/>
|
||||||
<ColumnDefinition Width="48"/>
|
<ColumnDefinition Width="60"/>
|
||||||
<ColumnDefinition Width="60"/>
|
<ColumnDefinition Width="60"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Label Content="MgNr.:" Margin="10,10,0,0" Grid.Column="0"/>
|
<Label Content="FB-Nr.:" 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"/>
|
|
||||||
<TextBox x:Name="FbNrInput" Text="{Binding FbNrString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
<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"/>
|
TextChanged="FbNrInput_TextChanged" LostFocus="FbNrInput_LostFocus"/>
|
||||||
|
|
||||||
<Label Content="Zeitraum:" Margin="10,40,0,0" Grid.Column="0"/>
|
<Label Content="Laufzeit:" Margin="10,10,0,0" Grid.Column="2"/>
|
||||||
<TextBox x:Name="YearFromInput" Text="{Binding YearFromString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
<TextBlock x:Name="Period" Text="{Binding Period}"
|
||||||
Margin="0,40,10,0" Width="40" HorizontalAlignment="Left" Grid.Column="1" Grid.ColumnSpan="2" TextAlignment="Right"
|
Margin="0,14,10,0" Grid.Column="3" TextWrapping="NoWrap" VerticalAlignment="Top"/>
|
||||||
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="Vertragsart:" Margin="10,70,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
<Label Content="KG:" Margin="10,40,0,0" Grid.Column="0"/>
|
||||||
<ComboBox x:Name="AreaComTypeInput" SelectedItem="{Binding AreaComType, Mode=TwoWay}" ItemsSource="{Binding AreaComTypeSource, Mode=TwoWay}"
|
<ComboBox x:Name="KgInput" SelectedItem="{Binding Kg, Mode=TwoWay}" ItemsSource="{Binding KgSource, Mode=TwoWay}"
|
||||||
ItemTemplate="{StaticResource AreaCommitmentTypeTemplate}" TextSearch.TextPath="DisplayName"
|
ItemTemplate="{StaticResource KgNrTemplate}" TextSearch.TextPath="Name"
|
||||||
HorizontalAlignment="Stretch" Margin="0,70,40,10" Grid.Column="1" Grid.ColumnSpan="3"/>
|
HorizontalAlignment="Stretch" Margin="0,40,40,10" Grid.Column="1" Grid.ColumnSpan="3"
|
||||||
<Button x:Name="AreaComTypeDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
SelectionChanged="KgInput_SelectionChanged"/>
|
||||||
Click="AreaComTypeDetailsButton_Click"
|
<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"/>
|
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"/>
|
<Label Content="Anmerkung:" 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"/>
|
|
||||||
<TextBox x:Name="CommentInput" Text="{Binding Comment, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
<TextBox x:Name="CommentInput" Text="{Binding Comment, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
TextChanged="TextBox_TextChanged"
|
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>
|
</Grid>
|
||||||
</GroupBox>
|
</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>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="80"/>
|
<ColumnDefinition Width="80"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Label Content="KG:" Margin="10,10,0,0" Grid.Column="0"/>
|
<Label Content="Mitglied:" Margin="10,10,0,0" Grid.Column="0"/>
|
||||||
<ComboBox x:Name="KgInput" SelectedItem="{Binding Kg, Mode=TwoWay}" ItemsSource="{Binding KgSource, Mode=TwoWay}"
|
<TextBox x:Name="MgNrInput" Text="{Binding MgNrString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
ItemTemplate="{StaticResource KgNrTemplate}" TextSearch.TextPath="Name"
|
Width="48" Grid.Row="1" Grid.Column="1" Margin="0,10,0,0" HorizontalAlignment="Left" TextAlignment="Right"
|
||||||
HorizontalAlignment="Stretch" Margin="0,10,40,10" Grid.Column="1"
|
TextChanged="MgNrInput_TextChanged" LostFocus="MgNrInput_LostFocus"/>
|
||||||
SelectionChanged="KgInput_SelectionChanged"/>
|
<ComboBox x:Name="MemberInput"
|
||||||
<Button x:Name="KgDetailsButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="14" Padding="0,1,0,0"
|
Grid.Column="1" Margin="53,10,40,10" IsEditable="True"
|
||||||
Click="KgDetailsButton_Click"
|
ItemTemplate="{StaticResource MemberAdminNameTemplate}" TextSearch.TextPath="AdministrativeName"
|
||||||
Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,10,10,10"/>
|
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"/>
|
<Label Content="Laufzeit:" Margin="10,40,0,0" Grid.Column="0"/>
|
||||||
<ComboBox x:Name="RdInput" SelectedItem="{Binding RdObj, Mode=TwoWay}" ItemsSource="{Binding RdSource, Mode=TwoWay}"
|
<TextBox x:Name="YearFromInput" Text="{Binding YearFromString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
DisplayMemberPath="Name" TextSearch.TextPath="Name" IsEditable="True"
|
Margin="0,40,10,0" Width="40" HorizontalAlignment="Left" Grid.Column="1" TextAlignment="Right"
|
||||||
HorizontalAlignment="Stretch" Margin="0,40,40,10" Grid.Column="1"
|
TextChanged="IntegerInput_TextChanged"/>
|
||||||
SelectionChanged="RdInput_SelectionChanged"/>
|
<Label Content="–" Grid.Column="1" Margin="45,40,0,0"/>
|
||||||
<Button x:Name="RdAddButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="16" Padding="0,0,0,0" IsEnabled="False"
|
<TextBox x:Name="YearToInput" Text="{Binding YearToString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
Click="RdAddButton_Click"
|
Margin="60,40,10,0" Width="40" HorizontalAlignment="Left" Grid.Column="1" TextAlignment="Right"
|
||||||
Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25" Margin="10,40,10,10"/>
|
TextChanged="IntegerInput_TextChanged"/>
|
||||||
|
|
||||||
<Label Content="Parzelle(n):" Margin="10,70,0,0" Grid.Column="0"/>
|
<Label Content="Vertragsart:" Margin="10,70,0,0" Grid.Column="0"/>
|
||||||
<TextBox x:Name="GstNrInput" Text="{Binding GstNr, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
<ComboBox x:Name="AreaComTypeInput" SelectedItem="{Binding AreaComType, Mode=TwoWay}" ItemsSource="{Binding AreaComTypeSource, Mode=TwoWay}"
|
||||||
Margin="0,70,10,0" Grid.Column="1" HorizontalAlignment="Stretch"
|
ItemTemplate="{StaticResource AreaCommitmentTypeTemplate}" TextSearch.TextPath="DisplayName"
|
||||||
TextChanged="TextBox_TextChanged"/>
|
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}"
|
<ctrl:UnitTextBox x:Name="AreaInput" Unit="m²" Text="{Binding AreaString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
TextChanged="IntegerInput_TextChanged"
|
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>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -25,19 +25,18 @@ namespace Elwig.Windows {
|
|||||||
ViewModel.FilterMember = ctx.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value");
|
ViewModel.FilterMember = ctx.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value");
|
||||||
ViewModel.Title = $"Flächenbindungen - {ViewModel.FilterMember.AdministrativeName} - Elwig";
|
ViewModel.Title = $"Flächenbindungen - {ViewModel.FilterMember.AdministrativeName} - Elwig";
|
||||||
ExemptInputs = [
|
ExemptInputs = [
|
||||||
MgNrInput, AreaCommitmentList, NewAreaCommitmentButton,
|
AreaCommitmentList, RevisionList,
|
||||||
EditAreaCommitmentButton, DeleteAreaCommitmentButton, SaveButton,
|
NewAreaCommitmentButton, EditAreaCommitmentButton, DeleteAreaCommitmentButton, SaveButton,
|
||||||
ResetButton, CancelButton, SearchInput, ActiveAreaCommitmentInput
|
ResetButton, CancelButton, SearchInput, SeasonInput
|
||||||
];
|
];
|
||||||
RequiredInputs = [
|
RequiredInputs = [
|
||||||
FbNrInput, YearFromInput, KgInput, RdInput,
|
FbNrInput, MgNrInput, MemberInput, YearFromInput, KgInput, RdInput,
|
||||||
GstNrInput, AreaInput, AreaComTypeInput, WineCultivationInput
|
GstNrInput, AreaInput, AreaComTypeInput, WineCultivationInput
|
||||||
];
|
];
|
||||||
|
|
||||||
ControlUtils.InitializeDelayTimer(SearchInput, SearchInput_TextChanged);
|
ControlUtils.InitializeDelayTimer(SearchInput, SearchInput_TextChanged);
|
||||||
SearchInput.TextChanged -= SearchInput_TextChanged;
|
SearchInput.TextChanged -= SearchInput_TextChanged;
|
||||||
ActiveAreaCommitmentInput.Content = ((string)ActiveAreaCommitmentInput.Content).Replace("2020", $"{Utils.CurrentLastSeason}");
|
ViewModel.FilterSeason = Utils.CurrentYear;
|
||||||
ActiveAreaCommitmentInput.IsChecked = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async Task OnInit(AppDbContext ctx) {
|
protected override async Task OnInit(AppDbContext ctx) {
|
||||||
@@ -55,24 +54,32 @@ namespace Elwig.Windows {
|
|||||||
var vm = ViewModel;
|
var vm = ViewModel;
|
||||||
var cursor = Mouse.OverrideCursor != null;
|
var cursor = Mouse.OverrideCursor != null;
|
||||||
if (!cursor) Mouse.OverrideCursor = Cursors.Wait;
|
if (!cursor) Mouse.OverrideCursor = Cursors.Wait;
|
||||||
var query = (vm.SearchQuery, vm.ShowOnlyActiveAreaComs);
|
var query = (vm.SearchQuery, vm.FilterSeason);
|
||||||
var (filter, areaComs, areaComCount, stat) = await Task.Run(async () => {
|
var (filter, contracts, areaComs, areaComCount, stat) = await Task.Run(async () => {
|
||||||
using var ctx = new AppDbContext();
|
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
|
var areaComs = await areaComQuery
|
||||||
.Include(a => a.Kg.AtKg)
|
.Include(c => c.Contract.Kg.AtKg)
|
||||||
.Include(a => a.Rd!.Kg.AtKg)
|
.Include(c => c.Contract.Rd!.Kg.AtKg)
|
||||||
.Include(a => a.WineCult)
|
.Include(a => a.WineCult)
|
||||||
.Include(a => a.AreaComType.WineAttr)
|
.Include(a => a.AreaComType.WineAttr)
|
||||||
.Include(a => a.AreaComType.WineVar)
|
.Include(a => a.AreaComType.WineVar)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
if (filter.Count > 0 && areaComs.Count > 0) {
|
if (filter.Count > 0 && contracts.Count > 0) {
|
||||||
var dict = areaComs.AsParallel()
|
var dict = contracts.AsParallel()
|
||||||
.ToDictionary(d => d, d => d.SearchScore(vm.TextFilter))
|
.ToDictionary(d => d, d => d.SearchScore(vm.TextFilter))
|
||||||
.OrderByDescending(c => c.Value);
|
.OrderByDescending(c => c.Value);
|
||||||
var threshold = dict.Max(a => a.Value) * 3 / 4;
|
var threshold = dict.Max(a => a.Value) * 3 / 4;
|
||||||
areaComs = [.. dict
|
contracts = [.. dict
|
||||||
.Where(a => a.Value > threshold)
|
.Where(a => a.Value > threshold)
|
||||||
.Select(a => a.Key)];
|
.Select(a => a.Key)];
|
||||||
}
|
}
|
||||||
@@ -81,12 +88,12 @@ namespace Elwig.Windows {
|
|||||||
var season = await ctx.Seasons.FindAsync(await ctx.Seasons.MaxAsync(s => s.Year));
|
var season = await ctx.Seasons.FindAsync(await ctx.Seasons.MaxAsync(s => s.Year));
|
||||||
var stat = await AreaComService.GenerateToolTipData(areaComQuery, season?.MaxKgPerHa ?? 10_000);
|
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 (!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);
|
AreaCommitmentList_SelectionChanged, ViewModel.TextFilter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort);
|
||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
|
|
||||||
@@ -96,8 +103,8 @@ namespace Elwig.Windows {
|
|||||||
ViewModel.StatusArea = text;
|
ViewModel.StatusArea = text;
|
||||||
ViewModel.StatusAreaToolTip = AreaComService.GenerateToolTip(gridData);
|
ViewModel.StatusAreaToolTip = AreaComService.GenerateToolTip(gridData);
|
||||||
} else {
|
} else {
|
||||||
ViewModel.StatusAreaCommitments = $"{areaComs.Count:N0}";
|
ViewModel.StatusAreaCommitments = $"{contracts.Count:N0}";
|
||||||
ViewModel.StatusArea = $"{areaComs.Select(a => a.Area).Sum():N0} m²";
|
ViewModel.StatusArea = $"{areaComs.Sum(a => a.Area):N0} m²";
|
||||||
ViewModel.StatusAreaToolTip = null;
|
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();
|
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))})";
|
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) {
|
private void RefreshInputs(bool validate = false) {
|
||||||
ClearInputStates();
|
ClearInputStates();
|
||||||
if (AreaCommitmentList.SelectedItem is AreaCom a) {
|
if (RevisionList.SelectedItem is AreaCom a) {
|
||||||
EditAreaCommitmentButton.IsEnabled = true;
|
EditAreaCommitmentButton.IsEnabled = true;
|
||||||
DeleteAreaCommitmentButton.IsEnabled = true;
|
DeleteAreaCommitmentButton.IsEnabled = true;
|
||||||
FillInputs(a);
|
FillInputs(a);
|
||||||
|
} else if (AreaCommitmentList.SelectedItem is AreaComContract c) {
|
||||||
|
EditAreaCommitmentButton.IsEnabled = true;
|
||||||
|
DeleteAreaCommitmentButton.IsEnabled = true;
|
||||||
|
FillInputs(c);
|
||||||
} else {
|
} else {
|
||||||
EditAreaCommitmentButton.IsEnabled = false;
|
EditAreaCommitmentButton.IsEnabled = false;
|
||||||
DeleteAreaCommitmentButton.IsEnabled = false;
|
DeleteAreaCommitmentButton.IsEnabled = false;
|
||||||
@@ -123,7 +143,15 @@ namespace Elwig.Windows {
|
|||||||
GC.Collect();
|
GC.Collect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void FillInputs(AreaComContract c) {
|
||||||
|
ClearOriginalValues();
|
||||||
|
ClearDefaultValues();
|
||||||
|
ViewModel.FillInputs(c);
|
||||||
|
FinishInputFilling();
|
||||||
|
}
|
||||||
|
|
||||||
private void FillInputs(AreaCom a) {
|
private void FillInputs(AreaCom a) {
|
||||||
|
FillInputs(a.Contract);
|
||||||
ClearOriginalValues();
|
ClearOriginalValues();
|
||||||
ClearDefaultValues();
|
ClearDefaultValues();
|
||||||
ViewModel.FillInputs(a);
|
ViewModel.FillInputs(a);
|
||||||
@@ -138,6 +166,11 @@ namespace Elwig.Windows {
|
|||||||
ValidateRequiredInputs();
|
ValidateRequiredInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
new protected void ClearInputs(bool validate = false) {
|
||||||
|
ViewModel.ClearInputs();
|
||||||
|
base.ClearInputs(validate);
|
||||||
|
}
|
||||||
|
|
||||||
protected override async Task OnRenewContext(AppDbContext ctx) {
|
protected override async Task OnRenewContext(AppDbContext ctx) {
|
||||||
await base.OnRenewContext(ctx);
|
await base.OnRenewContext(ctx);
|
||||||
|
|
||||||
@@ -158,6 +191,9 @@ namespace Elwig.Windows {
|
|||||||
.Include(c => c.WineAttr)
|
.Include(c => c.WineAttr)
|
||||||
.OrderBy(v => v.VtrgId)
|
.OrderBy(v => v.VtrgId)
|
||||||
.ToListAsync());
|
.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
|
var cultList = await ctx.WineCultivations
|
||||||
.OrderBy(c => c.Name)
|
.OrderBy(c => c.Name)
|
||||||
.Cast<object>().ToListAsync();
|
.Cast<object>().ToListAsync();
|
||||||
@@ -176,6 +212,7 @@ namespace Elwig.Windows {
|
|||||||
IsCreating = true;
|
IsCreating = true;
|
||||||
AreaCommitmentList.IsEnabled = false;
|
AreaCommitmentList.IsEnabled = false;
|
||||||
AreaCommitmentList.SelectedItem = null;
|
AreaCommitmentList.SelectedItem = null;
|
||||||
|
RevisionList.IsEnabled = false;
|
||||||
HideNewEditDeleteButtons();
|
HideNewEditDeleteButtons();
|
||||||
ShowSaveResetCancelButtons();
|
ShowSaveResetCancelButtons();
|
||||||
UnlockInputs();
|
UnlockInputs();
|
||||||
@@ -196,6 +233,7 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
IsEditing = true;
|
IsEditing = true;
|
||||||
AreaCommitmentList.IsEnabled = false;
|
AreaCommitmentList.IsEnabled = false;
|
||||||
|
RevisionList.IsEnabled = false;
|
||||||
|
|
||||||
HideNewEditDeleteButtons();
|
HideNewEditDeleteButtons();
|
||||||
ShowSaveResetCancelButtons();
|
ShowSaveResetCancelButtons();
|
||||||
@@ -210,10 +248,10 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async void DeleteAreaCommitmentButton_Click(object? sender, RoutedEventArgs? evt) {
|
private async void DeleteAreaCommitmentButton_Click(object? sender, RoutedEventArgs? evt) {
|
||||||
if (AreaCommitmentList.SelectedItem is not AreaCom a)
|
if (RevisionList.SelectedItem is not AreaCom a)
|
||||||
return;
|
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)
|
if (d.ShowDialog() != true)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -221,7 +259,7 @@ namespace Elwig.Windows {
|
|||||||
try {
|
try {
|
||||||
if (d.YearTo is int yearTo) {
|
if (d.YearTo is int yearTo) {
|
||||||
ViewModel.YearTo = yearTo;
|
ViewModel.YearTo = yearTo;
|
||||||
await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaCom)?.FbNr);
|
await ViewModel.UpdateAreaCommitment(a.FbNr, a.RevNr);
|
||||||
} else {
|
} else {
|
||||||
await AreaComService.DeleteAreaCom(a.FbNr);
|
await AreaComService.DeleteAreaCom(a.FbNr);
|
||||||
}
|
}
|
||||||
@@ -244,42 +282,38 @@ namespace Elwig.Windows {
|
|||||||
SaveButton.IsEnabled = false;
|
SaveButton.IsEnabled = false;
|
||||||
|
|
||||||
int? yearTo = null;
|
int? yearTo = null;
|
||||||
if (InputHasChanged(AreaInput) || InputHasChanged(AreaComTypeInput)) {
|
if (InputHasChanged(AreaInput) || InputHasChanged(AreaComTypeInput) || InputHasChanged(MgNrInput)) {
|
||||||
var a = (AreaCommitmentList.SelectedItem as AreaCom)!;
|
var a = (RevisionList.SelectedItem as AreaCom)!;
|
||||||
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, false);
|
var d = new AreaComModifyDialog(a.YearFrom, a.YearTo, a.Area, false, RevisionList.ItemsSource.Cast<object>().FirstOrDefault() != a);
|
||||||
if (d.ShowDialog() != true)
|
if (d.ShowDialog() != true) {
|
||||||
|
SaveButton.IsEnabled = true;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
yearTo = d.YearTo;
|
yearTo = d.YearTo;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fbnr;
|
int fbnr, revnr;
|
||||||
Mouse.OverrideCursor = Cursors.Wait;
|
Mouse.OverrideCursor = Cursors.Wait;
|
||||||
try {
|
try {
|
||||||
AreaCom? temp = null;
|
AreaCom? temp = null;
|
||||||
if (yearTo != null && (!ViewModel.YearTo.HasValue || yearTo < ViewModel.YearTo)) {
|
if (yearTo != null && (!ViewModel.YearTo.HasValue || yearTo < ViewModel.YearTo)) {
|
||||||
temp = new AreaCom {
|
temp = new AreaCom {
|
||||||
FbNr = ViewModel.FbNr!.Value,
|
|
||||||
MgNr = ViewModel.MgNr!.Value,
|
MgNr = ViewModel.MgNr!.Value,
|
||||||
YearFrom = ViewModel.YearFrom,
|
YearFrom = ViewModel.YearFrom,
|
||||||
YearTo = ViewModel.YearTo,
|
YearTo = ViewModel.YearTo,
|
||||||
VtrgId = ViewModel.AreaComType!.VtrgId,
|
VtrgId = ViewModel.AreaComType!.VtrgId,
|
||||||
CultId = ViewModel.WineCult?.CultId,
|
CultId = ViewModel.WineCult?.CultId,
|
||||||
Comment = ViewModel.Comment,
|
|
||||||
KgNr = ViewModel.Kg!.KgNr,
|
|
||||||
RdNr = ViewModel.Rd?.RdNr,
|
|
||||||
GstNr = ViewModel.GstNr?.Trim() ?? "-",
|
GstNr = ViewModel.GstNr?.Trim() ?? "-",
|
||||||
Area = ViewModel.Area!.Value,
|
Area = ViewModel.Area!.Value,
|
||||||
};
|
};
|
||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
ViewModel.YearTo = yearTo;
|
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) {
|
if (temp is AreaCom t) {
|
||||||
await ViewModel.InitInputs();
|
|
||||||
t.FbNr = ViewModel.FbNr!.Value;
|
|
||||||
t.YearFrom = yearTo + 1;
|
t.YearFrom = yearTo + 1;
|
||||||
ViewModel.FillInputs(t);
|
ViewModel.FillInputs(t);
|
||||||
fbnr = await ViewModel.UpdateAreaCommitment(null);
|
(fbnr, revnr) = await ViewModel.UpdateAreaCommitment((AreaCommitmentList.SelectedItem as AreaComContract)?.FbNr, null);
|
||||||
}
|
}
|
||||||
App.HintContextChange();
|
App.HintContextChange();
|
||||||
} catch (Exception exc) {
|
} catch (Exception exc) {
|
||||||
@@ -294,6 +328,7 @@ namespace Elwig.Windows {
|
|||||||
IsEditing = false;
|
IsEditing = false;
|
||||||
IsCreating = false;
|
IsCreating = false;
|
||||||
AreaCommitmentList.IsEnabled = true;
|
AreaCommitmentList.IsEnabled = true;
|
||||||
|
RevisionList.IsEnabled = true;
|
||||||
HideSaveResetCancelButtons();
|
HideSaveResetCancelButtons();
|
||||||
ShowNewEditDeleteButtons();
|
ShowNewEditDeleteButtons();
|
||||||
LockInputs();
|
LockInputs();
|
||||||
@@ -302,7 +337,9 @@ namespace Elwig.Windows {
|
|||||||
await EnsureContextRenewed();
|
await EnsureContextRenewed();
|
||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
ViewModel.SearchQuery = "";
|
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() {
|
protected override void ShortcutReset() {
|
||||||
@@ -324,6 +361,7 @@ namespace Elwig.Windows {
|
|||||||
IsEditing = false;
|
IsEditing = false;
|
||||||
IsCreating = false;
|
IsCreating = false;
|
||||||
AreaCommitmentList.IsEnabled = true;
|
AreaCommitmentList.IsEnabled = true;
|
||||||
|
RevisionList.IsEnabled = true;
|
||||||
HideSaveResetCancelButtons();
|
HideSaveResetCancelButtons();
|
||||||
ShowNewEditDeleteButtons();
|
ShowNewEditDeleteButtons();
|
||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
@@ -385,22 +423,46 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
private void LockSearchInputs() {
|
private void LockSearchInputs() {
|
||||||
SearchInput.IsEnabled = false;
|
SearchInput.IsEnabled = false;
|
||||||
ActiveAreaCommitmentInput.IsEnabled = false;
|
SeasonInput.IsEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UnlockSearchInputs() {
|
private void UnlockSearchInputs() {
|
||||||
SearchInput.IsEnabled = true;
|
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)
|
if (AreaCommitmentList.SelectedItem != null)
|
||||||
AreaCommitmentList.ScrollIntoView(AreaCommitmentList.SelectedItem);
|
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) {
|
private async void ActiveAreaCommitmentInput_Changed(object sender, RoutedEventArgs evt) {
|
||||||
@@ -413,6 +475,11 @@ namespace Elwig.Windows {
|
|||||||
await RefreshList(true);
|
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) {
|
private void KgInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||||
if (KgInput.SelectedItem is AT_Kg kg) {
|
if (KgInput.SelectedItem is AT_Kg kg) {
|
||||||
var rdList = kg.WbKg!.Rds.OrderBy(r => r.Name).Cast<object>().ToList();
|
var rdList = kg.WbKg!.Rds.OrderBy(r => r.Name).Cast<object>().ToList();
|
||||||
@@ -450,12 +517,12 @@ namespace Elwig.Windows {
|
|||||||
RdInput.SelectedIndex = s.Count();
|
RdInput.SelectedIndex = s.Count();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void InputTextChanged(TextBox input, Func<TextBox, bool, AreaCom?, ValidationResult> checker) {
|
protected void InputTextChanged(TextBox input, Func<TextBox, bool, AreaComContract?, ValidationResult> checker) {
|
||||||
InputTextChanged(input, checker(input, SenderIsRequired(input), (AreaCom)AreaCommitmentList.SelectedItem));
|
InputTextChanged(input, checker(input, SenderIsRequired(input), (AreaComContract)AreaCommitmentList.SelectedItem));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AreaCom?, ValidationResult> checker, string? msg = null) {
|
protected void InputLostFocus(TextBox input, Func<TextBox, bool, AreaComContract?, ValidationResult> checker, string? msg = null) {
|
||||||
InputLostFocus(input, checker(input, SenderIsRequired(input), (AreaCom)AreaCommitmentList.SelectedItem), msg);
|
InputLostFocus(input, checker(input, SenderIsRequired(input), (AreaComContract)AreaCommitmentList.SelectedItem), msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FbNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
private void FbNrInput_TextChanged(object sender, RoutedEventArgs evt) {
|
||||||
@@ -465,5 +532,10 @@ namespace Elwig.Windows {
|
|||||||
private void FbNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
private void FbNrInput_LostFocus(object sender, RoutedEventArgs evt) {
|
||||||
InputLostFocus((TextBox)sender, Validator.CheckFbNr);
|
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)
|
if (d.ShowDialog() != true)
|
||||||
return;
|
return;
|
||||||
ViewModel.TransferPredecessorAreaComs = d.SuccessorSeason;
|
ViewModel.TransferPredecessorAreaComs = d.SuccessorSeason;
|
||||||
ViewModel.MaintainAreaComYearFrom = d.MaintainYearFrom;
|
|
||||||
if (IsEditing)
|
if (IsEditing)
|
||||||
SetOriginalValue(PredecessorMgNrInput, -1); // hack to allow user to save
|
SetOriginalValue(PredecessorMgNrInput, -1); // hack to allow user to save
|
||||||
UpdateButtons();
|
UpdateButtons();
|
||||||
|
|||||||
@@ -100,8 +100,8 @@ namespace Elwig.Windows {
|
|||||||
var allMembers = await ctx.Members.Where(m => m.DefaultKgNr == k.KgNr).CountAsync();
|
var allMembers = await ctx.Members.Where(m => m.DefaultKgNr == k.KgNr).CountAsync();
|
||||||
StatusDefaultKgs.Text += $"{activeMembers:N0} ({allMembers:N0})";
|
StatusDefaultKgs.Text += $"{activeMembers:N0} ({allMembers:N0})";
|
||||||
var year = Utils.CurrentNextSeason;
|
var year = Utils.CurrentNextSeason;
|
||||||
var activeAreaComs = await Utils.ActiveAreaCommitments(ctx.AreaCommitments.Where(c => c.KgNr == k.KgNr), year).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.KgNr == k.KgNr).CountAsync();
|
var allAreaComs = await ctx.AreaCommitments.Where(c => c.Contract.KgNr == k.KgNr).CountAsync();
|
||||||
StatusAreaCommitments.Text += $"{activeAreaComs:N0} ({allAreaComs:N0})";
|
StatusAreaCommitments.Text += $"{activeAreaComs:N0} ({allAreaComs:N0})";
|
||||||
var deliveryParts = await ctx.DeliveryParts.Where(p => p.KgNr == k.KgNr).CountAsync();
|
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();
|
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 credit;
|
||||||
DELETE FROM payment_variant;
|
DELETE FROM payment_variant;
|
||||||
DELETE FROM delivery;
|
DELETE FROM delivery;
|
||||||
DELETE FROM area_commitment;
|
DELETE FROM area_commitment_contract;
|
||||||
DELETE FROM area_commitment_type;
|
DELETE FROM area_commitment_type;
|
||||||
DELETE FROM season;
|
DELETE FROM season;
|
||||||
DELETE FROM wine_attribute;
|
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),
|
('GVQ', 'GV', 'Q', NULL, 5000, 1000, 1000000, NULL),
|
||||||
('GVR', 'GV', 'R', 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
|
INSERT INTO area_commitment_contract (fbnr, kgnr, rdnr) VALUES
|
||||||
( 1, 101, 'GV', 'KIP', 10000, 06109, '123/4', NULL, 2000, 2019),
|
( 1, 06109, NULL),
|
||||||
( 2, 101, 'GV', 'KIP', 10000, 06109, '123/5', NULL, 2025, 2030),
|
( 2, 06109, NULL),
|
||||||
( 3, 101, 'GV', 'KIP', 10000, 06109, '123/6', NULL, 2021, 2031);
|
( 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
|
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),
|
(2020, 'EUR', 1000, 2000, NULL, NULL, NULL, NULL, NULL),
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ DELETE FROM credit;
|
|||||||
DELETE FROM payment_variant;
|
DELETE FROM payment_variant;
|
||||||
DELETE FROM delivery;
|
DELETE FROM delivery;
|
||||||
DELETE FROM season;
|
DELETE FROM season;
|
||||||
DELETE FROM area_commitment;
|
DELETE FROM area_commitment_contract;
|
||||||
DELETE FROM area_commitment_type;
|
DELETE FROM area_commitment_type;
|
||||||
DELETE FROM member WHERE mgnr >= 200;
|
DELETE FROM member WHERE mgnr >= 200;
|
||||||
DELETE FROM wine_cultivation;
|
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
|
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);
|
('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
|
INSERT INTO area_commitment_contract (fbnr, kgnr, rdnr) VALUES
|
||||||
( 1, 203, 'GV', NULL, 10000, 15224, '321/9', NULL, NULL, NULL),
|
( 1, 15224, NULL),
|
||||||
( 2, 204, 'GV', NULL, 10000, 15224, '123/1', NULL, 2000, 2019),
|
( 2, 15224, NULL),
|
||||||
( 3, 204, 'GV', NULL, 10000, 15224, '123/2', NULL, 2025, 2030),
|
( 3, 15224, NULL),
|
||||||
( 4, 204, 'GV', NULL, 10000, 15224, '123/3', NULL, 2021, 2031);
|
( 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
|
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