Add PaymentVariantsWindow
This commit is contained in:
@ -236,5 +236,13 @@ namespace Elwig {
|
|||||||
w.FocusKgNr(kgnr);
|
w.FocusKgNr(kgnr);
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static PaymentVariantsWindow FocusPaymentVariantsWindow(int year) {
|
||||||
|
return FocusWindow<PaymentVariantsWindow>(() => new(year), w => w.Year == year);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ChartWindow FocusChartWindow(int year, int avnr) {
|
||||||
|
return FocusWindow<ChartWindow>(() => new(year, avnr), w => w.Year == year && w.AvNr == avnr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,40 +1,31 @@
|
|||||||
using Elwig.Helpers;
|
using Elwig.Helpers;
|
||||||
|
using Elwig.Models.Dtos;
|
||||||
using Elwig.Models.Entities;
|
using Elwig.Models.Entities;
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace Elwig.Documents {
|
namespace Elwig.Documents {
|
||||||
public class CreditNote : BusinessDocument {
|
public class CreditNote : BusinessDocument {
|
||||||
|
|
||||||
public Credit Credit;
|
public Credit? Credit;
|
||||||
|
public CreditNoteData Data;
|
||||||
public string? Text;
|
public string? Text;
|
||||||
public string CurrencySymbol;
|
public string CurrencySymbol;
|
||||||
public string[] BucketNames;
|
|
||||||
public int Precision;
|
public int Precision;
|
||||||
public IEnumerable<DeliveryPart> Parts;
|
|
||||||
|
|
||||||
public CreditNote(Credit c, AppDbContext ctx) : base($"Traubengutschrift Nr. {c.TgId} – {c.Payment.Variant.Name}", c.Member) {
|
public CreditNote(AppDbContext ctx, PaymentMember p, CreditNoteData data) :
|
||||||
|
base($"Traubengutschrift {(p.Credit != null ? $"Nr. {p.Credit.Year}/{p.Credit.TgNr}" : p.Member.Name)} – {p.Variant.Name}", p.Member) {
|
||||||
UseBillingAddress = true;
|
UseBillingAddress = true;
|
||||||
ShowDateAndLocation = true;
|
ShowDateAndLocation = true;
|
||||||
Credit = c;
|
Data = data;
|
||||||
|
Credit = p.Credit;
|
||||||
Aside = Aside.Replace("</table>", "") +
|
Aside = Aside.Replace("</table>", "") +
|
||||||
$"<thead><tr><th colspan='2'>Gutschrift</th></tr></thead><tbody>" +
|
$"<thead><tr><th colspan='2'>Gutschrift</th></tr></thead><tbody>" +
|
||||||
$"<tr><th>TG-Nr.</th><td>{c.TgId}</td></tr>" +
|
$"<tr><th>TG-Nr.</th><td>{(p.Credit != null ? $"{p.Credit.Year}/{p.Credit.TgNr}" : "-")}</td></tr>" +
|
||||||
$"<tr><th>Überw. am</th><td>{c.Payment.Variant.TransferDate:dd.MM.yyyy}</td></tr>" +
|
$"<tr><th>Überw. am</th><td>{p.Variant.TransferDate:dd.MM.yyyy}</td></tr>" +
|
||||||
$"<tr><th>Datum/Zeit</th><td>{c.ModifiedTimestamp:dd.MM.yyyy} / {c.ModifiedTimestamp:HH:mm}</td></tr>" +
|
$"<tr><th>Datum/Zeit</th><td>{p.Credit?.ModifiedTimestamp:dd.MM.yyyy} / {p.Credit?.ModifiedTimestamp:HH:mm}</td></tr>" +
|
||||||
$"</tbody></table>";
|
$"</tbody></table>";
|
||||||
Text = App.Client.TextDeliveryNote;
|
Text = App.Client.TextDeliveryNote;
|
||||||
DocumentId = $"Tr.-Gutschr. {c.TgId}";
|
DocumentId = $"Tr.-Gutschr. " + (p.Credit != null ? $"{p.Credit.Year}/{p.Credit.TgNr}" : p.MgNr);
|
||||||
CurrencySymbol = c.Payment.Variant.Season.Currency.Symbol ?? c.Payment.Variant.Season.Currency.Code;
|
CurrencySymbol = p.Variant.Season.Currency.Symbol ?? p.Variant.Season.Currency.Code;
|
||||||
BucketNames = new string[0]; // FIXME
|
Precision = p.Variant.Season.Precision;
|
||||||
Precision = c.Payment.Variant.Season.Precision;
|
|
||||||
Parts = ctx.DeliveryParts.FromSql($"""
|
|
||||||
SELECT p.*
|
|
||||||
FROM v_delivery v
|
|
||||||
JOIN delivery_part p ON (p.year, p.did, p.dpnr) = (v.year, v.did, v.dpnr)
|
|
||||||
WHERE (v.year, v.mgnr) = ({c.Year}, {c.Member.MgNr})
|
|
||||||
ORDER BY sortid, attribute_prio DESC, COALESCE(attrid, '~'), kmw DESC, date, time, dpnr
|
|
||||||
""").ToList();
|
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
@ -3,24 +3,22 @@
|
|||||||
@model Elwig.Documents.CreditNote
|
@model Elwig.Documents.CreditNote
|
||||||
@{ Layout = "BusinessDocument"; }
|
@{ Layout = "BusinessDocument"; }
|
||||||
<link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\CreditNote.css"/>
|
<link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\CreditNote.css"/>
|
||||||
@{
|
|
||||||
var bucketNum = Model.BucketNames.Length;
|
|
||||||
}
|
|
||||||
<main>
|
<main>
|
||||||
<h1>@Model.Title</h1>
|
<h1>@Model.Title</h1>
|
||||||
<table class="credit">
|
<table class="credit">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col style="width: 24mm;"/>
|
<col style="width: 25mm;"/>
|
||||||
<col style="width: 6mm;"/>
|
<col style="width: 5mm;"/>
|
||||||
<col style="width: 31mm;"/>
|
<col style="width: 20mm;"/>
|
||||||
|
<col style="width: 18mm;"/>
|
||||||
|
<col style="width: 10mm;"/>
|
||||||
|
<col style="width: 10mm;"/>
|
||||||
|
<col style="width: 10mm;"/>
|
||||||
|
<col style="width: 10mm;"/>
|
||||||
<col style="width: 15mm;"/>
|
<col style="width: 15mm;"/>
|
||||||
<col style="width: 8mm;"/>
|
|
||||||
<col style="width: 10mm;"/>
|
|
||||||
<col style="width: 12mm;"/>
|
|
||||||
<col style="width: 10mm;"/>
|
|
||||||
<col style="width: 12mm;"/>
|
<col style="width: 12mm;"/>
|
||||||
<col style="width: 15mm;"/>
|
<col style="width: 15mm;"/>
|
||||||
<col style="width: 17mm;"/>
|
<col style="width: 15mm;"/>
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -30,57 +28,62 @@
|
|||||||
<th rowspan="3" style="text-align: left;">Attribut</th>
|
<th rowspan="3" style="text-align: left;">Attribut</th>
|
||||||
<th rowspan="2" colspan="2">Gradation</th>
|
<th rowspan="2" colspan="2">Gradation</th>
|
||||||
<th colspan="2">Zu-/Abschläge</th>
|
<th colspan="2">Zu-/Abschläge</th>
|
||||||
<th colspan="2">@Raw(string.Join("<br/>", Model.BucketNames))</th>
|
<th rowspan="2" colspan="2">Flächenbindung</th>
|
||||||
|
<th rowspan="2">Preis</th>
|
||||||
<th rowspan="2">Betrag</th>
|
<th rowspan="2">Betrag</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Abs.</th>
|
<th>Abs.</th>
|
||||||
<th>Rel.</th>
|
<th>Rel.</th>
|
||||||
<th>Gewicht</th>
|
|
||||||
<th>Preis</th>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>[°Oe]</th>
|
<th>[°Oe]</th>
|
||||||
<th>[°KMW]</th>
|
<th>[°KMW]</th>
|
||||||
<th>[@Model.CurrencySymbol/kg]</th>
|
<th>[@Model.CurrencySymbol/kg]</th>
|
||||||
<th>[%]</th>
|
<th>[%]</th>
|
||||||
<th>[kg]</th>
|
<th colspan="2">[kg]</th>
|
||||||
<th>[@Model.CurrencySymbol/kg]</th>
|
<th>[@Model.CurrencySymbol/kg]</th>
|
||||||
<th>[@Model.CurrencySymbol]</th>
|
<th>[@Model.CurrencySymbol]</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@{
|
@foreach (var p in Model.Data.Rows) {
|
||||||
string FormatRow(int? weight, decimal? amount) {
|
var rows = Math.Max(p.Buckets.Length, p.Modifiers.Length + 1);
|
||||||
var w = weight == null || weight == 0 ? "-" : $"{weight:N0}";
|
var first = true;
|
||||||
return $"<td class='weight'>{w}</td><td class='amount'>{amount?.ToString("0." + string.Concat(Enumerable.Repeat('0', Model.Precision)))}</td>";
|
//var pmt = p.Payment;
|
||||||
|
var abs = 0; // pmt?.ModAbs == null || pmt?.ModAbs == 0 ? "-" : pmt?.ModAbs.ToString("0." + string.Concat(Enumerable.Repeat('0', Model.Precision)));
|
||||||
|
var rel = 0; // pmt?.ModRel == null || pmt?.ModRel == 0 ? "-" : $"{pmt?.ModRel * 100:0.00##}";
|
||||||
|
@for (int i = 0; i < rows; i++) {
|
||||||
|
<tr class="@(first ? "first" : "") @(rows > i + 1 ? "trailing" : "")">
|
||||||
|
@if (first) {
|
||||||
|
<td rowspan="@rows" class="lsnr">@p.LsNr</td>
|
||||||
|
<td rowspan="@rows" class="dpnr">@p.DPNr</td>
|
||||||
|
<td class="variant small">@p.Variant</td>
|
||||||
|
<td class="attribute small">@p.Attribute</td>
|
||||||
|
<td rowspan="@rows" class="oe">@($"{p.Gradation.Oe:N0}")</td>
|
||||||
|
<td rowspan="@rows" class="kmw">@($"{p.Gradation.Kmw:N1}")</td>
|
||||||
|
<td rowspan="@rows" class="abs">@abs</td>
|
||||||
|
<td rowspan="@rows" class="rel">@rel</td>
|
||||||
}
|
}
|
||||||
string? last = null;
|
@if (i > 0 && i <= p.Modifiers.Length) {
|
||||||
|
<td colspan="2" class="mod">@(p.Modifiers[i - 1])</td>
|
||||||
|
} else if (i > 0) {
|
||||||
|
<td colspan="2"></td>
|
||||||
|
}
|
||||||
|
@if (i < p.Buckets.Length) {
|
||||||
|
var bucket = p.Buckets[i];
|
||||||
|
<td class="geb small">@bucket.Name:</td>
|
||||||
|
<td class="weight">@($"{bucket.Value:N0}")</td>
|
||||||
|
<td class="price">@($"{bucket.Price:N4}")</td>
|
||||||
|
} else {
|
||||||
|
<td colspan="3"></td>
|
||||||
|
}
|
||||||
|
@if (first) {
|
||||||
|
<td rowspan="@rows" class="amount">@($"{1000:N2}")</td>
|
||||||
|
first = false;
|
||||||
}
|
}
|
||||||
@foreach (var part in Model.Parts) {
|
|
||||||
var pmt = part.Payment;
|
|
||||||
var abs = pmt?.ModAbs == null || pmt?.ModAbs == 0 ? "-" : pmt?.ModAbs.ToString("0." + string.Concat(Enumerable.Repeat('0', Model.Precision)));
|
|
||||||
var rel = pmt?.ModRel == null || pmt?.ModRel == 0 ? "-" : $"{pmt?.ModRel * 100:0.00##}";
|
|
||||||
<tr class="first @(bucketNum <= 1 ? "last" : "") @(last != null && last != part.SortId ? "new" : "")">
|
|
||||||
<td rowspan="@bucketNum" class="lsnr">@part.Delivery.LsNr</td>
|
|
||||||
<td rowspan="@bucketNum" class="dpnr">@part.DPNr</td>
|
|
||||||
<td rowspan="@bucketNum" class="variant">@part.Variant.Name</td>
|
|
||||||
<td rowspan="@bucketNum" class="attribute">@part.Attribute?.Name</td>
|
|
||||||
<td rowspan="@bucketNum" class="oe">@($"{part.Oe:N0}")</td>
|
|
||||||
<td rowspan="@bucketNum" class="kmw">@($"{part.Kmw:N1}")</td>
|
|
||||||
<td rowspan="@bucketNum" class="abs">@abs</td>
|
|
||||||
<td rowspan="@bucketNum" class="rel">@rel</td>
|
|
||||||
<!--FIXME price-->
|
|
||||||
@Raw(FormatRow(pmt?.DeliveryPart.Buckets?.ElementAtOrDefault(0)?.Value, 0))
|
|
||||||
<td rowspan="@bucketNum" class="amount sum">@($"{pmt?.Amount:N2}")</td>
|
|
||||||
</tr>
|
|
||||||
@for (int i = 1; i < bucketNum; i++) {
|
|
||||||
<tr class="@(i == bucketNum - 1 ? "last" : "")">
|
|
||||||
<!--FIXME price-->
|
|
||||||
@Raw(FormatRow(pmt?.DeliveryPart.Buckets?.ElementAtOrDefault(i)?.Value, 0))
|
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
last = part.SortId;
|
|
||||||
}
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@ -62,3 +62,7 @@ table.credit tbody tr.last td {
|
|||||||
table.credit tbody tr.new {
|
table.credit tbody tr.new {
|
||||||
border-top: 0.5pt solid black;
|
border-top: 0.5pt solid black;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table.credit .small {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
@ -79,8 +79,8 @@
|
|||||||
first = false;
|
first = false;
|
||||||
}
|
}
|
||||||
</tr>
|
</tr>
|
||||||
lastVariant = p.Variant;
|
|
||||||
}
|
}
|
||||||
|
lastVariant = p.Variant;
|
||||||
}
|
}
|
||||||
<tr class="sum">
|
<tr class="sum">
|
||||||
<td colspan="8">Gesamt:</td>
|
<td colspan="8">Gesamt:</td>
|
||||||
|
@ -51,6 +51,7 @@ namespace Elwig.Helpers {
|
|||||||
public DbSet<OverUnderDeliveryRow> OverUnderDeliveryRows { get; private set; }
|
public DbSet<OverUnderDeliveryRow> OverUnderDeliveryRows { get; private set; }
|
||||||
public DbSet<AreaComUnderDeliveryRowSingle> AreaComUnderDeliveryRows { get; private set; }
|
public DbSet<AreaComUnderDeliveryRowSingle> AreaComUnderDeliveryRows { get; private set; }
|
||||||
public DbSet<MemberDeliveryPerVariantRowSingle> MemberDeliveryPerVariantRows { get; private set; }
|
public DbSet<MemberDeliveryPerVariantRowSingle> MemberDeliveryPerVariantRows { get; private set; }
|
||||||
|
public DbSet<CreditNoteRowSingle> CreditNoteRows { get; private set; }
|
||||||
|
|
||||||
private readonly StreamWriter? LogFile = null;
|
private readonly StreamWriter? LogFile = null;
|
||||||
public static DateTime LastWriteTime => File.GetLastWriteTime(App.Config.DatabaseFile);
|
public static DateTime LastWriteTime => File.GetLastWriteTime(App.Config.DatabaseFile);
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
using Microsoft.Data.Sqlite;
|
using Microsoft.Data.Sqlite;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
namespace Elwig.Helpers {
|
namespace Elwig.Helpers {
|
||||||
public static class AppDbUpdater {
|
public static class AppDbUpdater {
|
||||||
|
|
||||||
public static readonly int RequiredSchemaVersion = 8;
|
public static readonly int RequiredSchemaVersion = 9;
|
||||||
|
|
||||||
private static int _versionOffset = 0;
|
private static int _versionOffset = 0;
|
||||||
private static readonly Action<SqliteConnection>[] _updaters = new[] {
|
private static readonly Action<SqliteConnection>[] _updaters = new[] {
|
||||||
UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3, UpdateDbSchema_3_To_4, UpdateDbSchema_4_To_5,
|
UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3, UpdateDbSchema_3_To_4, UpdateDbSchema_4_To_5,
|
||||||
UpdateDbSchema_5_To_6, UpdateDBSchema_6_To_7, UpdateDbSchema_7_To_8
|
UpdateDbSchema_5_To_6, UpdateDBSchema_6_To_7, UpdateDbSchema_7_To_8, UpdateDbSchema_8_To_9,
|
||||||
};
|
};
|
||||||
|
|
||||||
private static void ExecuteNonQuery(SqliteConnection cnx, string sql) {
|
private static void ExecuteNonQuery(SqliteConnection cnx, string sql) {
|
||||||
@ -617,5 +618,101 @@ namespace Elwig.Helpers {
|
|||||||
WHERE gkz / 10000 = 8;
|
WHERE gkz / 10000 = 8;
|
||||||
""");
|
""");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void UpdateDbSchema_8_To_9(SqliteConnection cnx) {
|
||||||
|
ExecuteNonQuery(cnx, """
|
||||||
|
CREATE TABLE payment_delivery_part_bucket (
|
||||||
|
year INTEGER NOT NULL,
|
||||||
|
did INTEGER NOT NULL,
|
||||||
|
dpnr INTEGER NOT NULL,
|
||||||
|
bktnr INTEGER NOT NULL,
|
||||||
|
avnr INTEGER NOT NULL,
|
||||||
|
|
||||||
|
price INTEGER NOT NULL,
|
||||||
|
amount INTEGER NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT pk_payment_delivery_part_bucket PRIMARY KEY (year, did, dpnr, bktnr, avnr),
|
||||||
|
CONSTRAINT fk_payment_delivery_part_bucket_delivery_part_bucket FOREIGN KEY (year, did, dpnr, bktnr) REFERENCES delivery_part_bucket (year, did, dpnr, bktnr)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE CASCADE,
|
||||||
|
CONSTRAINT fk_payment_delivery_part_bucket_payment_variant FOREIGN KEY (year, avnr) REFERENCES payment_variant (year, avnr)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE CASCADE
|
||||||
|
) STRICT;
|
||||||
|
""");
|
||||||
|
|
||||||
|
ExecuteNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_i");
|
||||||
|
ExecuteNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_u");
|
||||||
|
ExecuteNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_d");
|
||||||
|
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part RENAME COLUMN amount TO net_amount");
|
||||||
|
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL");
|
||||||
|
|
||||||
|
ExecuteNonQuery(cnx, """
|
||||||
|
CREATE TRIGGER t_payment_delivery_part_bucket_i
|
||||||
|
AFTER INSERT ON payment_delivery_part_bucket FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO payment_delivery_part (year, did, dpnr, avnr, net_amount)
|
||||||
|
VALUES (NEW.year, NEW.did, NEW.dpnr, NEW.avnr, NEW.amount)
|
||||||
|
ON CONFLICT DO UPDATE SET net_amount = net_amount + NEW.amount;
|
||||||
|
END;
|
||||||
|
""");
|
||||||
|
ExecuteNonQuery(cnx, """
|
||||||
|
CREATE TRIGGER t_payment_delivery_part_bucket_u
|
||||||
|
AFTER UPDATE OF amount ON payment_delivery_part_bucket FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
UPDATE payment_delivery_part
|
||||||
|
SET net_amount = net_amount - OLD.amount
|
||||||
|
WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr);
|
||||||
|
UPDATE payment_delivery_part
|
||||||
|
SET net_amount = net_amount + NEW.amount
|
||||||
|
WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr);
|
||||||
|
END;
|
||||||
|
""");
|
||||||
|
ExecuteNonQuery(cnx, """
|
||||||
|
CREATE TRIGGER t_payment_delivery_part_bucket_d
|
||||||
|
AFTER DELETE ON payment_delivery_part_bucket FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
UPDATE payment_delivery_part
|
||||||
|
SET net_amount = net_amount - OLD.amount
|
||||||
|
WHERE (year, did, dpnr, avnr) = (OLD.year, OLD.did, OLD.dpnr, OLD.avnr);
|
||||||
|
END;
|
||||||
|
""");
|
||||||
|
|
||||||
|
ExecuteNonQuery(cnx, "ALTER TABLE payment_member RENAME COLUMN amount TO net_amount");
|
||||||
|
ExecuteNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN mod_abs INTEGER NOT NULL DEFAULT 0");
|
||||||
|
ExecuteNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN mod_rel REAL NOT NULL DEFAULT 0");
|
||||||
|
ExecuteNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_rel)) VIRTUAL");
|
||||||
|
|
||||||
|
ExecuteNonQuery(cnx, """
|
||||||
|
CREATE TRIGGER t_payment_delivery_part_i
|
||||||
|
AFTER INSERT ON payment_delivery_part FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO payment_member (year, avnr, mgnr, net_amount)
|
||||||
|
VALUES (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did)), NEW.amount)
|
||||||
|
ON CONFLICT DO UPDATE SET amount = amount + excluded.amount;
|
||||||
|
END;
|
||||||
|
""");
|
||||||
|
ExecuteNonQuery(cnx, """
|
||||||
|
CREATE TRIGGER t_payment_delivery_part_u
|
||||||
|
AFTER UPDATE OF amount ON payment_delivery_part FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
UPDATE payment_member
|
||||||
|
SET net_amount = net_amount - OLD.amount
|
||||||
|
WHERE (year, avnr, mgnr) = (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did)));
|
||||||
|
UPDATE payment_member
|
||||||
|
SET net_amount = net_amount + NEW.amount
|
||||||
|
WHERE (year, avnr, mgnr) = (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did)));
|
||||||
|
END;
|
||||||
|
""");
|
||||||
|
ExecuteNonQuery(cnx, """
|
||||||
|
CREATE TRIGGER t_payment_delivery_part_d
|
||||||
|
AFTER DELETE ON payment_delivery_part FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
UPDATE payment_member
|
||||||
|
SET net_amount = net_amount - OLD.amount
|
||||||
|
WHERE (year, avnr, mgnr) = (OLD.year, OLD.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (OLD.year, OLD.did)));
|
||||||
|
END;
|
||||||
|
""");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
139
Elwig/Models/Dtos/CreditNoteData.cs
Normal file
139
Elwig/Models/Dtos/CreditNoteData.cs
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
using Elwig.Helpers;
|
||||||
|
using Elwig.Models.Entities;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Elwig.Models.Dtos {
|
||||||
|
public class CreditNoteData : DataTable<CreditNoteRow> {
|
||||||
|
|
||||||
|
private static readonly (string, string, string?)[] FieldNames = new[] {
|
||||||
|
("", "", (string?)null), // TODO
|
||||||
|
};
|
||||||
|
|
||||||
|
private readonly int Year;
|
||||||
|
private readonly int? TgNr;
|
||||||
|
private readonly int? AvNr;
|
||||||
|
private readonly int? MgNr;
|
||||||
|
|
||||||
|
private CreditNoteData(IEnumerable<CreditNoteRow> rows, int year, int? tgnr, int? avnr = null, int? mgnr = null) :
|
||||||
|
base($"Traubengutschrift {year}/{tgnr}", rows, FieldNames) {
|
||||||
|
Year = year;
|
||||||
|
TgNr = tgnr;
|
||||||
|
AvNr = avnr;
|
||||||
|
MgNr = mgnr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<IDictionary<int, CreditNoteData>> ForPaymentVariant(DbSet<CreditNoteRowSingle> table, int year, int avnr) {
|
||||||
|
return (await FromDbSet(table, year, avnr))
|
||||||
|
.GroupBy(
|
||||||
|
r => new { r.Year, r.AvNr, r.MgNr, r.TgNr, r.DId, r.DPNr },
|
||||||
|
(k, g) => new CreditNoteRow(g))
|
||||||
|
.GroupBy(
|
||||||
|
r => new { r.Year, r.AvNr, r.MgNr, r.TgNr },
|
||||||
|
(k, g) => new CreditNoteData(g, k.Year, k.TgNr, mgnr: k.MgNr))
|
||||||
|
.ToDictionary(d => d.MgNr ?? 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task<IEnumerable<CreditNoteRowSingle>> FromDbSet(DbSet<CreditNoteRowSingle> table, int? year = null, int? avnr = null, int? mgnr = null) {
|
||||||
|
var y = year?.ToString() ?? "NULL";
|
||||||
|
var v = avnr?.ToString() ?? "NULL";
|
||||||
|
var m = mgnr?.ToString() ?? "NULL";
|
||||||
|
return await table.FromSqlRaw($"""
|
||||||
|
SELECT d.year, c.tgnr, p.avnr, d.mgnr, d.did, d.lsnr, d.dpnr, b.bktnr, d.sortid, b.discr, b.value, p.price, p.amount,
|
||||||
|
v.name AS variant, a.name AS attribute, q.name AS quality_level, d.oe, d.kmw
|
||||||
|
FROM v_delivery d
|
||||||
|
JOIN wine_variety v ON d.sortid = v.sortid
|
||||||
|
LEFT JOIN wine_attribute a ON a.attrid = d.attrid
|
||||||
|
JOIN wine_quality_level q ON q.qualid = d.qualid
|
||||||
|
LEFT JOIN delivery_part_bucket b ON (b.year, b.did, b.dpnr) = (d.year, d.did, d.dpnr)
|
||||||
|
LEFT JOIN payment_delivery_part_bucket p ON (p.year, p.did, p.dpnr, p.bktnr) = (b.year, b.did, b.dpnr, b.bktnr)
|
||||||
|
LEFT JOIN credit c ON (c.year, c.avnr, c.mgnr) = (d.year, p.avnr, d.mgnr)
|
||||||
|
WHERE b.value > 0 AND (d.year = {y} OR {y} IS NULL) AND (p.avnr = {v} OR {v} IS NULL OR p.avnr IS NULL) AND (d.mgnr = {m} OR {m} IS NULL)
|
||||||
|
ORDER BY d.year, p.avnr, d.mgnr, d.lsnr, d.dpnr
|
||||||
|
""").ToListAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CreditNoteRow {
|
||||||
|
|
||||||
|
public int Year;
|
||||||
|
public int? TgNr;
|
||||||
|
public int AvNr;
|
||||||
|
public int MgNr;
|
||||||
|
|
||||||
|
public string LsNr;
|
||||||
|
public int DPNr;
|
||||||
|
public string Variant;
|
||||||
|
public string? Attribute;
|
||||||
|
public string[] Modifiers;
|
||||||
|
public string QualityLevel;
|
||||||
|
public (double Oe, double Kmw) Gradation;
|
||||||
|
public (string Name, int Value, decimal? Price, decimal? Amount)[] Buckets;
|
||||||
|
|
||||||
|
public CreditNoteRow(IEnumerable<CreditNoteRowSingle> rows) {
|
||||||
|
var f = rows.First();
|
||||||
|
Year = f.Year;
|
||||||
|
TgNr = f.TgNr;
|
||||||
|
MgNr = f.MgNr;
|
||||||
|
|
||||||
|
LsNr = f.LsNr;
|
||||||
|
DPNr = f.DPNr;
|
||||||
|
Variant = f.Variant;
|
||||||
|
Attribute = f.Attribute;
|
||||||
|
Modifiers = Array.Empty<string>(); // TODO
|
||||||
|
QualityLevel = f.QualityLevel;
|
||||||
|
Gradation = (f.Oe, f.Kmw);
|
||||||
|
Buckets = rows
|
||||||
|
.Where(b => b.Value > 0)
|
||||||
|
.OrderByDescending(b => b.BktNr)
|
||||||
|
.Select(b => (b.Discr == "_" ? "ungeb." : $"geb. {f.SortId}{b.Discr}", b.Value,
|
||||||
|
b.Price != null ? (decimal?)Utils.DecFromDb((long)b.Price, 0) : null,
|
||||||
|
b.Amount != null ? (decimal?)Utils.DecFromDb((long)b.Amount, 0) : null))
|
||||||
|
.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Keyless]
|
||||||
|
public class CreditNoteRowSingle {
|
||||||
|
[Column("year")]
|
||||||
|
public int Year { get; set; }
|
||||||
|
[Column("tgnr")]
|
||||||
|
public int? TgNr { get; set; }
|
||||||
|
[Column("avnr")]
|
||||||
|
public int? AvNr { get; set; }
|
||||||
|
[Column("mgnr")]
|
||||||
|
public int MgNr { get; set; }
|
||||||
|
[Column("did")]
|
||||||
|
public int DId { get; set; }
|
||||||
|
[Column("lsnr")]
|
||||||
|
public string LsNr { get; set; }
|
||||||
|
[Column("dpnr")]
|
||||||
|
public int DPNr { get; set; }
|
||||||
|
[Column("bktnr")]
|
||||||
|
public int BktNr { get; set; }
|
||||||
|
[Column("sortid")]
|
||||||
|
public string SortId { get; set; }
|
||||||
|
[Column("discr")]
|
||||||
|
public string Discr { get; set; }
|
||||||
|
[Column("value")]
|
||||||
|
public int Value { get; set; }
|
||||||
|
[Column("price")]
|
||||||
|
public long? Price { get; set; }
|
||||||
|
[Column("amount")]
|
||||||
|
public long? Amount { get; set; }
|
||||||
|
[Column("variant")]
|
||||||
|
public string Variant { get; set; }
|
||||||
|
[Column("attribute")]
|
||||||
|
public string? Attribute { get; set; }
|
||||||
|
[Column("quality_level")]
|
||||||
|
public string QualityLevel { get; set; }
|
||||||
|
[Column("oe")]
|
||||||
|
public double Oe { get; set; }
|
||||||
|
[Column("kmw")]
|
||||||
|
public double Kmw { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
<local:AdministrationWindow x:Class="Elwig.Windows.ChartWindow"
|
<local:AdministrationWindow
|
||||||
|
x:Class="Elwig.Windows.ChartWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
@ -18,8 +18,8 @@ using ScottPlot.Plottable;
|
|||||||
namespace Elwig.Windows {
|
namespace Elwig.Windows {
|
||||||
public partial class ChartWindow : AdministrationWindow {
|
public partial class ChartWindow : AdministrationWindow {
|
||||||
|
|
||||||
private readonly int Year = 2021;
|
public readonly int Year;
|
||||||
private readonly int AvNr = 2;
|
public readonly int AvNr;
|
||||||
|
|
||||||
private ScatterPlot OechslePricePlotScatter;
|
private ScatterPlot OechslePricePlotScatter;
|
||||||
private MarkerPlot HighlightedPoint;
|
private MarkerPlot HighlightedPoint;
|
||||||
@ -39,9 +39,12 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
private Graph? Graph;
|
private Graph? Graph;
|
||||||
|
|
||||||
public ChartWindow() {
|
public ChartWindow(int year, int avnr) {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
Year = year;
|
||||||
|
AvNr = avnr;
|
||||||
|
var v = Context.PaymentVariants.Find(year, avnr);
|
||||||
|
Title = $"{v?.Name} - Lese {year} - Elwig";
|
||||||
ExemptInputs = new Control[] {
|
ExemptInputs = new Control[] {
|
||||||
GraphList, OechsleInput, PriceInput, FreeZoomInput, GradationLinesInput, TooltipInput
|
GraphList, OechsleInput, PriceInput, FreeZoomInput, GradationLinesInput, TooltipInput
|
||||||
};
|
};
|
||||||
|
99
Elwig/Windows/PaymentVariantsWindow.xaml
Normal file
99
Elwig/Windows/PaymentVariantsWindow.xaml
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
<local:ContextWindow
|
||||||
|
x:Class="Elwig.Windows.PaymentVariantsWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:local="clr-namespace:Elwig.Windows"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
Title="Auszahlungsvarianten - Elwig" Height="450" Width="800" MinHeight="400" MinWidth="700">
|
||||||
|
<Window.Resources>
|
||||||
|
<Style TargetType="Label">
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Left"/>
|
||||||
|
<Setter Property="VerticalAlignment" Value="Top"/>
|
||||||
|
<Setter Property="Padding" Value="2,4,2,4"/>
|
||||||
|
<Setter Property="Height" Value="25"/>
|
||||||
|
</Style>
|
||||||
|
<Style TargetType="TextBox">
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Stretch"/>
|
||||||
|
<Setter Property="VerticalAlignment" Value="Top"/>
|
||||||
|
<Setter Property="FontSize" Value="14"/>
|
||||||
|
<Setter Property="Padding" Value="2"/>
|
||||||
|
<Setter Property="Height" Value="25"/>
|
||||||
|
<Setter Property="TextWrapping" Value="NoWrap"/>
|
||||||
|
</Style>
|
||||||
|
<Style TargetType="ComboBox">
|
||||||
|
<Setter Property="Height" Value="25"/>
|
||||||
|
<Setter Property="FontSize" Value="14"/>
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Stretch"/>
|
||||||
|
<Setter Property="VerticalAlignment" Value="Top"/>
|
||||||
|
</Style>
|
||||||
|
<Style TargetType="Button">
|
||||||
|
<Setter Property="FontSize" Value="14"/>
|
||||||
|
<Setter Property="Padding" Value="9,3"/>
|
||||||
|
<Setter Property="Height" Value="27"/>
|
||||||
|
</Style>
|
||||||
|
</Window.Resources>
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="320"/>
|
||||||
|
<ColumnDefinition Width="100"/>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="200"/>
|
||||||
|
<RowDefinition Height="*"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<ListBox x:Name="PaymentVariantList" Margin="10,10,35,10" Grid.RowSpan="2" SelectionChanged="PaymentVariantList_SelectionChanged">
|
||||||
|
<ListBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<TextBlock Text="{Binding Name}" Width="200"/>
|
||||||
|
<TextBlock Text="{Binding Date}" Width="60"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</ListBox.ItemTemplate>
|
||||||
|
</ListBox>
|
||||||
|
<Button x:Name="AddButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="11" Padding="0,1.5,0,0"
|
||||||
|
Click="AddButton_Click"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Right" Width="25" Height="25" Margin="5,0,5,60" Grid.RowSpan="2"/>
|
||||||
|
<Button x:Name="CopyButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="12" Padding="0,0,0,0" IsEnabled="False"
|
||||||
|
Click="CopyButton_Click"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Right" Width="25" Height="25" Margin="5,0,5,0" Grid.RowSpan="2"/>
|
||||||
|
<Button x:Name="DeleteButton" Content="" FontFamily="Segoe MDL2 Assets" FontSize="11" Padding="0,1.5,0,0" IsEnabled="False"
|
||||||
|
Click="DeleteButton_Click"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Right" Width="25" Height="25" Margin="5,60,5,0" Grid.RowSpan="2"/>
|
||||||
|
|
||||||
|
<Label Content="Name:" Margin="10,10,0,0" Grid.Column="1"/>
|
||||||
|
<TextBox x:Name="NameInput" Width="200" Grid.Column="2" HorizontalAlignment="Left" Margin="0,10,0,0"/>
|
||||||
|
|
||||||
|
<Label Content="Beschreibung:" Margin="10,40,0,0" Grid.Column="1"/>
|
||||||
|
<TextBox x:Name="CommentInput" Grid.Column="2" HorizontalAlignment="Stretch" Margin="0,40,10,0"/>
|
||||||
|
|
||||||
|
<Label Content="Erstellt am:" Margin="10,70,0,0" Grid.Column="1"/>
|
||||||
|
<TextBox x:Name="DateInput" Grid.Column="2" Width="77" HorizontalAlignment="Left" Margin="0,70,10,0"/>
|
||||||
|
|
||||||
|
<Label Content="Überwiesen am:" Margin="10,100,0,0" Grid.Column="1"/>
|
||||||
|
<TextBox x:Name="TransferDateInput" Grid.Column="2" Width="77" HorizontalAlignment="Left" Margin="0,100,10,0"/>
|
||||||
|
<Button x:Name="CalculateButton" Content="Berechnen" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
|
Click="CalculateButton_Click"
|
||||||
|
VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="100" Margin="10,10,115,10"/>
|
||||||
|
<Button x:Name="EditButton" Content="Bearbeiten" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
|
Click="EditButton_Click"
|
||||||
|
VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="100" Margin="10,10,10,10"/>
|
||||||
|
|
||||||
|
<GroupBox Header="Abschluss" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Margin="10,0,10,10">
|
||||||
|
<Grid>
|
||||||
|
<ProgressBar x:Name="ProgressBar" Margin="10,0,0,74" Height="27" Width="180"
|
||||||
|
VerticalAlignment="Bottom" HorizontalAlignment="Left"/>
|
||||||
|
<Button x:Name="ShowButton" Content="Vorschau" FontSize="14" Width="180" Margin="10,10,10,42" Height="27" Tag="Print" IsEnabled="False"
|
||||||
|
Click="ShowButton_Click"
|
||||||
|
VerticalAlignment="Bottom" HorizontalAlignment="Left"/>
|
||||||
|
<Button x:Name="PrintButton" Content="Drucken" FontSize="14" Width="180" Margin="10,10,10,10" Height="27" Tag="Print" IsEnabled="False"
|
||||||
|
Click="PrintButton_Click"
|
||||||
|
VerticalAlignment="Bottom" HorizontalAlignment="Left"/>
|
||||||
|
</Grid>
|
||||||
|
</GroupBox>
|
||||||
|
</Grid>
|
||||||
|
</local:ContextWindow>
|
126
Elwig/Windows/PaymentVariantsWindow.xaml.cs
Normal file
126
Elwig/Windows/PaymentVariantsWindow.xaml.cs
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
using Elwig.Documents;
|
||||||
|
using Elwig.Helpers;
|
||||||
|
using Elwig.Models.Dtos;
|
||||||
|
using Elwig.Models.Entities;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Input;
|
||||||
|
|
||||||
|
namespace Elwig.Windows {
|
||||||
|
public partial class PaymentVariantsWindow : ContextWindow {
|
||||||
|
|
||||||
|
public readonly int Year;
|
||||||
|
|
||||||
|
public PaymentVariantsWindow(int year) {
|
||||||
|
InitializeComponent();
|
||||||
|
Year = year;
|
||||||
|
Title = $"Auszahlungsvarianten - Lese {Year} - Elwig";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task OnRenewContext() {
|
||||||
|
ControlUtils.RenewItemsSource(PaymentVariantList, await Context.PaymentVariants.Where(v => v.Year == Year).OrderBy(v => v.AvNr).ToListAsync(), v => (v as PaymentVar)?.AvNr);
|
||||||
|
Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update() {
|
||||||
|
if (PaymentVariantList.SelectedItem is PaymentVar v) {
|
||||||
|
var locked = v.TransferDate != null || !v.TestVariant;
|
||||||
|
DeleteButton.IsEnabled = !locked;
|
||||||
|
CalculateButton.IsEnabled = !locked;
|
||||||
|
CopyButton.IsEnabled = true;
|
||||||
|
EditButton.IsEnabled = true;
|
||||||
|
ShowButton.IsEnabled = true;
|
||||||
|
PrintButton.IsEnabled = true;
|
||||||
|
|
||||||
|
NameInput.Text = v.Name;
|
||||||
|
CommentInput.Text = v.Comment;
|
||||||
|
} else {
|
||||||
|
EditButton.IsEnabled = false;
|
||||||
|
CopyButton.IsEnabled = false;
|
||||||
|
CalculateButton.IsEnabled = false;
|
||||||
|
DeleteButton.IsEnabled = false;
|
||||||
|
ShowButton.IsEnabled = false;
|
||||||
|
PrintButton.IsEnabled = false;
|
||||||
|
|
||||||
|
NameInput.Text = "";
|
||||||
|
CommentInput.Text = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PaymentVariantList_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
|
||||||
|
Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CopyButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DeleteButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CalculateButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EditButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
if (PaymentVariantList.SelectedItem is not PaymentVar v)
|
||||||
|
return;
|
||||||
|
App.FocusChartWindow(v.Year, v.AvNr);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ShowButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
await Generate(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void PrintButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
await Generate(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task Generate(int mode) {
|
||||||
|
if (PaymentVariantList.SelectedItem is not PaymentVar v)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Mouse.OverrideCursor = Cursors.AppStarting;
|
||||||
|
|
||||||
|
var members = Context.Members.FromSqlRaw($"""
|
||||||
|
SELECT m.*
|
||||||
|
FROM member m
|
||||||
|
INNER JOIN delivery d ON d.mgnr = m.mgnr
|
||||||
|
WHERE d.year = {Year}
|
||||||
|
GROUP BY m.mgnr
|
||||||
|
""");
|
||||||
|
members = members.OrderBy(m => m.MgNr);
|
||||||
|
|
||||||
|
IEnumerable<Member> list = await members.ToListAsync();
|
||||||
|
var data = await CreditNoteData.ForPaymentVariant(Context.CreditNoteRows, v.Year, v.AvNr);
|
||||||
|
var payments = await Context.MemberPayments.Where(p => p.Year == v.Year && p.AvNr == v.AvNr).ToDictionaryAsync(c => c.MgNr);
|
||||||
|
using var doc = Document.Merge(list.Select(m =>
|
||||||
|
new CreditNote(Context, payments[m.MgNr], data[m.MgNr])
|
||||||
|
));
|
||||||
|
await doc.Generate(new Progress<double>(v => {
|
||||||
|
ProgressBar.Value = v;
|
||||||
|
}));
|
||||||
|
Mouse.OverrideCursor = null;
|
||||||
|
|
||||||
|
if (mode < 2) {
|
||||||
|
doc.Show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (App.Config.Debug) {
|
||||||
|
doc.Show();
|
||||||
|
} else {
|
||||||
|
await doc.Print();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -31,6 +31,7 @@ namespace Elwig.Windows {
|
|||||||
CalculateBucketsButton.IsEnabled = valid && last;
|
CalculateBucketsButton.IsEnabled = valid && last;
|
||||||
DeliveryConfirmationButton.IsEnabled = valid;
|
DeliveryConfirmationButton.IsEnabled = valid;
|
||||||
OverUnderDeliveryButton.IsEnabled = valid;
|
OverUnderDeliveryButton.IsEnabled = valid;
|
||||||
|
PaymentButton.IsEnabled = valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void CalculateBucketsButton_Click(object sender, RoutedEventArgs evt) {
|
private async void CalculateBucketsButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
@ -82,8 +83,9 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void PaymentButton_Click(object sender, RoutedEventArgs evt) {
|
private void PaymentButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
var w = new ChartWindow();
|
if (SeasonInput.Value is not int year)
|
||||||
w.Show();
|
return;
|
||||||
|
App.FocusPaymentVariantsWindow(year);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
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"
|
||||||
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
|
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
|
||||||
Title="Test Fenster - Elwig" MinHeight="400" MinWidth="325" Height="450" Width="800" ResizeMode="CanResize" Loaded="Window_Loaded">
|
Title="Test Fenster - Elwig" MinHeight="400" MinWidth="325" Height="450" Width="800" ResizeMode="CanResize">
|
||||||
<Grid>
|
<Grid>
|
||||||
<xctk:CheckComboBox x:Name="MyComboBox" HorizontalAlignment="Left" Margin="216,186,0,0" VerticalAlignment="Top" Delimiter=", "
|
<xctk:CheckComboBox x:Name="MyComboBox" HorizontalAlignment="Left" Margin="216,186,0,0" VerticalAlignment="Top" Delimiter=", "
|
||||||
SelectedValue="{Binding SelectedValue}"
|
SelectedValue="{Binding SelectedValue}"
|
||||||
@ -16,14 +16,7 @@
|
|||||||
<Button x:Name="WeighingButton1" Click="WeighingButton1_Click" Height="30" Content="Aktuelles Gewicht" Width="110" Margin="515,246,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
<Button x:Name="WeighingButton1" Click="WeighingButton1_Click" Height="30" Content="Aktuelles Gewicht" Width="110" Margin="515,246,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||||
<Button x:Name="WeighingButton2" Click="WeighingButton2_Click" Height="30" Content="Wiegen" Width="110" Margin="515,285,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
<Button x:Name="WeighingButton2" Click="WeighingButton2_Click" Height="30" Content="Wiegen" Width="110" Margin="515,285,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||||
<TextBlock x:Name="Output" Height="20" Width="200" Margin="470,329,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
<TextBlock x:Name="Output" Height="20" Width="200" Margin="470,329,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||||
<Button x:Name="ChartButton" Content="Chart" Click="ChartButton_Click"
|
|
||||||
Margin="50,240,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
|
||||||
<Button x:Name="ZipButton" Content="ZIP-File" Click="ZipButton_Click"
|
<Button x:Name="ZipButton" Content="ZIP-File" Click="ZipButton_Click"
|
||||||
Margin="50,270,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
Margin="50,270,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
|
|
||||||
<Button x:Name="PdfDeliveryButton" Content="Lieferschein Erzeugen" Click="PdfDeliveryButton_Click" Tag="Print" IsEnabled="False"
|
|
||||||
Margin="260,190,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
|
||||||
<Button x:Name="PdfCreditButton" Content="Gutschrift Erzeugen" Click="PdfCreditButton_Click" Tag="Print" IsEnabled="False"
|
|
||||||
Margin="260,160,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
|
@ -21,11 +21,6 @@ namespace Elwig.Windows {
|
|||||||
MyListBox.ItemsSource = new string[] { "Test 1", "Test 2", "Test 3", "Test 4" };
|
MyListBox.ItemsSource = new string[] { "Test 1", "Test 2", "Test 3", "Test 4" };
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_Loaded(object sender, RoutedEventArgs evt) {
|
|
||||||
PdfDeliveryButton.IsEnabled = App.IsPrintingReady;
|
|
||||||
PdfCreditButton.IsEnabled = App.IsPrintingReady;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnItemSelectionChanged(object sender, ItemSelectionChangedEventArgs e) {
|
private void OnItemSelectionChanged(object sender, ItemSelectionChangedEventArgs e) {
|
||||||
MyText.Text = string.Join(", ", MyComboBox.SelectedItems.Cast<string>());
|
MyText.Text = string.Join(", ", MyComboBox.SelectedItems.Cast<string>());
|
||||||
}
|
}
|
||||||
@ -50,33 +45,10 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ChartButton_Click(object sender, RoutedEventArgs evt) {
|
|
||||||
var w = new ChartWindow();
|
|
||||||
w.Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void ZipButton_Click(object sender, RoutedEventArgs evt) {
|
private async void ZipButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
using var ctx = new AppDbContext();
|
using var ctx = new AppDbContext();
|
||||||
using var ods = new OdsFile(@"C:\Users\Lorenz\Desktop\test.ods");
|
using var ods = new OdsFile(@"C:\Users\Lorenz\Desktop\test.ods");
|
||||||
await ods.AddTable(await DeliveryConfirmationData.ForMember(ctx.DeliveryParts, 2023, ctx.Members.Find(2948)));
|
await ods.AddTable(await DeliveryConfirmationData.ForMember(ctx.DeliveryParts, 2023, ctx.Members.Find(2948)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void PdfDeliveryButton_Click(object sender, RoutedEventArgs evt) {
|
|
||||||
Mouse.OverrideCursor = Cursors.AppStarting;
|
|
||||||
using var ctx = new AppDbContext();
|
|
||||||
using var doc = new DeliveryNote(await ctx.Deliveries.OrderBy(d => d.Parts.Count).ThenBy(d => d.Year).ThenBy(d => d.DId).LastAsync(), ctx);
|
|
||||||
await doc.Generate();
|
|
||||||
doc.Show();
|
|
||||||
Mouse.OverrideCursor = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void PdfCreditButton_Click(object sender, RoutedEventArgs evt) {
|
|
||||||
Mouse.OverrideCursor = Cursors.AppStarting;
|
|
||||||
using var ctx = new AppDbContext();
|
|
||||||
using var doc = new CreditNote(await ctx.Credits.FirstAsync(), ctx);
|
|
||||||
await doc.Generate();
|
|
||||||
doc.Show();
|
|
||||||
Mouse.OverrideCursor = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user