Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
b6400c41c4 | |||
24b7078a05 | |||
dc215d3350 | |||
b80cbc037c | |||
4891501f62 | |||
6d3adc48f6 | |||
f5eea1e906 | |||
ba691f4d17 | |||
470f092482 |
@ -11,6 +11,7 @@ using System.Windows.Threading;
|
||||
using System.Globalization;
|
||||
using System.Threading;
|
||||
using System.Windows.Markup;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Elwig {
|
||||
public partial class App : Application {
|
||||
@ -20,10 +21,23 @@ namespace Elwig {
|
||||
public static readonly string TempPath = Path.Combine(Path.GetTempPath(), "Elwig");
|
||||
public static readonly Config Config = new(DataPath + "config.ini");
|
||||
|
||||
public static int VersionMajor { get; private set; }
|
||||
public static int VersionMinor { get; private set; }
|
||||
public static int VersionPatch { get; private set; }
|
||||
public static string Version {
|
||||
get => $"{VersionMajor}.{VersionMinor}.{VersionPatch}";
|
||||
private set {
|
||||
var p = value.Split(".").Select(p => int.Parse(p.Trim())).ToArray();
|
||||
VersionMajor = p.ElementAtOrDefault(0);
|
||||
VersionMinor = p.ElementAtOrDefault(1);
|
||||
VersionPatch = p.ElementAtOrDefault(2);
|
||||
}
|
||||
}
|
||||
|
||||
public static string ZwstId { get; private set; }
|
||||
public static string BranchName { get; private set; }
|
||||
public static int? BranchPlz { get; private set; }
|
||||
public static string? BranchOrt { get; private set; }
|
||||
public static string? BranchLocation { get; private set; }
|
||||
public static string? BranchAddress { get; private set; }
|
||||
public static string? BranchPhoneNr { get; private set; }
|
||||
public static string? BranchFaxNr { get; private set; }
|
||||
@ -36,7 +50,7 @@ namespace Elwig {
|
||||
|
||||
public App() : base() {
|
||||
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
|
||||
Directory.CreateDirectory(App.TempPath);
|
||||
Directory.CreateDirectory(TempPath);
|
||||
Directory.CreateDirectory(DataPath);
|
||||
MainDispatcher = Dispatcher;
|
||||
Scales = Array.Empty<IScale>();
|
||||
@ -56,29 +70,28 @@ namespace Elwig {
|
||||
new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag))
|
||||
);
|
||||
|
||||
Version = typeof(App).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? "";
|
||||
|
||||
try {
|
||||
AppDbUpdater.CheckDb();
|
||||
} catch (Exception e) {
|
||||
MessageBox.Show($"Invalid Database:\n\n{e.Message}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
Shutdown();
|
||||
return;
|
||||
}
|
||||
|
||||
Dictionary<string, (string, string, int?, string?, string?, string?, string?, string?)> branches = new();
|
||||
using (var ctx = new AppDbContext()) {
|
||||
branches = ctx.Branches.ToDictionary(b => b.Name.ToLower(), b => (b.ZwstId, b.Name, b.PostalDest?.AtPlz?.Plz, b.PostalDest?.AtPlz?.Dest, b.Address, b.PhoneNr, b.FaxNr, b.MobileNr));
|
||||
try {
|
||||
if (!ctx.Database.CanConnect()) {
|
||||
MessageBox.Show($"Invalid Database:\n\n{Config.DatabaseFile}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
Shutdown();
|
||||
return;
|
||||
} else {
|
||||
branches = ctx.Branches.ToDictionary(b => b.Name.ToLower(), b => (b.ZwstId, b.Name, b.PostalDest?.AtPlz?.Plz, b.PostalDest?.AtPlz?.Dest, b.Address, b.PhoneNr, b.FaxNr, b.MobileNr));
|
||||
try {
|
||||
Client = new(ctx);
|
||||
} catch (Exception e) {
|
||||
MessageBox.Show($"Fehler beim Laden der Mandantendaten:\n\n{e.Message}", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
Shutdown();
|
||||
return;
|
||||
}
|
||||
}
|
||||
Client = new(ctx);
|
||||
} catch (Exception e) {
|
||||
MessageBox.Show($"Invalid Database:\n\n{e.Message}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
MessageBox.Show($"Fehler beim Laden der Mandantendaten:\n\n{e.Message}", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
Shutdown();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Utils.RunBackground("HTML Initialization", () => Documents.Html.Init(PrintingReadyChanged));
|
||||
Utils.RunBackground("PDF Initialization", () => Documents.Pdf.Init(PrintingReadyChanged));
|
||||
|
||||
@ -114,7 +127,7 @@ namespace Elwig {
|
||||
ZwstId = entry.Item1;
|
||||
BranchName = entry.Item2;
|
||||
BranchPlz = entry.Item3;
|
||||
BranchOrt = entry.Item4;
|
||||
BranchLocation = entry.Item4;
|
||||
BranchAddress = entry.Item5;
|
||||
BranchPhoneNr = entry.Item6;
|
||||
BranchFaxNr = entry.Item7;
|
||||
@ -125,7 +138,7 @@ namespace Elwig {
|
||||
ZwstId = entry.Item1;
|
||||
BranchName = entry.Item2;
|
||||
BranchPlz = entry.Item3;
|
||||
BranchOrt = entry.Item4;
|
||||
BranchLocation = entry.Item4;
|
||||
BranchAddress = entry.Item5;
|
||||
BranchPhoneNr = entry.Item6;
|
||||
BranchFaxNr = entry.Item7;
|
||||
|
@ -14,5 +14,8 @@
|
||||
<address>@Model.Address</address>
|
||||
</div>
|
||||
<aside>@Raw(Model.Aside)</aside>
|
||||
@if (Model.ShowDateAndLocation) {
|
||||
<div class="date">@Model.Location, am @($"{Model.Date:dd.MM.yyyy}")</div>
|
||||
}
|
||||
</div>
|
||||
@RenderBody()
|
||||
|
@ -3,6 +3,8 @@ using Elwig.Models;
|
||||
namespace Elwig.Documents {
|
||||
public abstract class BusinessDocument : Document {
|
||||
|
||||
public bool ShowDateAndLocation = false;
|
||||
|
||||
public Member Member;
|
||||
public bool IncludeSender = false;
|
||||
public bool UseBillingAddress = false;
|
||||
@ -11,7 +13,7 @@ namespace Elwig.Documents {
|
||||
|
||||
public BusinessDocument(string title, Member m, bool includeSender = false) : base(title) {
|
||||
Member = m;
|
||||
Location = App.BranchName;
|
||||
Location = App.BranchLocation;
|
||||
IncludeSender = includeSender;
|
||||
var uid = (m.UstIdNr ?? "-") + (m.IsBuchführend ? "" : " <i>(pauschaliert)</i>");
|
||||
Aside = $"<table><colgroup><col span='1' style='width: 22.5mm;'/><col span='1' style='width: 42.5mm;'/></colgroup>" +
|
||||
|
@ -7,7 +7,6 @@
|
||||
var bucketNum = Model.BucketNames.Length;
|
||||
}
|
||||
<main>
|
||||
<div class="date">@Model.Location, am @($"{Model.Date:dd.MM.yyyy}")</div>
|
||||
<h1>@Model.Title</h1>
|
||||
<table class="credit">
|
||||
<colgroup>
|
||||
|
@ -16,6 +16,7 @@ namespace Elwig.Documents {
|
||||
|
||||
public CreditNote(Credit c, AppDbContext ctx) : base($"Traubengutschrift Nr. {c.TgId} – {c.Payment.Variant.Name}", c.Member) {
|
||||
UseBillingAddress = true;
|
||||
ShowDateAndLocation = true;
|
||||
Credit = c;
|
||||
Aside = Aside.Replace("</table>", "") +
|
||||
$"<thead><tr><th colspan='2'>Gutschrift</th></tr></thead><tbody>" +
|
||||
|
@ -4,7 +4,6 @@
|
||||
@{ Layout = "BusinessDocument"; }
|
||||
<link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\style-deliverynote.css" />
|
||||
<main>
|
||||
<div class="date">@Model.Location, am @($"{Model.Date:dd.MM.yyyy}")</div>
|
||||
<h1>@Model.Title</h1>
|
||||
@{
|
||||
bool displayStats = true; // Model.Delivery.Year == Model.CurrentNextSeason
|
||||
@ -91,7 +90,8 @@
|
||||
}
|
||||
}
|
||||
<tr><td></td><td colspan="5">
|
||||
@Raw(part.ManualWeighing ? "<i>Handwiegung</i>" : $"<i>Waage:</i> {part.ScaleId ?? "?"}, <i>ID:</i> {part.WeighingId ?? "?"}") (@(part.IsGerebelt ? "gerebelt gewogen" : "nicht gerebelt gewogen"))
|
||||
@Raw(part.ManualWeighing ? "<i>Handwiegung</i>" : $"<i>Waage:</i> {part.ScaleId ?? "?"}, <i>ID:</i> {part.WeighingId ?? "?"}")
|
||||
(@(part.IsGerebelt ? "gerebelt gewogen" : "nicht gerebelt gewogen"))@Raw(part.WeighingReason != null ? $", <i>Begründung:</i>" : "") @part.WeighingReason
|
||||
</td></tr>
|
||||
@if (part.Comment != null) {
|
||||
<tr><td></td><td colspan="5"><i>Anmerkung:</i> @part.Comment</td></tr>
|
||||
@ -127,7 +127,7 @@
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><b>Gesamtlieferung</b> [kg]</th>
|
||||
<th><b>Lese @Model.Delivery.Year</b> per @($"{Model.Date:dd.MM.yyyy}") [kg]</th>
|
||||
<th>Lieferpflicht</th>
|
||||
<th>Lieferrecht</th>
|
||||
<th>Unterliefert</th>
|
||||
@ -147,13 +147,14 @@
|
||||
$"<td>{sum:N0}</td>";
|
||||
}
|
||||
var sortids = Model.Delivery.Parts.Select(p => p.SortId).ToList();
|
||||
var buckets = Model.MemberBuckets.GroupBy(b => b.Item1[..2]).ToDictionary(g => g.Key, g => g.Count());
|
||||
}
|
||||
<tr>
|
||||
<th>Geschäftsanteile</th>
|
||||
<th>Gesamtlieferung</th>
|
||||
@Raw(FormatRow(Model.Member.DeliveryObligation, Model.Member.DeliveryRight, Model.Member.Deliveries.Where(d => d.Year == Model.Delivery.Year).Sum(d => d.Weight)))
|
||||
</tr>
|
||||
@foreach (var (id, name, right, obligation, sum) in Model.MemberBuckets.OrderBy(b => b.Item1)) {
|
||||
if (right > 0 && obligation > 0) {
|
||||
if (right > 0 || obligation > 0 || (sum > 0 && buckets[id[..2]] > 1 && !id.EndsWith('_'))) {
|
||||
<tr class="@(sortids.Contains(id[..2]) ? "" : "optional")">
|
||||
<th>@name</th>
|
||||
@Raw(FormatRow(obligation, right, sum))
|
||||
|
@ -11,6 +11,7 @@ namespace Elwig.Documents {
|
||||
|
||||
public DeliveryNote(Delivery d, AppDbContext ctx) : base($"Traubenübernahmeschein Nr. {d.LsNr}", d.Member) {
|
||||
UseBillingAddress = true;
|
||||
ShowDateAndLocation = true;
|
||||
Delivery = d;
|
||||
Aside = Aside.Replace("</table>", "") +
|
||||
$"<thead><tr><th colspan='2'>Lieferung</th></tr></thead><tbody>" +
|
||||
|
@ -9,6 +9,7 @@ namespace Elwig.Documents {
|
||||
private TempFile? PdfFile = null;
|
||||
|
||||
public bool ShowFoldMarks = App.Config.Debug;
|
||||
|
||||
public string DataPath;
|
||||
public int CurrentNextSeason;
|
||||
public string? DocumentId;
|
||||
@ -23,8 +24,8 @@ namespace Elwig.Documents {
|
||||
DataPath = App.DataPath;
|
||||
CurrentNextSeason = Utils.CurrentNextSeason;
|
||||
Title = title;
|
||||
Author = App.Client.NameFull;
|
||||
Header = $"<h1>{c.Name}</h1>";
|
||||
Author = c.NameFull;
|
||||
Header = $"<div class='name'>{c.Name}</div><div class='suffix'>{c.NameSuffix}</div>";
|
||||
Footer = Utils.GenerateFooter("<br/>", " \u00b7 ")
|
||||
.Item(c.NameFull).NextLine()
|
||||
.Item(c.Address).Item($"{c.Plz} {c.Ort}").Item("Österreich").Item("Tel.", c.PhoneNr).Item("Fax", c.FaxNr).NextLine()
|
||||
|
@ -14,6 +14,13 @@
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.info-wrapper .date {
|
||||
text-align: right;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: -1.5em;
|
||||
}
|
||||
|
||||
.address-wrapper {
|
||||
height: 45mm;
|
||||
width: 85mm;
|
||||
@ -68,6 +75,14 @@ aside table tbody td {
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
aside table tbody th {
|
||||
padding: 0.25mm 0.5mm 0.25mm 1mm;
|
||||
}
|
||||
|
||||
aside table tbody td {
|
||||
padding: 0.25mm 0;
|
||||
}
|
||||
|
||||
aside table tbody th {
|
||||
font-weight: normal;
|
||||
}
|
||||
@ -80,7 +95,7 @@ main > *:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.main-wrapper h1, .main-wrapper p {
|
||||
main h1, .main-wrapper p {
|
||||
font-size: 12pt;
|
||||
margin: 1em 0;
|
||||
text-align: justify;
|
||||
@ -92,12 +107,8 @@ main > *:first-child {
|
||||
hyphens: manual;
|
||||
}
|
||||
|
||||
.main-wrapper .date {
|
||||
margin-bottom: 2em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.main-wrapper h1 {
|
||||
main h1 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,8 @@
|
||||
|
||||
main h1 {
|
||||
margin-bottom: 1.5em !important;
|
||||
}
|
||||
|
||||
table.delivery {
|
||||
margin-bottom: 5mm;
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ table th {
|
||||
|
||||
header {
|
||||
height: 45mm;
|
||||
padding: 5mm;
|
||||
padding: 10mm 0 0 0;
|
||||
position: absolute;
|
||||
top: -25mm;
|
||||
left: 0;
|
||||
@ -38,9 +38,15 @@ header {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
header .name {
|
||||
font-size: 18pt;
|
||||
margin-top: 10mm;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
header .suffix {
|
||||
font-size: 12pt;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.footer-wrapper {
|
||||
|
@ -7,7 +7,7 @@
|
||||
<UseWPF>true</UseWPF>
|
||||
<PreserveCompilationContext>true</PreserveCompilationContext>
|
||||
<ApplicationIcon>elwig.ico</ApplicationIcon>
|
||||
<Version>0.2.1</Version>
|
||||
<Version>0.3.0</Version>
|
||||
<SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
|
||||
</PropertyGroup>
|
||||
|
||||
|
78
Elwig/Helpers/AppDbUpdater.cs
Normal file
78
Elwig/Helpers/AppDbUpdater.cs
Normal file
@ -0,0 +1,78 @@
|
||||
using Microsoft.Data.Sqlite;
|
||||
using System;
|
||||
|
||||
namespace Elwig.Helpers {
|
||||
public static class AppDbUpdater {
|
||||
|
||||
public static readonly int RequiredSchemaVersion = 1;
|
||||
|
||||
private static int _versionOffset = 0;
|
||||
private static readonly Action<SqliteConnection>[] _updaters = new[] {
|
||||
UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3
|
||||
};
|
||||
|
||||
private static void ExecuteNonQuery(SqliteConnection cnx, string sql) {
|
||||
using var cmd = cnx.CreateCommand();
|
||||
cmd.CommandText = sql;
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
private static object? ExecuteScalar(SqliteConnection cnx, string sql) {
|
||||
using var cmd = cnx.CreateCommand();
|
||||
cmd.CommandText = sql;
|
||||
return cmd.ExecuteScalar();
|
||||
}
|
||||
|
||||
public static string CheckDb() {
|
||||
using var cnx = AppDbContext.Connect();
|
||||
|
||||
var applId = (long?)ExecuteScalar(cnx, "PRAGMA application_id") ?? 0;
|
||||
if (applId != 0x454C5747) throw new Exception("Invalid application_id of database");
|
||||
|
||||
var schemaVers = (long?)ExecuteScalar(cnx, "PRAGMA schema_version") ?? 0;
|
||||
_versionOffset = (int)(schemaVers % 100);
|
||||
if (_versionOffset != 0) {
|
||||
// schema was modified manually/externally
|
||||
// TODO issue warning
|
||||
}
|
||||
UpdateDbSchema(cnx, (int)(schemaVers / 100), RequiredSchemaVersion);
|
||||
|
||||
var userVers = (long?)ExecuteScalar(cnx, "PRAGMA user_version") ?? 0;
|
||||
var major = userVers >> 24;
|
||||
var minor = (userVers >> 16) & 0xFF;
|
||||
var patch = userVers & 0xFFFF;
|
||||
|
||||
if (App.VersionMajor > major || App.VersionMinor > minor || App.VersionPatch > patch) {
|
||||
long vers = (App.VersionMajor << 24) | (App.VersionMinor << 16) | App.VersionPatch;
|
||||
ExecuteNonQuery(cnx, $"PRAGMA user_version = {vers}");
|
||||
}
|
||||
|
||||
return $"{major}.{minor}.{patch}";
|
||||
}
|
||||
|
||||
private static void UpdateDbSchema(SqliteConnection cnx, int fromVersion, int toVersion) {
|
||||
if (fromVersion == toVersion) {
|
||||
return;
|
||||
} else if (fromVersion > toVersion) {
|
||||
throw new Exception("schema_version of database is too new");
|
||||
} else if (toVersion - 1 > _updaters.Length) {
|
||||
throw new Exception("Unable to update database schema: Updater not implemented");
|
||||
} else if (fromVersion <= 0) {
|
||||
throw new Exception("schema_version of database is invalid");
|
||||
}
|
||||
|
||||
ExecuteNonQuery(cnx, "PRAGMA locking_mode = EXCLUSIVE");
|
||||
ExecuteNonQuery(cnx, "BEGIN EXCLUSIVE");
|
||||
for (int i = fromVersion; i < toVersion; i++) {
|
||||
_updaters[i - 1](cnx);
|
||||
}
|
||||
ExecuteNonQuery(cnx, "COMMIT");
|
||||
ExecuteNonQuery(cnx, "VACUUM");
|
||||
ExecuteNonQuery(cnx, $"PRAGMA schema_version = {toVersion * 100 + _versionOffset}");
|
||||
}
|
||||
|
||||
private static void UpdateDbSchema_1_To_2(SqliteConnection cnx) { }
|
||||
|
||||
private static void UpdateDbSchema_2_To_3(SqliteConnection cnx) { }
|
||||
}
|
||||
}
|
@ -87,6 +87,9 @@ namespace Elwig.Models {
|
||||
[Column("weighing_id")]
|
||||
public string? WeighingId { get; set; }
|
||||
|
||||
[Column("weighing_reason")]
|
||||
public string? WeighingReason { get; set; }
|
||||
|
||||
[Column("comment")]
|
||||
public string? Comment { get; set; }
|
||||
|
||||
|
@ -128,9 +128,6 @@ namespace Elwig.Models {
|
||||
[Column("address")]
|
||||
public string Address { get; set; }
|
||||
|
||||
[Column("email")]
|
||||
public string? Email { get; set; }
|
||||
|
||||
[Column("default_kgnr")]
|
||||
public int? DefaultKgNr { get; set; }
|
||||
|
||||
@ -174,6 +171,9 @@ namespace Elwig.Models {
|
||||
[InverseProperty("Member")]
|
||||
public virtual ISet<MemberTelNr> TelephoneNumbers { get; private set; }
|
||||
|
||||
[InverseProperty("member")]
|
||||
public virtual ISet<MemberEmailAddr> EmailAddresses { get; private set; }
|
||||
|
||||
public string FullAddress => $"{Address}, {PostalDest.AtPlz.Plz} {PostalDest.AtPlz.Ort.Name}";
|
||||
|
||||
public int DeliveryRight => BusinessShares * App.Client.DeliveryRight;
|
||||
|
22
Elwig/Models/MemberEmailAddr.cs
Normal file
22
Elwig/Models/MemberEmailAddr.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace Elwig.Models {
|
||||
[Table("member_email_address"), PrimaryKey("MgNr", "Nr")]
|
||||
public class MemberEmailAddr {
|
||||
[Column("mgnr")]
|
||||
public int MgNr { get; set; }
|
||||
|
||||
[Column("nr")]
|
||||
public int Nr { get; set; }
|
||||
|
||||
[Column("address")]
|
||||
public string Address { get; set; }
|
||||
|
||||
[Column("comment")]
|
||||
public string? Comment { get; set; }
|
||||
|
||||
[ForeignKey("MgNr")]
|
||||
public virtual Member Member { get; private set; }
|
||||
}
|
||||
}
|
@ -131,6 +131,10 @@
|
||||
<Label Content="Bewirt.-Art:" Margin="10,100,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
|
||||
<ComboBox x:Name="WineCultivationInput" 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" TextChanged="TextBox_TextChanged"
|
||||
HorizontalAlignment="Stretch" Margin="0,130,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
|
@ -40,11 +40,8 @@ namespace Elwig.Windows {
|
||||
|
||||
private async Task RefreshAreaCommitmentListQuery() {
|
||||
List<AreaCom> areaComs = await Context.AreaCommitments.Where(a => a.MgNr == Member.MgNr).OrderBy(a => a.FbNr).ToListAsync();
|
||||
|
||||
ControlUtils.RenewItemsSource(AreaCommitmentList, areaComs, i => (i as AreaCom)?.FbNr);
|
||||
if (areaComs.Count == 1)
|
||||
AreaCommitmentList.SelectedIndex = 0;
|
||||
|
||||
ControlUtils.RenewItemsSource(AreaCommitmentList, areaComs, i => (i as AreaCom)?.FbNr,
|
||||
AreaCommitmentList_SelectionChanged, ControlUtils.RenewSourceDefault.None);
|
||||
RefreshInputs();
|
||||
}
|
||||
|
||||
@ -82,6 +79,8 @@ namespace Elwig.Windows {
|
||||
AreaComTypeInput.SelectedItem = a.AreaComType;
|
||||
WineCultivationInput.SelectedItem = a.WineCult;
|
||||
|
||||
CommentInput.Text = a.Comment;
|
||||
|
||||
FinishInputFilling();
|
||||
}
|
||||
|
||||
@ -151,6 +150,7 @@ namespace Elwig.Windows {
|
||||
a.Area = int.Parse(AreaInput.Text);
|
||||
a.VtrgId = (AreaComTypeInput.SelectedItem as AreaComType)?.VtrgId;
|
||||
a.CultId = (WineCultivationInput.SelectedItem as WineCult)?.CultId;
|
||||
a.Comment = (CommentInput.Text == "") ? null : CommentInput.Text;
|
||||
|
||||
EntityEntry<AreaCom>? tr = null;
|
||||
try {
|
||||
|
@ -272,22 +272,21 @@
|
||||
VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,75,10,10" Grid.Column="0" Grid.ColumnSpan="2"
|
||||
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"/>
|
||||
|
||||
<Button x:Name="WeighingManualButton" Content="Handwiegung" Width="120"
|
||||
Click="WeighingManualButton_Click"
|
||||
VerticalAlignment="Top" HorizontalAlignment="Right" Margin="10,10,10,10" Grid.Column="2"/>
|
||||
<Button x:Name="WeighingAButton" Content="Wiegen A" Width="120"
|
||||
Click="WeighingButton_Click"
|
||||
VerticalAlignment="Top" HorizontalAlignment="Right" Margin="10,42,10,10" Grid.Column="2"/>
|
||||
VerticalAlignment="Top" HorizontalAlignment="Right" Margin="10,10,10,10" Grid.Column="2"/>
|
||||
<Button x:Name="WeighingBButton" Content="Wiegen B" Width="120"
|
||||
Click="WeighingButton_Click"
|
||||
VerticalAlignment="Top" HorizontalAlignment="Right" Margin="10,74,10,10" Grid.Column="2"/>
|
||||
VerticalAlignment="Top" HorizontalAlignment="Right" Margin="10,42,10,10" Grid.Column="2"/>
|
||||
<Button x:Name="WeighingCButton" Content="Wiegen C" Width="120"
|
||||
Click="WeighingButton_Click"
|
||||
VerticalAlignment="Top" HorizontalAlignment="Right" Margin="10,106,10,10" Grid.Column="2"/>
|
||||
VerticalAlignment="Top" HorizontalAlignment="Right" Margin="10,74,10,10" Grid.Column="2"/>
|
||||
<Button x:Name="WeighingDButton" Content="Wiegen D" Width="120"
|
||||
Click="WeighingButton_Click"
|
||||
VerticalAlignment="Top" HorizontalAlignment="Right" Margin="10,106,10,10" Grid.Column="2"/>
|
||||
<Button x:Name="WeighingManualButton" Content="Handwiegung" Width="120"
|
||||
Click="WeighingManualButton_Click"
|
||||
VerticalAlignment="Top" HorizontalAlignment="Right" Margin="10,138,10,10" Grid.Column="2"/>
|
||||
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
|
@ -76,6 +76,7 @@ namespace Elwig.Windows {
|
||||
if (n >= 2) WeighingBButton.Content = $"Wiegen {App.Scales[1].ScaleId}";
|
||||
if (n >= 3) WeighingCButton.Content = $"Wiegen {App.Scales[2].ScaleId}";
|
||||
if (n >= 4) WeighingDButton.Content = $"Wiegen {App.Scales[3].ScaleId}";
|
||||
WeighingManualButton.Margin = new Thickness(10, 10 + n * 32, 10, 10);
|
||||
} else {
|
||||
WeighingManualButton.Visibility = Visibility.Hidden;
|
||||
WeighingAButton.Visibility = Visibility.Hidden;
|
||||
@ -232,7 +233,6 @@ namespace Elwig.Windows {
|
||||
double filterOeLt = 0;
|
||||
|
||||
var filter = TextFilter.ToList();
|
||||
var hasFilters = filter.Count > 0;
|
||||
if (filter.Count > 0) {
|
||||
var var = await Context.WineVarieties.Select(v => v.SortId).ToListAsync();
|
||||
var qual = await Context.WineQualityLevels.Select(q => q.QualId).ToListAsync();
|
||||
@ -339,7 +339,7 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
ControlUtils.RenewItemsSource(DeliveryList, deliveries, d => ((d as Delivery)?.Year, (d as Delivery)?.DId),
|
||||
DeliveryList_SelectionChanged, hasFilters ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort);
|
||||
DeliveryList_SelectionChanged, filter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort);
|
||||
|
||||
var members = deliveries.Select(d => d.Member).DistinctBy(m => m.MgNr).ToList();
|
||||
StatusMembers.Text = $"Mitglieder: {members.Count}" + (members.Count > 0 && members.Count <= 4 ? $" ({string.Join(", ", members.Select(m => m.AdministrativeName))})" : "");
|
||||
@ -529,6 +529,7 @@ namespace Elwig.Windows {
|
||||
|
||||
ScaleId = p?.ScaleId;
|
||||
WeighingId = p?.WeighingId;
|
||||
ManualWeighingReason = p?.WeighingReason;
|
||||
|
||||
FinishInputFilling();
|
||||
}
|
||||
@ -590,8 +591,7 @@ namespace Elwig.Windows {
|
||||
p.ManualWeighing = ManualWeighingInput.IsChecked ?? false;
|
||||
p.ScaleId = ScaleId;
|
||||
p.WeighingId = WeighingId;
|
||||
if (ManualWeighingReason != null)
|
||||
p.Comment = (p.Comment != null ? $"{p.Comment} / " : "") + $"Begründung Handwiegung: {ManualWeighingReason}";
|
||||
p.WeighingReason = ManualWeighingReason;
|
||||
|
||||
EntityEntry<Delivery>? dEntry = null;
|
||||
EntityEntry<DeliveryPart>? pEntry = null;
|
||||
|
@ -178,60 +178,64 @@
|
||||
<ColumnDefinition Width="2*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Label Content="E-Mail-Adresse:" Margin="10,10,0,0" Grid.Column="0"/>
|
||||
<TextBox x:Name="EmailAddressInput" Margin="0,10,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||
<Label Content="E-Mail-Adresse (1):" Margin="10,10,0,0" Grid.Column="0"/>
|
||||
<TextBox x:Name="EmailAddress1Input" Margin="0,10,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||
|
||||
<ComboBox x:Name="PhoneNr1TypeInput" DisplayMemberPath="Value" Margin="6,40,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr1Input" Margin="0,40,5,0" Grid.Column="1"
|
||||
<Label Content="E-Mail-Adresse (2):" Margin="10,40,0,0" Grid.Column="0"/>
|
||||
<TextBox x:Name="EmailAddress2Input" Margin="0,40,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||
|
||||
<ComboBox x:Name="PhoneNr1TypeInput" DisplayMemberPath="Value" Margin="6,70,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr1Input" Margin="0,70,5,0" Grid.Column="1"
|
||||
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
||||
<TextBox x:Name="PhoneNr1CommentInput" Margin="0,40,10,0" Grid.Column="2"
|
||||
<TextBox x:Name="PhoneNr1CommentInput" Margin="0,70,10,0" Grid.Column="2"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
|
||||
<ComboBox x:Name="PhoneNr2TypeInput" DisplayMemberPath="Value" Margin="6,70,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr2Input" Margin="0,70,5,0" Grid.Column="1"
|
||||
<ComboBox x:Name="PhoneNr2TypeInput" DisplayMemberPath="Value" Margin="6,100,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr2Input" Margin="0,100,5,0" Grid.Column="1"
|
||||
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
||||
<TextBox x:Name="PhoneNr2CommentInput" Margin="0,70,10,0" Grid.Column="2"
|
||||
<TextBox x:Name="PhoneNr2CommentInput" Margin="0,100,10,0" Grid.Column="2"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
|
||||
<ComboBox x:Name="PhoneNr3TypeInput" DisplayMemberPath="Value" Margin="6,100,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr3Input" Margin="0,100,5,0" Grid.Column="1"
|
||||
<ComboBox x:Name="PhoneNr3TypeInput" DisplayMemberPath="Value" Margin="6,130,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr3Input" Margin="0,130,5,0" Grid.Column="1"
|
||||
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
||||
<TextBox x:Name="PhoneNr3CommentInput" Margin="0,100,10,0" Grid.Column="2"
|
||||
<TextBox x:Name="PhoneNr3CommentInput" Margin="0,130,10,0" Grid.Column="2"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
|
||||
<ComboBox x:Name="PhoneNr4TypeInput" DisplayMemberPath="Value" Margin="6,130,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr4Input" Margin="0,130,5,0" Grid.Column="1"
|
||||
<ComboBox x:Name="PhoneNr4TypeInput" DisplayMemberPath="Value" Margin="6,160,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr4Input" Margin="0,160,5,0" Grid.Column="1"
|
||||
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
||||
<TextBox x:Name="PhoneNr4CommentInput" Margin="0,130,10,0" Grid.Column="2"
|
||||
<TextBox x:Name="PhoneNr4CommentInput" Margin="0,160,10,0" Grid.Column="2"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
|
||||
<ComboBox x:Name="PhoneNr5TypeInput" DisplayMemberPath="Value" Margin="6,160,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr5Input" Margin="0,160,5,0" Grid.Column="1"
|
||||
<ComboBox x:Name="PhoneNr5TypeInput" DisplayMemberPath="Value" Margin="6,190,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr5Input" Margin="0,190,5,0" Grid.Column="1"
|
||||
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
||||
<TextBox x:Name="PhoneNr5CommentInput" Margin="0,160,10,0" Grid.Column="2"
|
||||
<TextBox x:Name="PhoneNr5CommentInput" Margin="0,190,10,0" Grid.Column="2"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
|
||||
<ComboBox x:Name="PhoneNr6TypeInput" DisplayMemberPath="Value" Margin="6,190,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr6Input" Margin="0,190,5,0" Grid.Column="1"
|
||||
<ComboBox x:Name="PhoneNr6TypeInput" DisplayMemberPath="Value" Margin="6,220,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr6Input" Margin="0,220,5,0" Grid.Column="1"
|
||||
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
||||
<TextBox x:Name="PhoneNr6CommentInput" Margin="0,190,10,0" Grid.Column="2"
|
||||
<TextBox x:Name="PhoneNr6CommentInput" Margin="0,220,10,0" Grid.Column="2"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
|
||||
<ComboBox x:Name="PhoneNr7TypeInput" DisplayMemberPath="Value" Margin="6,220,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr7Input" Margin="0,220,5,0" Grid.Column="1"
|
||||
<ComboBox x:Name="PhoneNr7TypeInput" DisplayMemberPath="Value" Margin="6,250,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr7Input" Margin="0,250,5,0" Grid.Column="1"
|
||||
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
||||
<TextBox x:Name="PhoneNr7CommentInput" Margin="0,220,10,0" Grid.Column="2"
|
||||
<TextBox x:Name="PhoneNr7CommentInput" Margin="0,250,10,0" Grid.Column="2"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
|
||||
<ComboBox x:Name="PhoneNr8TypeInput" DisplayMemberPath="Value" Margin="6,250,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr8Input" Margin="0,250,5,0" Grid.Column="1"
|
||||
<ComboBox x:Name="PhoneNr8TypeInput" DisplayMemberPath="Value" Margin="6,280,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr8Input" Margin="0,280,5,0" Grid.Column="1"
|
||||
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
||||
<TextBox x:Name="PhoneNr8CommentInput" Margin="0,250,10,0" Grid.Column="2"
|
||||
<TextBox x:Name="PhoneNr8CommentInput" Margin="0,280,10,0" Grid.Column="2"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
|
||||
<ComboBox x:Name="PhoneNr9TypeInput" DisplayMemberPath="Value" Margin="6,280,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr9Input" Margin="0,280,5,0" Grid.Column="1"
|
||||
<ComboBox x:Name="PhoneNr9TypeInput" DisplayMemberPath="Value" Margin="6,310,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||
<TextBox x:Name="PhoneNr9Input" Margin="0,310,5,0" Grid.Column="1"
|
||||
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
||||
<TextBox x:Name="PhoneNr9CommentInput" Margin="0,280,10,0" Grid.Column="2"
|
||||
TextChanged="TextBox_TextChanged"/>
|
||||
|
@ -266,7 +266,7 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
private void Menu_Member_SendEmail_Click(object sender, RoutedEventArgs evt) {
|
||||
Utils.MailTo(((Member)MemberList.SelectedItem).Email);
|
||||
Utils.MailTo(((Member)MemberList.SelectedItem).EmailAddresses.First().Address);
|
||||
}
|
||||
|
||||
private void FocusSearchInput(object sender, RoutedEventArgs evt) {
|
||||
@ -349,8 +349,6 @@ namespace Elwig.Windows {
|
||||
m.PostalDestId = ((AT_PlzDest)OrtInput.SelectedItem).Id;
|
||||
m.Address = AddressInput.Text;
|
||||
|
||||
m.Email = (EmailAddressInput.Text == "") ? null : EmailAddressInput.Text;
|
||||
|
||||
m.Iban = (IbanInput.Text == "") ? null : IbanInput.Text.Replace(" ", "");
|
||||
m.Bic = (BicInput.Text == "") ? null : BicInput.Text;
|
||||
|
||||
@ -424,6 +422,27 @@ namespace Elwig.Windows {
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
var input = i == 0 ? EmailAddress1Input : EmailAddress2Input;
|
||||
var emailAddr = m.EmailAddresses.FirstOrDefault(a => a.Nr - 1 == i);
|
||||
if (input.Text == "") {
|
||||
if (emailAddr != null) {
|
||||
Context.Remove(emailAddr);
|
||||
}
|
||||
} else {
|
||||
MemberEmailAddr a = emailAddr ?? Context.CreateProxy<MemberEmailAddr>();
|
||||
a.Nr = i + 1;
|
||||
a.Address = input.Text;
|
||||
a.Comment = null;
|
||||
if (emailAddr == null) {
|
||||
a.MgNr = newMgNr;
|
||||
await Context.AddAsync(a);
|
||||
} else {
|
||||
Context.Update(a);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await Context.SaveChangesAsync();
|
||||
|
||||
if (newMgNr != m.MgNr) {
|
||||
@ -475,7 +494,10 @@ namespace Elwig.Windows {
|
||||
OrtInput.SelectedItem = null;
|
||||
}
|
||||
|
||||
EmailAddressInput.Text = m.Email;
|
||||
var emailAddrs = m.EmailAddresses.OrderBy(a => a.Nr).ToList();
|
||||
EmailAddress1Input.Text = emailAddrs.Count > 0 ? emailAddrs[0].Address : "";
|
||||
EmailAddress2Input.Text = emailAddrs.Count > 1 ? emailAddrs[1].Address : "";
|
||||
|
||||
var phoneNrs = m.TelephoneNumbers.OrderBy(p => p.Nr).ToList();
|
||||
for (int i = 0; i < PhoneNrInputs.Length; i++) {
|
||||
if (i < phoneNrs.Count) {
|
||||
@ -525,7 +547,7 @@ namespace Elwig.Windows {
|
||||
|
||||
AreaCommitment.Text = $"{m.ActiveAreaCommitments.Select(c => c.Area).Sum():N0} m²";
|
||||
|
||||
Menu_Member_SendEmail.IsEnabled = m.Email != null;
|
||||
Menu_Member_SendEmail.IsEnabled = m.EmailAddresses.Count > 0;
|
||||
|
||||
FinishInputFilling();
|
||||
}
|
||||
|
Reference in New Issue
Block a user