Compare commits
3 Commits
30aaa64f59
...
77cee53f2d
| Author | SHA1 | Date | |
|---|---|---|---|
| 77cee53f2d | |||
| 1a673f4b3a | |||
| 5ad8c88319 |
86
Elwig/Documents/CreditNote.cshtml
Normal file
86
Elwig/Documents/CreditNote.cshtml
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
@using RazorLight
|
||||||
|
@inherits TemplatePage<Elwig.Documents.CreditNote>
|
||||||
|
@model Elwig.Documents.CreditNote
|
||||||
|
@{ Layout = "BusinessDocument"; }
|
||||||
|
<link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\style-creditnote.css"/>
|
||||||
|
@{
|
||||||
|
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>
|
||||||
|
<col style="width: 24mm;"/>
|
||||||
|
<col style="width: 6mm;"/>
|
||||||
|
<col style="width: 31mm;"/>
|
||||||
|
<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: 15mm;"/>
|
||||||
|
<col style="width: 17mm;"/>
|
||||||
|
</colgroup>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th rowspan="3" style="text-align: left;">Lieferschein-Nr.</th>
|
||||||
|
<th rowspan="3">Pos.</th>
|
||||||
|
<th rowspan="3" style="text-align: left;">Sorte</th>
|
||||||
|
<th rowspan="3" style="text-align: left;">Attribut(e)</th>
|
||||||
|
<th rowspan="2" colspan="2">Gradation</th>
|
||||||
|
<th colspan="2">Zu-/Abschläge</th>
|
||||||
|
<th colspan="2">@Raw(string.Join("<br/>", Model.BucketNames))</th>
|
||||||
|
<th rowspan="2">Betrag</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Abs.</th>
|
||||||
|
<th>Rel.</th>
|
||||||
|
<th>Gewicht</th>
|
||||||
|
<th>Preis</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>[°Oe]</th>
|
||||||
|
<th>[°KMW]</th>
|
||||||
|
<th>[@Model.CurrencySymbol/kg]</th>
|
||||||
|
<th>[%]</th>
|
||||||
|
<th>[kg]</th>
|
||||||
|
<th>[@Model.CurrencySymbol/kg]</th>
|
||||||
|
<th>[@Model.CurrencySymbol]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@{
|
||||||
|
string FormatRow(int? weight, decimal? amount) {
|
||||||
|
var w = weight == null || weight == 0 ? "-" : $"{weight:N0}";
|
||||||
|
return $"<td class='weight'>{w}</td><td class='amount'>{amount?.ToString("0." + string.Concat(Enumerable.Repeat('0', Model.Precision)))}</td>";
|
||||||
|
}
|
||||||
|
string? last = null;
|
||||||
|
}
|
||||||
|
@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">@string.Join(" / ", part.PartAttributes.Select(a => a.AttrId))</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>
|
||||||
|
@Raw(FormatRow(pmt?.Buckets?.ElementAtOrDefault(0), pmt?.Prices?.ElementAtOrDefault(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" : "")">
|
||||||
|
@Raw(FormatRow(pmt?.Buckets?.ElementAtOrDefault(i), pmt?.Prices?.ElementAtOrDefault(i)))
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
last = part.SortId;
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</main>
|
||||||
39
Elwig/Documents/CreditNote.cshtml.cs
Normal file
39
Elwig/Documents/CreditNote.cshtml.cs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
using Elwig.Helpers;
|
||||||
|
using Elwig.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Elwig.Documents {
|
||||||
|
public class CreditNote : BusinessDocument {
|
||||||
|
|
||||||
|
public Credit Credit;
|
||||||
|
public string? Text;
|
||||||
|
public string CurrencySymbol;
|
||||||
|
public string[] BucketNames;
|
||||||
|
public int Precision;
|
||||||
|
public IEnumerable<DeliveryPart> Parts;
|
||||||
|
|
||||||
|
public CreditNote(Credit c, AppDbContext ctx) : base($"Traubengutschrift Nr. {c.TgId} – {c.Payment.Variant.Name}", c.Member) {
|
||||||
|
UseBillingAddress = true;
|
||||||
|
Credit = c;
|
||||||
|
Aside = Aside.Replace("</table>", "") +
|
||||||
|
$"<thead><tr><th colspan='2'>Gutschrift</th></tr></thead><tbody>" +
|
||||||
|
$"<tr><th>TG-Nr.</th><td>{c.TgId}</td></tr>" +
|
||||||
|
$"<tr><th>Überw. am</th><td>{c.Payment.Variant.TransferDate:dd.MM.yyyy}</td></tr>" +
|
||||||
|
$"<tr><th>Datum/Zeit</th><td>{c.ModifiedTimestamp:dd.MM.yyyy} / {c.ModifiedTimestamp:HH:mm}</td></tr>" +
|
||||||
|
$"</tbody></table>";
|
||||||
|
Text = App.Client.TextDeliveryNote;
|
||||||
|
DocumentId = $"Tr.-Gutschr. {c.TgId}";
|
||||||
|
CurrencySymbol = c.Payment.Variant.Season.Currency.Symbol ?? c.Payment.Variant.Season.Currency.Code;
|
||||||
|
BucketNames = c.Payment.Variant.BucketNames;
|
||||||
|
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, LENGTH(attributes) DESC, attributes, kmw DESC, date, time, dpnr
|
||||||
|
""").ToList();
|
||||||
|
}
|
||||||
|
}}
|
||||||
@@ -49,6 +49,8 @@ namespace Elwig.Documents {
|
|||||||
name = "BusinessLetter";
|
name = "BusinessLetter";
|
||||||
} else if (this is DeliveryNote) {
|
} else if (this is DeliveryNote) {
|
||||||
name = "DeliveryNote";
|
name = "DeliveryNote";
|
||||||
|
} else if (this is CreditNote) {
|
||||||
|
name = "CreditNote";
|
||||||
} else {
|
} else {
|
||||||
throw new InvalidOperationException("Invalid document object");
|
throw new InvalidOperationException("Invalid document object");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ namespace Elwig.Documents {
|
|||||||
await e.CompileTemplateAsync("BusinessDocument");
|
await e.CompileTemplateAsync("BusinessDocument");
|
||||||
await e.CompileTemplateAsync("BusinessLetter");
|
await e.CompileTemplateAsync("BusinessLetter");
|
||||||
await e.CompileTemplateAsync("DeliveryNote");
|
await e.CompileTemplateAsync("DeliveryNote");
|
||||||
|
await e.CompileTemplateAsync("CreditNote");
|
||||||
|
|
||||||
Engine = e;
|
Engine = e;
|
||||||
evtHandler();
|
evtHandler();
|
||||||
|
|||||||
64
Elwig/Documents/style-creditnote.css
Normal file
64
Elwig/Documents/style-creditnote.css
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
|
||||||
|
table.credit {
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit th,
|
||||||
|
table.credit td {
|
||||||
|
padding: 0 0.25mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit thead {
|
||||||
|
font-size: 8pt
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit thead th {
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: italic;
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit td {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit .oe,
|
||||||
|
table.credit .kmw {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit .dpnr {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit .amount,
|
||||||
|
table.credit .weight {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit .rel,
|
||||||
|
table.credit .abs {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit .amount.sum {
|
||||||
|
vertical-align: bottom;
|
||||||
|
padding-bottom: 1mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit tbody tr:not(.first):not(.last) {
|
||||||
|
break-before: avoid;
|
||||||
|
break-after: avoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit tbody tr.first td {
|
||||||
|
padding-top: 1mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit tbody tr.last td {
|
||||||
|
padding-bottom: 1mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.credit tbody tr.new {
|
||||||
|
border-top: 0.5pt solid black;
|
||||||
|
}
|
||||||
@@ -44,6 +44,7 @@ namespace Elwig.Helpers {
|
|||||||
public DbSet<DeliveryPartModifier> DeliveryPartModifiers { get; private set; }
|
public DbSet<DeliveryPartModifier> DeliveryPartModifiers { get; private set; }
|
||||||
public DbSet<PaymentVar> PaymentVariants { get; private set; }
|
public DbSet<PaymentVar> PaymentVariants { get; private set; }
|
||||||
public DbSet<PaymentMember> MemberPayments { get; private set; }
|
public DbSet<PaymentMember> MemberPayments { get; private set; }
|
||||||
|
public DbSet<Credit> Credits { 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);
|
||||||
|
|||||||
@@ -21,12 +21,9 @@ namespace Elwig.Helpers.Billing {
|
|||||||
public static IEnumerable<Transaction> FromPaymentVariant(PaymentVar variant) {
|
public static IEnumerable<Transaction> FromPaymentVariant(PaymentVar variant) {
|
||||||
var last = variant.Season.PaymentVariants.Where(v => v.TransferDate != null).OrderBy(v => v.TransferDate).LastOrDefault();
|
var last = variant.Season.PaymentVariants.Where(v => v.TransferDate != null).OrderBy(v => v.TransferDate).LastOrDefault();
|
||||||
var dict = last?.MemberPayments.ToDictionary(m => m.MgNr, m => m.Amount) ?? new();
|
var dict = last?.MemberPayments.ToDictionary(m => m.MgNr, m => m.Amount) ?? new();
|
||||||
return variant.MemberPayments
|
return variant.Credits
|
||||||
.OrderBy(m => m.MgNr)
|
.OrderBy(c => c.MgNr)
|
||||||
.Select(m => {
|
.Select(c => new Transaction(c.Member, c.Amount, variant.Season.CurrencyCode, c.TgNr))
|
||||||
var amt = Math.Round(dict.GetValueOrDefault(m.MgNr, 0), 2);
|
|
||||||
return new Transaction(m.Member, m.Amount - amt, m.Variant.Season.CurrencyCode, m.TgNr ?? 0);
|
|
||||||
})
|
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
104
Elwig/Models/Credit.cs
Normal file
104
Elwig/Models/Credit.cs
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
using Elwig.Helpers;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
|
namespace Elwig.Models {
|
||||||
|
[Table("credit"), PrimaryKey("Year", "TgNr"), Index("Year", "AvNr", "MgNr", IsUnique = true)]
|
||||||
|
public class Credit {
|
||||||
|
[Column("year")]
|
||||||
|
public int Year { get; set; }
|
||||||
|
|
||||||
|
[Column("tgnr")]
|
||||||
|
public int TgNr { get; set; }
|
||||||
|
|
||||||
|
[NotMapped]
|
||||||
|
public string TgId => $"{Year}/{TgNr:000}";
|
||||||
|
|
||||||
|
[Column("mgnr")]
|
||||||
|
public int MgNr { get; set; }
|
||||||
|
|
||||||
|
[Column("avnr")]
|
||||||
|
public int AvNr { get; set; }
|
||||||
|
|
||||||
|
[Column("net_amount")]
|
||||||
|
public long NetAmountValue { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal NetAmount {
|
||||||
|
get => Utils.DecFromDb(NetAmountValue, 2);
|
||||||
|
set => NetAmountValue = Utils.DecToDb(value, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("prev_net_amount")]
|
||||||
|
public long? PrevNetAmountValue { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? PrevNetAmount {
|
||||||
|
get => PrevNetAmountValue != null ? Utils.DecFromDb(PrevNetAmountValue.Value, 2) : null;
|
||||||
|
set => PrevNetAmountValue = value != null ? Utils.DecToDb(value.Value, 2) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("vat")]
|
||||||
|
public double VatValue { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal Vat {
|
||||||
|
get => (decimal)VatValue;
|
||||||
|
set => VatValue = (double)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("vat_amount")]
|
||||||
|
public long VatAmountValue { get; private set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal VatAmount {
|
||||||
|
get => Utils.DecFromDb(VatAmountValue, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("gross_amount")]
|
||||||
|
public long GrossAmountValue { get; private set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal GrossAmount {
|
||||||
|
get => Utils.DecFromDb(GrossAmountValue, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("modifiers")]
|
||||||
|
public long? ModifiersValue { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Modifiers {
|
||||||
|
get => ModifiersValue != null ? Utils.DecFromDb(ModifiersValue.Value, 2) : null;
|
||||||
|
set => ModifiersValue = value != null ? Utils.DecToDb(value.Value, 2) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("prev_modifiers")]
|
||||||
|
public long? PrevModifiersValue { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? PrevModifiers {
|
||||||
|
get => PrevModifiersValue != null ? Utils.DecFromDb(PrevModifiersValue.Value, 2) : null;
|
||||||
|
set => PrevModifiersValue = value != null ? Utils.DecToDb(value.Value, 2) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("amount")]
|
||||||
|
public long AmountValue { get; private set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal Amount {
|
||||||
|
get => Utils.DecFromDb(AmountValue, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("ctime")]
|
||||||
|
public long CTime { get; private set; }
|
||||||
|
[NotMapped]
|
||||||
|
public DateTime CreatedTimestamp => DateTimeOffset.FromUnixTimeSeconds(CTime).LocalDateTime;
|
||||||
|
|
||||||
|
[Column("mtime")]
|
||||||
|
public long MTime { get; private set; }
|
||||||
|
[NotMapped]
|
||||||
|
public DateTime ModifiedTimestamp => DateTimeOffset.FromUnixTimeSeconds(CTime).LocalDateTime;
|
||||||
|
|
||||||
|
[ForeignKey("Year, AvNr, MgNr")]
|
||||||
|
public virtual PaymentMember Payment { get; private set; }
|
||||||
|
|
||||||
|
[ForeignKey("Year, AvNr")]
|
||||||
|
public virtual PaymentVar Variant { get; private set; }
|
||||||
|
|
||||||
|
[ForeignKey("MgNr")]
|
||||||
|
public virtual Member Member { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,15 +30,10 @@ namespace Elwig.Models {
|
|||||||
|
|
||||||
[Column("kmw")]
|
[Column("kmw")]
|
||||||
public double Kmw { get; set; }
|
public double Kmw { get; set; }
|
||||||
|
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public double Oe {
|
public double Oe {
|
||||||
get {
|
get => Utils.KmwToOe(Kmw);
|
||||||
return Utils.KmwToOe(Kmw);
|
set => Kmw = Utils.OeToKmw(value);
|
||||||
}
|
|
||||||
set {
|
|
||||||
Kmw = Utils.OeToKmw(value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Column("qualid")]
|
[Column("qualid")]
|
||||||
@@ -107,6 +102,10 @@ namespace Elwig.Models {
|
|||||||
[NotMapped]
|
[NotMapped]
|
||||||
public IEnumerable<Modifier> Modifiers => PartModifiers.Select(m => m.Modifier).OrderBy(m => m.Ordering);
|
public IEnumerable<Modifier> Modifiers => PartModifiers.Select(m => m.Modifier).OrderBy(m => m.Ordering);
|
||||||
|
|
||||||
|
[InverseProperty("DeliveryPart")]
|
||||||
|
public virtual PaymentDeliveryPart? Payment { get; private set; }
|
||||||
|
|
||||||
|
[NotMapped]
|
||||||
public string OriginString => Origin.OriginString + "\n" + (Kg?.Gl != null ? $" / {Kg.Gl.Name}" : "") + (Kg != null ? $" / {Kg.AtKg.Gem.Name} / KG {Kg.AtKg.Name}" : "") + (Rd != null ? $" / Ried {Rd.Name}" : "");
|
public string OriginString => Origin.OriginString + "\n" + (Kg?.Gl != null ? $" / {Kg.Gl.Name}" : "") + (Kg != null ? $" / {Kg.AtKg.Gem.Name} / KG {Kg.AtKg.Name}" : "") + (Rd != null ? $" / Ried {Rd.Name}" : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
158
Elwig/Models/PaymentDeliveryPart.cs
Normal file
158
Elwig/Models/PaymentDeliveryPart.cs
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Elwig.Models {
|
||||||
|
[Table("payment_delivery_part"), PrimaryKey("Year", "DId", "DPNr", "AvNr")]
|
||||||
|
public class PaymentDeliveryPart {
|
||||||
|
[Column("year")]
|
||||||
|
public int Year { get; set; }
|
||||||
|
|
||||||
|
[Column("did")]
|
||||||
|
public int DId { get; set; }
|
||||||
|
|
||||||
|
[Column("dpnr")]
|
||||||
|
public int DPNr { get; set; }
|
||||||
|
|
||||||
|
[Column("avnr")]
|
||||||
|
public int AvNr { get; set; }
|
||||||
|
|
||||||
|
[Column("mod_abs")]
|
||||||
|
public long ModAbsValue { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal ModAbs {
|
||||||
|
get => Variant.Season.DecFromDb(ModAbsValue);
|
||||||
|
set => ModAbsValue = Variant.Season.DecToDb(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("mod_rel")]
|
||||||
|
public double ModRelValue { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal ModRel {
|
||||||
|
get => (decimal)ModRelValue;
|
||||||
|
set => ModRelValue = (double)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("bucket_1")]
|
||||||
|
public int? Bucket1 { get; set; }
|
||||||
|
|
||||||
|
[Column("bucket_2")]
|
||||||
|
public int? Bucket2 { get; set; }
|
||||||
|
|
||||||
|
[Column("bucket_3")]
|
||||||
|
public int? Bucket3 { get; set; }
|
||||||
|
|
||||||
|
[Column("bucket_4")]
|
||||||
|
public int? Bucket4 { get; set; }
|
||||||
|
|
||||||
|
[Column("bucket_5")]
|
||||||
|
public int? Bucket5 { get; set; }
|
||||||
|
|
||||||
|
[Column("bucket_6")]
|
||||||
|
public int? Bucket6 { get; set; }
|
||||||
|
|
||||||
|
[Column("bucket_7")]
|
||||||
|
public int? Bucket7 { get; set; }
|
||||||
|
|
||||||
|
[Column("bucket_8")]
|
||||||
|
public int? Bucket8 { get; set; }
|
||||||
|
|
||||||
|
[Column("bucket_9")]
|
||||||
|
public int? Bucket9 { get; set; }
|
||||||
|
|
||||||
|
[NotMapped]
|
||||||
|
public int[] Buckets => (new int?[] { Bucket1, Bucket2, Bucket3, Bucket4, Bucket5, Bucket6, Bucket7, Bucket8, Bucket9 })
|
||||||
|
.Where(b => b != null).Select(b => b.Value).ToArray();
|
||||||
|
|
||||||
|
[Column("price_1")]
|
||||||
|
public long? Price1Value { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Price1 {
|
||||||
|
get => Price1Value != null ? Variant.Season.DecFromDb(Price1Value.Value) : null;
|
||||||
|
set => Price1Value = value != null ? Variant.Season.DecToDb(value.Value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("price_2")]
|
||||||
|
public long? Price2Value { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Price2 {
|
||||||
|
get => Price2Value != null ? Variant.Season.DecFromDb(Price2Value.Value) : null;
|
||||||
|
set => Price2Value = value != null ? Variant.Season.DecToDb(value.Value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("price_3")]
|
||||||
|
public long? Price3Value { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Price3 {
|
||||||
|
get => Price3Value != null ? Variant.Season.DecFromDb(Price3Value.Value) : null;
|
||||||
|
set => Price3Value = value != null ? Variant.Season.DecToDb(value.Value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("price_4")]
|
||||||
|
public long? Price4Value { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Price4 {
|
||||||
|
get => Price4Value != null ? Variant.Season.DecFromDb(Price4Value.Value) : null;
|
||||||
|
set => Price4Value = value != null ? Variant.Season.DecToDb(value.Value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("price_5")]
|
||||||
|
public long? Price5Value { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Price5 {
|
||||||
|
get => Price5Value != null ? Variant.Season.DecFromDb(Price5Value.Value) : null;
|
||||||
|
set => Price5Value = value != null ? Variant.Season.DecToDb(value.Value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("price_6")]
|
||||||
|
public long? Price6Value { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Price6 {
|
||||||
|
get => Price6Value != null ? Variant.Season.DecFromDb(Price6Value.Value) : null;
|
||||||
|
set => Price6Value = value != null ? Variant.Season.DecToDb(value.Value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("price_7")]
|
||||||
|
public long? Price7Value { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Price7 {
|
||||||
|
get => Price7Value != null ? Variant.Season.DecFromDb(Price7Value.Value) : null;
|
||||||
|
set => Price7Value = value != null ? Variant.Season.DecToDb(value.Value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("price_8")]
|
||||||
|
public long? Price8Value { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Price8 {
|
||||||
|
get => Price8Value != null ? Variant.Season.DecFromDb(Price8Value.Value) : null;
|
||||||
|
set => Price8Value = value != null ? Variant.Season.DecToDb(value.Value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("price_9")]
|
||||||
|
public long? Price9Value { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Price9 {
|
||||||
|
get => Price9Value != null ? Variant.Season.DecFromDb(Price9Value.Value) : null;
|
||||||
|
set => Price9Value = value != null ? Variant.Season.DecToDb(value.Value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Column("amount")]
|
||||||
|
public long? AmountValue { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal? Amount {
|
||||||
|
get => AmountValue != null ? Variant.Season.DecFromDb(AmountValue.Value) : null;
|
||||||
|
set => AmountValue = value != null ? Variant.Season.DecToDb(value.Value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[NotMapped]
|
||||||
|
public decimal[] Prices => (new decimal?[] { Price1, Price2, Price3, Price4, Price5, Price6, Price7, Price8, Price9 })
|
||||||
|
.Where(p => p != null).Select(p => p.Value).ToArray();
|
||||||
|
|
||||||
|
[ForeignKey("Year, AvNr")]
|
||||||
|
public virtual PaymentVar Variant { get; private set; }
|
||||||
|
|
||||||
|
[ForeignKey("Year, DId, DPNr")]
|
||||||
|
public virtual DeliveryPart DeliveryPart { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace Elwig.Models {
|
namespace Elwig.Models {
|
||||||
[Table("payment_member"), PrimaryKey("Year", "AvNr", "MgNr"), Index("Year", "TgNr", IsUnique = true)]
|
[Table("payment_member"), PrimaryKey("Year", "AvNr", "MgNr")]
|
||||||
public class PaymentMember {
|
public class PaymentMember {
|
||||||
[Column("year")]
|
[Column("year")]
|
||||||
public int Year { get; set; }
|
public int Year { get; set; }
|
||||||
@@ -16,9 +16,6 @@ namespace Elwig.Models {
|
|||||||
[Column("amount")]
|
[Column("amount")]
|
||||||
public long AmountValue { get; set; }
|
public long AmountValue { get; set; }
|
||||||
|
|
||||||
[Column("tgnr")]
|
|
||||||
public int? TgNr { get; set; }
|
|
||||||
|
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public decimal Amount {
|
public decimal Amount {
|
||||||
get => Variant.Season.DecFromDb(AmountValue);
|
get => Variant.Season.DecFromDb(AmountValue);
|
||||||
@@ -30,5 +27,8 @@ namespace Elwig.Models {
|
|||||||
|
|
||||||
[ForeignKey("MgNr")]
|
[ForeignKey("MgNr")]
|
||||||
public virtual Member Member { get; private set; }
|
public virtual Member Member { get; private set; }
|
||||||
|
|
||||||
|
[InverseProperty("Payment")]
|
||||||
|
public virtual Credit? Credit { get; private set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace Elwig.Models {
|
namespace Elwig.Models {
|
||||||
[Table("payment_variant"), PrimaryKey("Year", "AvNr")]
|
[Table("payment_variant"), PrimaryKey("Year", "AvNr")]
|
||||||
@@ -66,6 +67,10 @@ namespace Elwig.Models {
|
|||||||
[Column("bucket_9_name")]
|
[Column("bucket_9_name")]
|
||||||
public string? Bucket9Name { get; set; }
|
public string? Bucket9Name { get; set; }
|
||||||
|
|
||||||
|
[NotMapped]
|
||||||
|
public string[] BucketNames => (new string?[] { Bucket1Name, Bucket2Name, Bucket3Name, Bucket4Name, Bucket5Name, Bucket6Name, Bucket7Name, Bucket8Name, Bucket9Name })
|
||||||
|
.Where(n => n != null).Select(n => n ?? "").ToArray();
|
||||||
|
|
||||||
[Column("comment")]
|
[Column("comment")]
|
||||||
public string? Comment { get; set; }
|
public string? Comment { get; set; }
|
||||||
|
|
||||||
@@ -77,5 +82,8 @@ namespace Elwig.Models {
|
|||||||
|
|
||||||
[InverseProperty("Variant")]
|
[InverseProperty("Variant")]
|
||||||
public virtual ISet<PaymentMember> MemberPayments { get; private set; }
|
public virtual ISet<PaymentMember> MemberPayments { get; private set; }
|
||||||
|
|
||||||
|
[InverseProperty("Variant")]
|
||||||
|
public virtual ISet<Credit> Credits { get; private set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
<MenuItem Header="Über"/>
|
<MenuItem Header="Über"/>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Grid Height="100" VerticalAlignment="Top" Margin="0,25,0,0">
|
<Grid Height="100" VerticalAlignment="Top" Margin="25,25,0,0">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="100"/>
|
<ColumnDefinition Width="100"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
@@ -40,24 +40,18 @@
|
|||||||
|
|
||||||
<Button x:Name="MemberAdminButton" Content="Mitglieder" Click="MemberAdminButton_Click"
|
<Button x:Name="MemberAdminButton" Content="Mitglieder" Click="MemberAdminButton_Click"
|
||||||
Margin="50,160,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
Margin="50,160,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
<Button x:Name="MemberListButton" Content="Mitgliederliste" Click="MemberListButton_Click"
|
|
||||||
Margin="50,200,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
|
||||||
<Button x:Name="ReceiptButton" Content="Übernahme" Click="ReceiptButton_Click"
|
<Button x:Name="ReceiptButton" Content="Übernahme" Click="ReceiptButton_Click"
|
||||||
Margin="50,240,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
Margin="50,200,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
<Button x:Name="DeliveryAdminButton" Content="Lieferungen" Click="DeliveryAdminButton_Click"
|
<Button x:Name="DeliveryAdminButton" Content="Lieferungen" Click="DeliveryAdminButton_Click"
|
||||||
|
Margin="50,240,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
|
<Button x:Name="PaymentWindowButton" Content="Auszahlung" Click="PaymentWindowButton_Click"
|
||||||
Margin="50,280,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
Margin="50,280,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
<Button x:Name="DeliveryListButton" Content="Lieferungungen" Click="DeliveryListButton_Click" IsEnabled="False"
|
<Button x:Name="BaseDataButton" Content="Stammdaten" Click="BaseDataButton_Click"
|
||||||
Margin="50,320,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
Margin="50,320,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
|
|
||||||
<Button x:Name="BaseDataButton" Content="Stammdaten" Click="BaseDataButton_Click"
|
|
||||||
Margin="260,160,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
|
||||||
<Button x:Name="PdfButton" Content="PDF Erzeugen" Click="PdfButton_Click" Tag="Print"
|
|
||||||
Margin="260,200,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
|
||||||
<Button x:Name="TestWindowButton" Content="Test Fenster" Click="TestWindowButton_Click"
|
<Button x:Name="TestWindowButton" Content="Test Fenster" Click="TestWindowButton_Click"
|
||||||
Margin="260,240,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
|
||||||
<Button x:Name="QueryWindowButton" Content="Datenbankabfragen" Click="QueryWindowButton_Click"
|
|
||||||
Margin="260,280,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
Margin="260,280,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
<Button x:Name="PaymentWindowButton" Content="Auszahlung" Click="PaymentWindowButton_Click"
|
<Button x:Name="QueryWindowButton" Content="Datenbankabfragen" Click="QueryWindowButton_Click"
|
||||||
Margin="260,320,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
Margin="260,320,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
|
|||||||
@@ -1,9 +1,4 @@
|
|||||||
using System.Linq;
|
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
|
||||||
using Elwig.Documents;
|
|
||||||
using Elwig.Helpers;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
|
|
||||||
namespace Elwig.Windows {
|
namespace Elwig.Windows {
|
||||||
public partial class MainWindow : Window {
|
public partial class MainWindow : Window {
|
||||||
@@ -12,9 +7,7 @@ namespace Elwig.Windows {
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_Loaded(object sender, RoutedEventArgs evt) {
|
private void Window_Loaded(object sender, RoutedEventArgs evt) { }
|
||||||
PdfButton.IsEnabled = App.IsPrintingReady;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void MemberAdminButton_Click(object sender, RoutedEventArgs evt) {
|
private void MemberAdminButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
var w = new MemberAdminWindow();
|
var w = new MemberAdminWindow();
|
||||||
@@ -40,15 +33,6 @@ namespace Elwig.Windows {
|
|||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void PdfButton_Click(object sender, RoutedEventArgs evt) {
|
|
||||||
Mouse.OverrideCursor = Cursors.Wait;
|
|
||||||
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 void TestWindowButton_Click(object sender, RoutedEventArgs evt) {
|
private void TestWindowButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
var w = new TestWindow();
|
var w = new TestWindow();
|
||||||
w.Show();
|
w.Show();
|
||||||
|
|||||||
@@ -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">
|
Title="Test Fenster - Elwig" MinHeight="400" MinWidth="325" Height="450" Width="800" ResizeMode="CanResize" Loaded="Window_Loaded">
|
||||||
<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}"
|
||||||
@@ -18,5 +18,10 @@
|
|||||||
<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"
|
<Button x:Name="ChartButton" Content="Chart" Click="ChartButton_Click"
|
||||||
Margin="50,240,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
Margin="50,240,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
|
|
||||||
|
<Button x:Name="PdfDeliveryButton" Content="Lieferschein Erzeugen" Click="PdfDeliveryButton_Click" Tag="Print"
|
||||||
|
Margin="260,190,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
|
<Button x:Name="PdfCreditButton" Content="Gutschrift Erzeugen" Click="PdfCreditButton_Click" Tag="Print"
|
||||||
|
Margin="260,160,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
|
|||||||
@@ -1,16 +1,26 @@
|
|||||||
|
using Elwig.Documents;
|
||||||
|
using Elwig.Helpers;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
using System.Windows.Input;
|
||||||
using Xceed.Wpf.Toolkit.Primitives;
|
using Xceed.Wpf.Toolkit.Primitives;
|
||||||
|
|
||||||
namespace Elwig.Windows {
|
namespace Elwig.Windows {
|
||||||
public partial class TestWindow : Window {
|
public partial class TestWindow : Window {
|
||||||
|
|
||||||
public TestWindow() {
|
public TestWindow() {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
MyComboBox.ItemsSource = new string[] { "Klasse A" , "Klasse B", "Klasse C", "Klasse D", "Klasse E", "Klasse F" };
|
MyComboBox.ItemsSource = new string[] { "Klasse A" , "Klasse B", "Klasse C", "Klasse D", "Klasse E", "Klasse F" };
|
||||||
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>());
|
||||||
}
|
}
|
||||||
@@ -39,5 +49,23 @@ namespace Elwig.Windows {
|
|||||||
var w = new ChartWindow();
|
var w = new ChartWindow();
|
||||||
w.Show();
|
w.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void PdfDeliveryButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
Mouse.OverrideCursor = Cursors.Wait;
|
||||||
|
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.Wait;
|
||||||
|
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