Compare commits
	
		
			12 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f9ee2cb120 | |||
| b27b89f599 | |||
| bfbd0a6a22 | |||
| e2de7a1f1c | |||
| 3f769eb7d7 | |||
| 8bc053053c | |||
| a0dcaf7b4f | |||
| 844fc5217a | |||
| 542afa5892 | |||
| 9e02b15ff1 | |||
| 463769b549 | |||
| 2c383d0c55 | 
							
								
								
									
										46
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -2,6 +2,52 @@ | |||||||
| Changelog | Changelog | ||||||
| ========= | ========= | ||||||
|  |  | ||||||
|  | [v1.0.1.1][v1.0.1.1] (2025-09-21) {#v1.0.1.1} | ||||||
|  | --------------------------------------------- | ||||||
|  |  | ||||||
|  | ### Sonstiges {#v1.0.1.1-misc} | ||||||
|  |  | ||||||
|  | * Eingabe von Sorten und Qualitätsstufen im Übernahme-Fenster (`DeliveryAdminWindows`) verbessert. (e2de7a1f1c, b27b89f599) | ||||||
|  |  | ||||||
|  | [v1.0.1.1]: https://git.necronda.net/winzer/elwig/releases/tag/v1.0.1.1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | [v1.0.1.0][v1.0.1.0] (2025-09-18) {#v1.0.1.0} | ||||||
|  | --------------------------------------------- | ||||||
|  |  | ||||||
|  | ### Neue Funktionen {#v1.0.1.0-features} | ||||||
|  |  | ||||||
|  | * Neue Weinsorten gemäß Kürzelliste der Bundeskellereiinspektion hinzugefügt. (a0dcaf7b4f) | ||||||
|  |  | ||||||
|  | ### Sonstiges {#v1.0.1.0-misc} | ||||||
|  |  | ||||||
|  | * HTTP-Anfragen haben jetzt das Feld `User-Agent` gesetzt. (844fc5217a) | ||||||
|  | * Auto-Update-Funktion wird auch beim Erlangen von Netzwerkverbindung ausgeführt. (8bc053053c) | ||||||
|  |  | ||||||
|  | [v1.0.1.0]: https://git.necronda.net/winzer/elwig/releases/tag/v1.0.1.0 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | [v1.0.0.6][v1.0.0.6] (2025-09-17) {#v1.0.0.6} | ||||||
|  | --------------------------------------------- | ||||||
|  |  | ||||||
|  | ### Behobene Fehler {#v1.0.0.6-bugfixes} | ||||||
|  |  | ||||||
|  | * Die automatische Erkennung des Wiege-Modus hat im WKW nicht funktioniert. (463769b549) | ||||||
|  |  | ||||||
|  | ### Sonstiges {#v1.0.0.6-misc} | ||||||
|  |  | ||||||
|  | * Tippfehler im Über-Fenster (`AboutWindow`) behoben. (2c383d0c55) | ||||||
|  | * `SaveFileDialog` mit Multi-File-Extensions verbessert. (9e02b15ff1) | ||||||
|  |  | ||||||
|  | [v1.0.0.6]: https://git.necronda.net/winzer/elwig/releases/tag/v1.0.0.6 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| [v1.0.0.5][v1.0.0.5] (2025-09-15) {#v1.0.0.5} | [v1.0.0.5][v1.0.0.5] (2025-09-15) {#v1.0.0.5} | ||||||
| --------------------------------------------- | --------------------------------------------- | ||||||
|  |  | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ | |||||||
|         </DataTemplate> |         </DataTemplate> | ||||||
|         <DataTemplate x:Key="WineVarietyTemplateExpanded"> |         <DataTemplate x:Key="WineVarietyTemplateExpanded"> | ||||||
|             <StackPanel Orientation="Horizontal"> |             <StackPanel Orientation="Horizontal"> | ||||||
|                 <TextBlock Text="{Binding SortId}" Foreground="{Binding Color}" MinWidth="36" Margin="0,0,10,0"/> |                 <TextBlock Text="{Binding SortIdFormat}" Foreground="{Binding Color}" MinWidth="36" Margin="0,0,10,0"/> | ||||||
|                 <TextBlock Text="{Binding Name}" Foreground="{Binding Color}"/> |                 <TextBlock Text="{Binding Name}" Foreground="{Binding Color}"/> | ||||||
|                 <TextBlock Text="{Binding CommentFormat}" FontSize="10" VerticalAlignment="Bottom" Margin="0,0,0,2"/> |                 <TextBlock Text="{Binding CommentFormat}" FontSize="10" VerticalAlignment="Bottom" Margin="0,0,0,2"/> | ||||||
|             </StackPanel> |             </StackPanel> | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ using System.Collections.Generic; | |||||||
| using System.Data; | using System.Data; | ||||||
| using System.IO; | using System.IO; | ||||||
| using System.Linq; | using System.Linq; | ||||||
|  | using System.Net.NetworkInformation; | ||||||
| using System.Reflection; | using System.Reflection; | ||||||
| using System.Text; | using System.Text; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| @@ -115,16 +116,6 @@ namespace Elwig { | |||||||
|                 BranchNum = branches.Count; |                 BranchNum = branches.Count; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (Config.WeighingMode == null) { |  | ||||||
|                 if (App.Client.IsMatzen || App.Client.IsWolkersdorf) { |  | ||||||
|                     Config.WeighingMode = WeighingMode.Net; |  | ||||||
|                 } else if (App.Client.IsHaugsdorf || App.Client.IsSitzendorf) { |  | ||||||
|                     Config.WeighingMode = WeighingMode.Box; |  | ||||||
|                 } else if (App.Client.IsBaden || App.Client.IsGrInzersdorf) { |  | ||||||
|                     Config.WeighingMode = WeighingMode.Gross; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             Utils.RunBackground("Temp File Cleanup", () => { |             Utils.RunBackground("Temp File Cleanup", () => { | ||||||
|                 Utils.CleanupTempFiles(); |                 Utils.CleanupTempFiles(); | ||||||
|                 return Task.CompletedTask; |                 return Task.CompletedTask; | ||||||
| @@ -141,6 +132,7 @@ namespace Elwig { | |||||||
|                         await CheckForUpdates(); |                         await CheckForUpdates(); | ||||||
|                     }); |                     }); | ||||||
|                 } |                 } | ||||||
|  |                 NetworkChange.NetworkAvailabilityChanged += OnNetworkAvailabilityChanged; | ||||||
|                 _autoUpdateTimer.Tick += new EventHandler(OnAutoUpdateTimer); |                 _autoUpdateTimer.Tick += new EventHandler(OnAutoUpdateTimer); | ||||||
|                 _autoUpdateTimer.Start(); |                 _autoUpdateTimer.Start(); | ||||||
|             } |             } | ||||||
| @@ -172,6 +164,16 @@ namespace Elwig { | |||||||
|                 Shutdown(); |                 Shutdown(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             if (Config.WeighingMode == null) { | ||||||
|  |                 if (Client.IsMatzen || Client.IsWolkersdorf) { | ||||||
|  |                     Config.WeighingMode = WeighingMode.Net; | ||||||
|  |                 } else if (Client.IsHaugsdorf || Client.IsSitzendorf) { | ||||||
|  |                     Config.WeighingMode = WeighingMode.Box; | ||||||
|  |                 } else if (Client.IsBaden || Client.IsGrInzersdorf) { | ||||||
|  |                     Config.WeighingMode = WeighingMode.Gross; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|             base.OnStartup(evt); |             base.OnStartup(evt); | ||||||
|  |  | ||||||
|             var window = new MainWindow(); |             var window = new MainWindow(); | ||||||
| @@ -228,6 +230,16 @@ namespace Elwig { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         private void OnNetworkAvailabilityChanged(object? sender, NetworkAvailabilityEventArgs evt) { | ||||||
|  |             if (!evt.IsAvailable) return; | ||||||
|  |             if (Utils.HasInternetConnectivity()) { | ||||||
|  |                 Utils.RunBackground("Auto Updater", async () => { | ||||||
|  |                     await Task.Delay(500); | ||||||
|  |                     await CheckForUpdates(); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         public static async Task CheckForUpdates(bool showAlert = false) { |         public static async Task CheckForUpdates(bool showAlert = false) { | ||||||
|             if (Config.UpdateUrl == null) return; |             if (Config.UpdateUrl == null) return; | ||||||
|             var latest = await Utils.GetLatestInstallerUrl(Config.UpdateUrl); |             var latest = await Utils.GetLatestInstallerUrl(Config.UpdateUrl); | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <UseWPF>true</UseWPF> |     <UseWPF>true</UseWPF> | ||||||
|     <PreserveCompilationContext>true</PreserveCompilationContext> |     <PreserveCompilationContext>true</PreserveCompilationContext> | ||||||
|     <ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon> |     <ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon> | ||||||
|     <Version>1.0.0.5</Version> |     <Version>1.0.1.1</Version> | ||||||
|     <SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages> |     <SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages> | ||||||
|     <AllowUnsafeBlocks>true</AllowUnsafeBlocks> |     <AllowUnsafeBlocks>true</AllowUnsafeBlocks> | ||||||
|     <ApplicationManifest>app.manifest</ApplicationManifest> |     <ApplicationManifest>app.manifest</ApplicationManifest> | ||||||
|   | |||||||
| @@ -248,13 +248,6 @@ namespace Elwig.Helpers { | |||||||
|             return c + 1; |             return c + 1; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async Task<WineQualLevel> GetWineQualityLevel(double kmw) { |  | ||||||
|             return await WineQualityLevels |  | ||||||
|                 .Where(q => !q.IsPredicate && (q.MinKmw == null || q.MinKmw <= kmw)) |  | ||||||
|                 .OrderBy(q => q.MinKmw) |  | ||||||
|                 .LastAsync(); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         public void UpdateDeliveryPartModifiers(DeliveryPart part, IEnumerable<Modifier> oldModifiers, IEnumerable<Modifier> newModifiers) { |         public void UpdateDeliveryPartModifiers(DeliveryPart part, IEnumerable<Modifier> oldModifiers, IEnumerable<Modifier> newModifiers) { | ||||||
|             foreach (var m in Modifiers.Where(m => m.Year == part.Year)) { |             foreach (var m in Modifiers.Where(m => m.Year == part.Year)) { | ||||||
|                 var mod = new DeliveryPartModifier { |                 var mod = new DeliveryPartModifier { | ||||||
|   | |||||||
| @@ -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 = 32; |         public static readonly int RequiredSchemaVersion = 33; | ||||||
|  |  | ||||||
|         private static int VersionOffset = 0; |         private static int VersionOffset = 0; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,7 +23,6 @@ using System.Reflection; | |||||||
| using System.Collections; | using System.Collections; | ||||||
| using Elwig.Documents; | using Elwig.Documents; | ||||||
| using MimeKit; | using MimeKit; | ||||||
| using System.Windows.Input; |  | ||||||
| using LinqKit; | using LinqKit; | ||||||
| using System.Linq.Expressions; | using System.Linq.Expressions; | ||||||
| using Elwig.Models; | using Elwig.Models; | ||||||
| @@ -430,6 +429,8 @@ namespace Elwig.Helpers { | |||||||
|             var client = new HttpClient() { |             var client = new HttpClient() { | ||||||
|                 Timeout = TimeSpan.FromSeconds(5), |                 Timeout = TimeSpan.FromSeconds(5), | ||||||
|             }; |             }; | ||||||
|  |             client.DefaultRequestHeaders.UserAgent.Clear(); | ||||||
|  |             client.DefaultRequestHeaders.UserAgent.ParseAdd($"Elwig/{App.Version} ({App.Client.NameToken}, {App.BranchName}, {Environment.MachineName}, {Environment.OSVersion})"); | ||||||
|             client.DefaultRequestHeaders.Accept.Clear(); |             client.DefaultRequestHeaders.Accept.Clear(); | ||||||
|             if (accept != null) |             if (accept != null) | ||||||
|                 client.DefaultRequestHeaders.Accept.Add(new(accept)); |                 client.DefaultRequestHeaders.Accept.Add(new(accept)); | ||||||
|   | |||||||
| @@ -11,16 +11,24 @@ namespace Elwig.Models.Entities { | |||||||
|         [Column("type")] |         [Column("type")] | ||||||
|         public string Type { get; private set; } = null!; |         public string Type { get; private set; } = null!; | ||||||
|  |  | ||||||
|  |         [Column("max_qualid")] | ||||||
|  |         public string MaxQualId { get; private set; } = null!; | ||||||
|  |  | ||||||
|  |         [ForeignKey("MaxQualId")] | ||||||
|  |         public virtual WineQualLevel MaxQualityLevel { get; private set; } = null!; | ||||||
|  |  | ||||||
|         [Column("name")] |         [Column("name")] | ||||||
|         public string Name { get; private set; } = null!; |         public string Name { get; private set; } = null!; | ||||||
|  |  | ||||||
|         [Column("comment")] |         [Column("comment")] | ||||||
|         public string? Comment { get; private set; } |         public string? Comment { get; private set; } | ||||||
|  |  | ||||||
|  |         public string SortIdFormat => IsQuw ? SortId : $"({SortId})"; | ||||||
|         public string CommentFormat => (Comment != null) ? $" ({Comment})" : ""; |         public string CommentFormat => (Comment != null) ? $" ({Comment})" : ""; | ||||||
|  |  | ||||||
|         public bool IsRed => Type == "R"; |         public bool IsRed => Type == "R"; | ||||||
|         public bool IsWhite => Type == "W"; |         public bool IsWhite => Type == "W"; | ||||||
|  |         public bool IsQuw => MaxQualId == "QUW"; | ||||||
|         public Brush? Color => IsWhite ? Brushes.DarkGreen : IsRed ? Brushes.DarkRed : null; |         public Brush? Color => IsWhite ? Brushes.DarkGreen : IsRed ? Brushes.DarkRed : null; | ||||||
|  |  | ||||||
|         public WineVar() { } |         public WineVar() { } | ||||||
| @@ -28,6 +36,7 @@ namespace Elwig.Models.Entities { | |||||||
|         public WineVar(string sortId, string name) { |         public WineVar(string sortId, string name) { | ||||||
|             SortId = sortId; |             SortId = sortId; | ||||||
|             Name = name; |             Name = name; | ||||||
|  |             MaxQualId = "QUW"; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public override string ToString() { |         public override string ToString() { | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								Elwig/Resources/Sql/32-33.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Elwig/Resources/Sql/32-33.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | -- schema version 32 to 33 | ||||||
|  |  | ||||||
|  | ALTER TABLE wine_variety ADD COLUMN max_qualid TEXT NOT NULL DEFAULT 'QUW'; | ||||||
|  | UPDATE wine_quality_level SET qualid = 'ALW' WHERE qualid = 'AUL'; | ||||||
|  | UPDATE wine_variety SET comment = 'Muscato' WHERE sortid = 'MO'; | ||||||
|  |  | ||||||
|  | INSERT INTO wine_variety (sortid, type, max_qualid, name, comment) VALUES | ||||||
|  | ('DR', 'W', 'QUW', 'Donauriesling', NULL), | ||||||
|  | ('DV', 'W', 'QUW', 'Donauveltliner', NULL), | ||||||
|  | ('BN', 'W', 'RSW', 'Bronner', NULL), | ||||||
|  | ('CB', 'W', 'RSW', 'Cabernet Blanc', NULL), | ||||||
|  | ('CJ', 'R', 'RSW', 'Cabernet Jura', NULL), | ||||||
|  | ('JO', 'W', 'RSW', 'Johanniter', NULL), | ||||||
|  | ('OR', 'W', 'RSW', 'Orangetraube', NULL), | ||||||
|  | ('PI', 'R', 'RSW', 'Pinot Nova', NULL), | ||||||
|  | ('RE', 'R', 'RSW', 'Regent', NULL), | ||||||
|  | ('SI', 'W', 'RSW', 'Solaris', NULL); | ||||||
| @@ -721,9 +721,11 @@ namespace Elwig.Services { | |||||||
|                     FileName = subject == ExportSubject.Selected ? $"Lieferung_{vm.SelectedDelivery?.LsNr}.elwig.zip" : $"Lieferungen_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip", |                     FileName = subject == ExportSubject.Selected ? $"Lieferung_{vm.SelectedDelivery?.LsNr}.elwig.zip" : $"Lieferungen_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip", | ||||||
|                     DefaultExt = "elwig.zip", |                     DefaultExt = "elwig.zip", | ||||||
|                     Filter = "Elwig-Export-Datei (*.elwig.zip)|*.elwig.zip", |                     Filter = "Elwig-Export-Datei (*.elwig.zip)|*.elwig.zip", | ||||||
|                     Title = $"{DeliveryJournal.Name} speichern unter - Elwig" |                     Title = $"{DeliveryJournal.Name} speichern unter - Elwig", | ||||||
|  |                     AddExtension = false, | ||||||
|                 }; |                 }; | ||||||
|                 if (d.ShowDialog() == true) { |                 if (d.ShowDialog() == true) { | ||||||
|  |                     if (!d.FileName.EndsWith(".elwig.zip")) d.FileName += ".elwig.zip"; | ||||||
|                     Mouse.OverrideCursor = Cursors.Wait; |                     Mouse.OverrideCursor = Cursors.Wait; | ||||||
|                     await Task.Run(async () => { |                     await Task.Run(async () => { | ||||||
|                         try { |                         try { | ||||||
|   | |||||||
| @@ -496,11 +496,13 @@ namespace Elwig.Services { | |||||||
|             } else if (mode == ExportMode.Export) { |             } else if (mode == ExportMode.Export) { | ||||||
|                 var d = new SaveFileDialog() { |                 var d = new SaveFileDialog() { | ||||||
|                     FileName = subject == ExportSubject.Selected ? $"Mitglied_{vm.SelectedMember?.MgNr}.elwig.zip" : $"Mitglieder_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip", |                     FileName = subject == ExportSubject.Selected ? $"Mitglied_{vm.SelectedMember?.MgNr}.elwig.zip" : $"Mitglieder_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip", | ||||||
|                     DefaultExt = ".elwig.zip", |                     DefaultExt = "elwig.zip", | ||||||
|                     Filter = "Elwig-Export-Datei (*.elwig.zip)|*.elwig.zip", |                     Filter = "Elwig-Export-Datei (*.elwig.zip)|*.elwig.zip", | ||||||
|                     Title = $"{MemberList.Name} speichern unter - Elwig" |                     Title = $"{MemberList.Name} speichern unter - Elwig", | ||||||
|  |                     AddExtension = false, | ||||||
|                 }; |                 }; | ||||||
|                 if (d.ShowDialog() == true) { |                 if (d.ShowDialog() == true) { | ||||||
|  |                     if (!d.FileName.EndsWith(".elwig.zip")) d.FileName += ".elwig.zip"; | ||||||
|                     Mouse.OverrideCursor = Cursors.Wait; |                     Mouse.OverrideCursor = Cursors.Wait; | ||||||
|                     await Task.Run(async () => { |                     await Task.Run(async () => { | ||||||
|                         try { |                         try { | ||||||
|   | |||||||
| @@ -4,12 +4,12 @@ | |||||||
|         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | ||||||
|         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | ||||||
|         xmlns:local="clr-namespace:Elwig.Windows" |         xmlns:local="clr-namespace:Elwig.Windows" | ||||||
|         Title="Über - Elwig" Height="340" Width="480" ResizeMode="NoResize"> |         Title="Über - Elwig" Height="340" Width="460" ResizeMode="NoResize"> | ||||||
|     <Grid> |     <Grid> | ||||||
|         <TextBlock Margin="20,10" FontSize="12"> |         <TextBlock Margin="20,10" FontSize="12"> | ||||||
|             <Bold>Produkt:</Bold> Elwig<LineBreak/> |             <Bold>Produkt:</Bold> Elwig<LineBreak/> | ||||||
|             <Bold>Beschreibung:</Bold> Elektronische Winzergenossenschaftsveraltung<LineBreak/> |             <Bold>Beschreibung:</Bold> Elektronische Winzergenossenschaftsverwaltung<LineBreak/> | ||||||
|             <Bold>Typ:</Bold> Warenwirschaftssystem<LineBreak/> |             <Bold>Typ:</Bold> Warenwirtschaftssystem (ERP-System)<LineBreak/> | ||||||
|             <Bold>Version:</Bold> <Run x:Name="Version">0.0.0.0</Run> (<Hyperlink NavigateUri="https://elwig.at/changelog" RequestNavigate="Hyperlink_RequestNavigate">Änderungsprotokoll</Hyperlink>)<LineBreak/> |             <Bold>Version:</Bold> <Run x:Name="Version">0.0.0.0</Run> (<Hyperlink NavigateUri="https://elwig.at/changelog" RequestNavigate="Hyperlink_RequestNavigate">Änderungsprotokoll</Hyperlink>)<LineBreak/> | ||||||
|             <Bold>Lizenz:</Bold> <Hyperlink NavigateUri="https://www.gnu.org/licenses/gpl-3.0.html" RequestNavigate="Hyperlink_RequestNavigate">GNU General Public License 3.0 (GPLv3)</Hyperlink><LineBreak/> |             <Bold>Lizenz:</Bold> <Hyperlink NavigateUri="https://www.gnu.org/licenses/gpl-3.0.html" RequestNavigate="Hyperlink_RequestNavigate">GNU General Public License 3.0 (GPLv3)</Hyperlink><LineBreak/> | ||||||
|             <Bold>Website:</Bold> <Hyperlink NavigateUri="https://elwig.at/" RequestNavigate="Hyperlink_RequestNavigate">https://elwig.at/</Hyperlink><LineBreak/> |             <Bold>Website:</Bold> <Hyperlink NavigateUri="https://elwig.at/" RequestNavigate="Hyperlink_RequestNavigate">https://elwig.at/</Hyperlink><LineBreak/> | ||||||
| @@ -26,7 +26,7 @@ | |||||||
|             Paketierung: <Hyperlink NavigateUri="https://www.firegiant.com/wixtoolset/" RequestNavigate="Hyperlink_RequestNavigate">WiX Toolset</Hyperlink> |             Paketierung: <Hyperlink NavigateUri="https://www.firegiant.com/wixtoolset/" RequestNavigate="Hyperlink_RequestNavigate">WiX Toolset</Hyperlink> | ||||||
|         </TextBlock> |         </TextBlock> | ||||||
|  |  | ||||||
|         <Image Source="\Resources\Images\Elwig.png" RenderOptions.BitmapScalingMode="HighQuality" Height="96" |         <Image Source="\Resources\Images\Elwig.png" RenderOptions.BitmapScalingMode="HighQuality" Height="64" | ||||||
|                HorizontalAlignment="Right" Margin="10" VerticalAlignment="Top"/> |                HorizontalAlignment="Right" Margin="10" VerticalAlignment="Top"/> | ||||||
|     </Grid> |     </Grid> | ||||||
| </Window> | </Window> | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ using Elwig.ViewModels; | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.Win32; | using Microsoft.Win32; | ||||||
| using System; | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using System.Windows; | using System.Windows; | ||||||
| @@ -34,6 +35,8 @@ namespace Elwig.Windows { | |||||||
|  |  | ||||||
|         private readonly Button[] WeighingButtons; |         private readonly Button[] WeighingButtons; | ||||||
|  |  | ||||||
|  |         private List<WineQualLevel> WineQualityLevels = []; | ||||||
|  |  | ||||||
|         public DeliveryAdminWindow(bool receipt = false) { |         public DeliveryAdminWindow(bool receipt = false) { | ||||||
|             InitializeComponent(); |             InitializeComponent(); | ||||||
|             CommandBindings.Add(new CommandBinding(CtrlF, FocusSearchInput)); |             CommandBindings.Add(new CommandBinding(CtrlF, FocusSearchInput)); | ||||||
| @@ -483,7 +486,8 @@ namespace Elwig.Windows { | |||||||
|             var cultList = await ctx.WineCultivations.OrderBy(a => a.Name).Cast<object>().ToListAsync(); |             var cultList = await ctx.WineCultivations.OrderBy(a => a.Name).Cast<object>().ToListAsync(); | ||||||
|             cultList.Insert(0, new NullItem("")); |             cultList.Insert(0, new NullItem("")); | ||||||
|             ControlUtils.RenewItemsSource(CultivationInput, cultList, null, ControlUtils.RenewSourceDefault.First); |             ControlUtils.RenewItemsSource(CultivationInput, cultList, null, ControlUtils.RenewSourceDefault.First); | ||||||
|             ControlUtils.RenewItemsSource(WineQualityLevelInput, await ctx.WineQualityLevels.ToListAsync()); |             WineQualityLevels = await ctx.WineQualityLevels.ToListAsync(); | ||||||
|  |             ControlUtils.RenewItemsSource(WineQualityLevelInput, WineQualityLevels); | ||||||
|             ControlUtils.RenewItemsSource(ModifiersInput, await ctx.Modifiers |             ControlUtils.RenewItemsSource(ModifiersInput, await ctx.Modifiers | ||||||
|                 .Where(m => m.Year == y && (!IsCreating || m.IsActive)) |                 .Where(m => m.Year == y && (!IsCreating || m.IsActive)) | ||||||
|                 .OrderBy(m => m.Ordering) |                 .OrderBy(m => m.Ordering) | ||||||
| @@ -1207,6 +1211,7 @@ namespace Elwig.Windows { | |||||||
|                 AttributeInput.SelectedIndex = 0; |                 AttributeInput.SelectedIndex = 0; | ||||||
|                 CultivationInput.SelectedIndex = 0; |                 CultivationInput.SelectedIndex = 0; | ||||||
|             } |             } | ||||||
|  |             UpdateWineQualityLevels(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private void SortIdInput_TextChanged(object sender, TextChangedEventArgs evt) { |         private void SortIdInput_TextChanged(object sender, TextChangedEventArgs evt) { | ||||||
| @@ -1220,19 +1225,39 @@ namespace Elwig.Windows { | |||||||
|         private void WineVarietyInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) { |         private void WineVarietyInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) { | ||||||
|             if (WineVarietyInput.SelectedItem is WineVar s) |             if (WineVarietyInput.SelectedItem is WineVar s) | ||||||
|                 ViewModel.SortId = s.SortId; |                 ViewModel.SortId = s.SortId; | ||||||
|  |             UpdateWineQualityLevels(); | ||||||
|  |             if (!ViewModel.WineVar?.IsQuw ?? false) { | ||||||
|  |                 App.MainDispatcher.BeginInvoke(() => { | ||||||
|  |                     MessageBox.Show("Die eingegebene Sorte darf nicht als Qualitätswein\nübernommen werden!", "Kein Qualitätswein", | ||||||
|  |                         MessageBoxButton.OK, MessageBoxImage.Warning); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private WineQualLevel GetWineQualityLevel(double kmw, string? maxQualId = null) { | ||||||
|  |             return WineQualityLevels | ||||||
|  |                 .Where(q => !q.IsPredicate && (q.MinKmw == null || q.MinKmw <= kmw)) | ||||||
|  |                 .Where(q => maxQualId == null || q.QualId == "WEI" || q.QualId == maxQualId) | ||||||
|  |                 .OrderBy(q => q.MinKmw) | ||||||
|  |                 .Last(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private void UpdateWineQualityLevels() { |         private void UpdateWineQualityLevels() { | ||||||
|             using var ctx = new AppDbContext(); |  | ||||||
|             if (!GetInputValid(GradationKmwInput)) { |             if (!GetInputValid(GradationKmwInput)) { | ||||||
|                 UnsetDefaultValue(WineQualityLevelInput); |                 UnsetDefaultValue(WineQualityLevelInput); | ||||||
|                 ComboBox_SelectionChanged(WineQualityLevelInput, null); |                 ComboBox_SelectionChanged(WineQualityLevelInput, null); | ||||||
|                 WineQualityLevelInput.ItemsSource = ctx.WineQualityLevels.Where(q => q.QualId == "WEI").ToList(); |                 WineQualityLevelInput.ItemsSource = WineQualityLevels; | ||||||
|  |                 WineQualityLevelInput.SelectedItem = null; | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             var kmw = (double)ViewModel.GradationKmw!; |             var kmw = (double)ViewModel.GradationKmw!; | ||||||
|             WineQualityLevelInput.ItemsSource = ctx.WineQualityLevels.Where(q => q.MinKmw == null || q.MinKmw <= kmw).ToList(); |             var max = ViewModel.WineVar?.MaxQualId; | ||||||
|             var qual = ctx.GetWineQualityLevel(kmw).GetAwaiter().GetResult(); |             var quw = ViewModel.WineVar?.IsQuw ?? true; | ||||||
|  |             WineQualityLevelInput.ItemsSource = WineQualityLevels | ||||||
|  |                 .Where(q => q.MinKmw == null || q.MinKmw <= kmw) | ||||||
|  |                 .Where(q => quw || q.QualId == "WEI" || q.QualId == max) | ||||||
|  |                 .ToList(); | ||||||
|  |             var qual = GetWineQualityLevel(kmw, !quw ? max : null); | ||||||
|             SetDefaultValue(WineQualityLevelInput, qual); |             SetDefaultValue(WineQualityLevelInput, qual); | ||||||
|             if (WineQualityLevelInput.SelectedItem == null || (WineQualityLevelInput.SelectedItem is WineQualLevel selected && !selected.IsPredicate)) { |             if (WineQualityLevelInput.SelectedItem == null || (WineQualityLevelInput.SelectedItem is WineQualLevel selected && !selected.IsPredicate)) { | ||||||
|                 ControlUtils.SelectItem(WineQualityLevelInput, qual); |                 ControlUtils.SelectItem(WineQualityLevelInput, qual); | ||||||
| @@ -1372,8 +1397,7 @@ namespace Elwig.Windows { | |||||||
|                 AbgewertetInput.IsChecked = false; |                 AbgewertetInput.IsChecked = false; | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             using var ctx = new AppDbContext(); |             var defQual = GetWineQualityLevel(ViewModel.GradationKmw!.Value, !(ViewModel.WineVar?.IsQuw ?? true) ? ViewModel.WineVar?.MaxQualId : null); | ||||||
|             var defQual = ctx.GetWineQualityLevel(double.Parse(GradationKmwInput.Text)).GetAwaiter().GetResult(); |  | ||||||
|             AbgewertetInput.IsChecked = !qual.IsPredicate && defQual != qual; |             AbgewertetInput.IsChecked = !qual.IsPredicate && defQual != qual; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -158,8 +158,10 @@ namespace Elwig.Windows { | |||||||
|                     FileName = $"database_{Utils.Today:yyyy-MM-dd}.sql.zip", |                     FileName = $"database_{Utils.Today:yyyy-MM-dd}.sql.zip", | ||||||
|                     DefaultExt = "sql.zip", |                     DefaultExt = "sql.zip", | ||||||
|                     Filter = "Komprimierte SQL-Datei (*.sql.zip)|*.sql.zip", |                     Filter = "Komprimierte SQL-Datei (*.sql.zip)|*.sql.zip", | ||||||
|  |                     AddExtension = false, | ||||||
|                 }; |                 }; | ||||||
|                 if (d.ShowDialog() == true) { |                 if (d.ShowDialog() == true) { | ||||||
|  |                     if (!d.FileName.EndsWith(".sql.zip")) d.FileName += ".sql.zip"; | ||||||
|                     Mouse.OverrideCursor = Cursors.Wait; |                     Mouse.OverrideCursor = Cursors.Wait; | ||||||
|                     await Task.Run(async () => { |                     await Task.Run(async () => { | ||||||
|                         await Database.ExportSql(d.FileName, true); |                         await Database.ExportSql(d.FileName, true); | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								README.md
									
									
									
									
									
								
							| @@ -5,3 +5,43 @@ Elwig | |||||||
| **El**ektronische **Wi**nzer**g**enossenschaftsverwaltung (Electronic Management for Vintners' Cooperatives). | **El**ektronische **Wi**nzer**g**enossenschaftsverwaltung (Electronic Management for Vintners' Cooperatives). | ||||||
|  |  | ||||||
| Further information may be found on [the website](https://elwig.at). | Further information may be found on [the website](https://elwig.at). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | About | ||||||
|  | ===== | ||||||
|  |  | ||||||
|  | **Product:** Elwig   | ||||||
|  | **Description:** Electronic Management for Vintners' Cooperatives   | ||||||
|  | **Type:** ERP system   | ||||||
|  | **Version:** 1.0.1.1 ([Changelog](./CHANGELOG.md))   | ||||||
|  | **License:** [GNU General Public License 3.0 (GPLv3)](./LICENSE)   | ||||||
|  | **Website:** https://elwig.at/   | ||||||
|  | **Source code:** https://git.necronda.net/winzer/elwig   | ||||||
|  | **Developement period:** 2022–2025 | ||||||
|  |  | ||||||
|  | **Technology Stack:**   | ||||||
|  | Language: C#   | ||||||
|  | Framework: Windows Presentation Framework (WPF)   | ||||||
|  | Database: [SQLite](https://sqlite.org/)   | ||||||
|  | PDF creation: [WeasyPrint](https://weasyprint.org/), [RazorLight](https://github.com/toddams/RazorLight), [PdfiumViewer](https://github.com/pvginkel/PdfiumViewer)   | ||||||
|  | Packaging: [WiX Toolset](https://www.firegiant.com/wixtoolset/) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Über | ||||||
|  | ==== | ||||||
|  |  | ||||||
|  | **Produkt:** Elwig   | ||||||
|  | **Beschreibung:** Elektronische Winzergenossenschaftsverwaltung   | ||||||
|  | **Typ:** Warenwirtschaftssystem (ERP-System)   | ||||||
|  | **Version:** 1.0.1.1 ([Änderungsprotokoll](./CHANGELOG.md))   | ||||||
|  | **Lizenz:** [GNU General Public License 3.0 (GPLv3)](./LICENSE)   | ||||||
|  | **Website:** https://elwig.at/   | ||||||
|  | **Quellcode:** https://git.necronda.net/winzer/elwig   | ||||||
|  | **Entwicklungszeitraum:** 2022–2025 | ||||||
|  |  | ||||||
|  | **Verwendete Technologien:**   | ||||||
|  | Programmiersprache: C#   | ||||||
|  | Framework: Windows Presentation Framework (WPF)   | ||||||
|  | Datenbank: [SQLite](https://sqlite.org/)   | ||||||
|  | PDF-Erstellung: [WeasyPrint](https://weasyprint.org/), [RazorLight](https://github.com/toddams/RazorLight), [PdfiumViewer](https://github.com/pvginkel/PdfiumViewer)   | ||||||
|  | Paketierung: [WiX Toolset](https://www.firegiant.com/wixtoolset/) | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| curl --fail -s -L "https://elwig.at/files/create.sql?v=32" -u "elwig:ganzGeheim123!" -o "Resources\Sql\Create.sql" | curl --fail -s -L "https://elwig.at/files/create.sql?v=33" -u "elwig:ganzGeheim123!" -o "Resources\Sql\Create.sql" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user