Documents: Replace Razor templates with iText
All checks were successful
Test / Run tests (push) Successful in 2m24s
All checks were successful
Test / Run tests (push) Successful in 2m24s
This commit is contained in:
@@ -654,92 +654,100 @@ namespace Elwig.Windows {
|
||||
CancelGeneration?.Dispose();
|
||||
CancelGeneration = new();
|
||||
|
||||
using var ctx = new AppDbContext();
|
||||
try {
|
||||
var doublePaged = DoublePagedInput.IsChecked == true;
|
||||
var location = PostalLocation.Text.Trim();
|
||||
var docs = SelectedDocs.OrderByDescending(d => d.Type).ToList();
|
||||
|
||||
var doublePaged = DoublePagedInput.IsChecked == true;
|
||||
var location = PostalLocation.Text.Trim();
|
||||
var docs = SelectedDocs.OrderByDescending(d => d.Type).ToList();
|
||||
|
||||
IEnumerable<Member> recipients = Recipients;
|
||||
if (OrderMgNrInput.IsChecked == true) {
|
||||
recipients = recipients
|
||||
.OrderBy(m => m.MgNr)
|
||||
.ToList();
|
||||
} else if (OrderNameInput.IsChecked == true) {
|
||||
recipients = recipients
|
||||
.OrderBy(m => m.Name)
|
||||
.ThenBy(m => m.GivenName)
|
||||
.ThenBy(m => m.MgNr)
|
||||
.ToList();
|
||||
} else if (OrderPlzInput.IsChecked == true) {
|
||||
if (docs.Any(d => d.Type == DocType.DeliveryConfirmation || d.Type == DocType.CreditNote)) {
|
||||
IEnumerable<Member> recipients = Recipients;
|
||||
if (OrderMgNrInput.IsChecked == true) {
|
||||
recipients = recipients
|
||||
.OrderBy(m => m.BillingAddress?.PostalDest.AtPlz?.Plz ?? m.PostalDest.AtPlz?.Plz)
|
||||
.ThenBy(m => m.BillingAddress?.PostalDest.AtPlz?.Ort.Name ?? m.PostalDest.AtPlz?.Ort.Name)
|
||||
.ThenBy(m => m.Name)
|
||||
.ThenBy(m => m.GivenName)
|
||||
.ThenBy(m => m.MgNr)
|
||||
.ToList();
|
||||
} else {
|
||||
recipients = recipients
|
||||
.OrderBy(m => m.PostalDest.AtPlz?.Plz)
|
||||
.ThenBy(m => m.PostalDest.AtPlz?.Ort.Name)
|
||||
.ThenBy(m => m.Name)
|
||||
.OrderBy(m => m.MgNr)
|
||||
.ToList();
|
||||
} else if (OrderNameInput.IsChecked == true) {
|
||||
recipients = recipients
|
||||
.OrderBy(m => m.Name)
|
||||
.ThenBy(m => m.GivenName)
|
||||
.ThenBy(m => m.MgNr)
|
||||
.ToList();
|
||||
} else if (OrderPlzInput.IsChecked == true) {
|
||||
if (docs.Any(d => d.Type == DocType.DeliveryConfirmation || d.Type == DocType.CreditNote)) {
|
||||
recipients = recipients
|
||||
.OrderBy(m => m.BillingAddress?.PostalDest.AtPlz?.Plz ?? m.PostalDest.AtPlz?.Plz)
|
||||
.ThenBy(m => m.BillingAddress?.PostalDest.AtPlz?.Ort.Name ?? m.PostalDest.AtPlz?.Ort.Name)
|
||||
.ThenBy(m => m.Name)
|
||||
.ThenBy(m => m.GivenName)
|
||||
.ThenBy(m => m.MgNr)
|
||||
.ToList();
|
||||
} else {
|
||||
recipients = recipients
|
||||
.OrderBy(m => m.PostalDest.AtPlz?.Plz)
|
||||
.ThenBy(m => m.PostalDest.AtPlz?.Ort.Name)
|
||||
.ThenBy(m => m.Name)
|
||||
.ThenBy(m => m.GivenName)
|
||||
.ThenBy(m => m.MgNr)
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
var postalDate = DateOnly.ParseExact(PostalDate.Text, "dd.MM.yyyy");
|
||||
var printMode = PostalAllInput.IsChecked == true ? 3 : PostalWishInput.IsChecked == true ? 2 : PostalNoEmailInput.IsChecked == true ? 1 : 0;
|
||||
var emailMode = EmailAllInput.IsChecked == true ? 2 : EmailWishInput.IsChecked == true ? 1 : 0;
|
||||
|
||||
var hasPreviewDocs = await Task.Run(async () => await GenerateDocuments(doublePaged, location, docs, recipients, postalDate, printMode, emailMode));
|
||||
PreviewButton.IsEnabled = true;
|
||||
PrintButton.IsEnabled = PrintDocument != null && !hasPreviewDocs;
|
||||
EmailButton.IsEnabled = EmailDocuments != null && !hasPreviewDocs && App.Config.Smtp != null;
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.ToString(), "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
} finally {
|
||||
UnlockInputs();
|
||||
GenerateButton.IsEnabled = true;
|
||||
GenerateButton.Visibility = Visibility.Visible;
|
||||
AbortButton.IsEnabled = false;
|
||||
AbortButton.Visibility = Visibility.Hidden;
|
||||
Mouse.OverrideCursor = null;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<bool> GenerateDocuments(bool doublePaged, string location, List<SelectedDoc> docs, IEnumerable<Member> recipients, DateOnly postalDate, int printMode, int emailMode) {
|
||||
App.MainDispatcher.Invoke(() => {
|
||||
ProgressBar.Value = 0.0;
|
||||
});
|
||||
using var ctx = new AppDbContext();
|
||||
|
||||
Dictionary<int, IDictionary<int, DeliveryConfirmationDeliveryData>> dcData = [];
|
||||
Dictionary<(int, int), (IDictionary<int, CreditNoteDeliveryData>, IDictionary<int, PaymentMember>, BillingData)> cnData = [];
|
||||
foreach (var doc in docs) {
|
||||
if (doc.Type == DocType.DeliveryConfirmation) {
|
||||
var year = (int)doc.Details!;
|
||||
|
||||
try {
|
||||
var b = new Billing(year);
|
||||
await b.FinishSeason();
|
||||
await b.CalculateBuckets();
|
||||
App.HintContextChange();
|
||||
|
||||
dcData[year] = await DeliveryConfirmationDeliveryData.ForSeason(ctx.DeliveryParts, year);
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
UnlockInputs();
|
||||
GenerateButton.IsEnabled = true;
|
||||
GenerateButton.Visibility = Visibility.Visible;
|
||||
AbortButton.IsEnabled = false;
|
||||
AbortButton.Visibility = Visibility.Hidden;
|
||||
Mouse.OverrideCursor = null;
|
||||
return;
|
||||
}
|
||||
var b = new Billing(year);
|
||||
await b.FinishSeason();
|
||||
await b.CalculateBuckets();
|
||||
App.HintContextChange();
|
||||
dcData[year] = await DeliveryConfirmationDeliveryData.ForSeason(ctx.DeliveryParts, year);
|
||||
} else if (doc.Type == DocType.CreditNote) {
|
||||
var details = ((int, int))doc.Details!;
|
||||
var year = details.Item1;
|
||||
var avnr = details.Item2;
|
||||
try {
|
||||
cnData[(year, avnr)] = (
|
||||
await CreditNoteDeliveryData.ForPaymentVariant(ctx.CreditNoteDeliveryRows, ctx.PaymentVariants, year, avnr),
|
||||
await ctx.MemberPayments.Where(p => p.Year == year && p.AvNr == avnr).ToDictionaryAsync(c => c.MgNr),
|
||||
BillingData.FromJson((await ctx.PaymentVariants.FindAsync(year, avnr))!.Data)
|
||||
);
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
UnlockInputs();
|
||||
GenerateButton.IsEnabled = true;
|
||||
GenerateButton.Visibility = Visibility.Visible;
|
||||
AbortButton.IsEnabled = false;
|
||||
AbortButton.Visibility = Visibility.Hidden;
|
||||
Mouse.OverrideCursor = null;
|
||||
return;
|
||||
}
|
||||
cnData[(year, avnr)] = (
|
||||
await CreditNoteDeliveryData.ForPaymentVariant(ctx.CreditNoteDeliveryRows, ctx.PaymentVariants, year, avnr),
|
||||
await ctx.MemberPayments.Where(p => p.Year == year && p.AvNr == avnr).ToDictionaryAsync(c => c.MgNr),
|
||||
BillingData.FromJson((await ctx.PaymentVariants.FindAsync(year, avnr))!.Data)
|
||||
);
|
||||
await ctx.GetMemberAreaCommitmentBuckets(year, 0);
|
||||
}
|
||||
}
|
||||
|
||||
var postalDate = DateOnly.ParseExact(PostalDate.Text, "dd.MM.yyyy");
|
||||
var memberDocs = recipients.Select(m => new {
|
||||
var (printNum, emailNum) = App.MainDispatcher.Invoke(() => {
|
||||
double printNum = printMode == 3 ? PostalAllCount : printMode == 2 ? PostalWishCount : printMode == 1 ? PostalNoEmailCount : 0;
|
||||
double emailNum = emailMode == 2 ? EmailAllCount : emailMode == 1 ? EmailWishCount : 0;
|
||||
return (printNum, emailNum);
|
||||
});
|
||||
double totalNum = printNum + emailNum + recipients.Count() / 2;
|
||||
double offset = 0;
|
||||
|
||||
var memberDocs = recipients.Select((m, i) => new {
|
||||
Member = m,
|
||||
Docs = docs.SelectMany<SelectedDoc, GeneratedDoc>(doc => {
|
||||
try {
|
||||
@@ -781,34 +789,24 @@ namespace Elwig.Windows {
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
return [];
|
||||
} finally {
|
||||
App.MainDispatcher.Invoke(() => {
|
||||
ProgressBar.Value = offset + 100.0 * (i + 1) / 2 / totalNum;
|
||||
});
|
||||
}
|
||||
}).ToList()
|
||||
}).ToList();
|
||||
offset += 100.0 * memberDocs.Count / 2 / totalNum;
|
||||
|
||||
var hasPreviewDocs = memberDocs.Any(m => m.Docs.Any(d => d.Doc.IsPreview));
|
||||
if (hasPreviewDocs) {
|
||||
var res = MessageBox.Show("Einige der ausgewählten Dokumente sind nur als vorläufig zu betrachten und können daher nicht verschickt/ausgedruckt werden!\n\nDies könnte an einer noch nicht festgesetzen Auszahlungsvariante liegen oder daran, dass nicht alle Adressaten/Empfänger eine Traubengutschrift erhalten\n(\"Empfänger von Gutschriften\").\n\nSoll mit dem Generieren fortgefahren werden?",
|
||||
"Vorläufige Dokumente", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
|
||||
if (res != MessageBoxResult.OK) {
|
||||
UnlockInputs();
|
||||
GenerateButton.IsEnabled = true;
|
||||
GenerateButton.Visibility = Visibility.Visible;
|
||||
AbortButton.IsEnabled = false;
|
||||
AbortButton.Visibility = Visibility.Hidden;
|
||||
Mouse.OverrideCursor = null;
|
||||
return;
|
||||
throw new OperationCanceledException("Dokumentenerzeugung abgebrochen!");
|
||||
}
|
||||
}
|
||||
|
||||
var printMode = PostalAllInput.IsChecked == true ? 3 :
|
||||
PostalWishInput.IsChecked == true ? 2 :
|
||||
PostalNoEmailInput.IsChecked == true ? 1 : 0;
|
||||
var emailMode = EmailAllInput.IsChecked == true ? 2 : EmailWishInput.IsChecked == true ? 1 : 0;
|
||||
|
||||
double printNum = printMode == 3 ? PostalAllCount : printMode == 2 ? PostalWishCount : printMode == 1 ? PostalNoEmailCount : 0;
|
||||
double emailNum = emailMode == 2 ? EmailAllCount : emailMode == 1 ? EmailWishCount : 0;
|
||||
double totalNum = printNum + emailNum;
|
||||
|
||||
var email = memberDocs
|
||||
.Where(d => d.Member.EmailAddresses.Count > 0 && (emailMode == 2 || (emailMode == 1 && d.Member.ContactViaEmail)))
|
||||
.ToDictionary(d => d.Member, m => {
|
||||
@@ -823,27 +821,16 @@ namespace Elwig.Windows {
|
||||
return docs;
|
||||
});
|
||||
var emailRecipients = email.Select(d => d.Key.MgNr).ToHashSet();
|
||||
try {
|
||||
foreach (var item1 in email.Select((e, i) => new { Index = i, e.Key, e.Value })) {
|
||||
foreach (var item2 in item1.Value.Select((d, i) => new { Index = i, Doc = d })) {
|
||||
await item2.Doc.Generate(CancelGeneration.Token, new Progress<double>(v => {
|
||||
ProgressBar.Value = v * (item2.Index + 1) / item1.Value.Count / totalNum + 100.0 * item1.Index / totalNum;
|
||||
}));
|
||||
}
|
||||
foreach (var item1 in email.Select((e, i) => new { Index = i, e.Key, e.Value })) {
|
||||
foreach (var item2 in item1.Value.Select((d, i) => new { Index = i, Doc = d })) {
|
||||
await item2.Doc.Generate(CancelGeneration?.Token, new Progress<double>(v => App.MainDispatcher.Invoke(() => {
|
||||
ProgressBar.Value = offset + v * (item2.Index + 1) / item1.Value.Count / totalNum + 100.0 * item1.Index / totalNum;
|
||||
})));
|
||||
}
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
UnlockInputs();
|
||||
GenerateButton.IsEnabled = true;
|
||||
GenerateButton.Visibility = Visibility.Visible;
|
||||
AbortButton.IsEnabled = false;
|
||||
AbortButton.Visibility = Visibility.Hidden;
|
||||
Mouse.OverrideCursor = null;
|
||||
return;
|
||||
}
|
||||
if (email.Count > 0) {
|
||||
if (email.Count > 0)
|
||||
EmailDocuments = email;
|
||||
}
|
||||
offset += 100.0 * email.Count / totalNum;
|
||||
|
||||
var printMemberDocs = memberDocs
|
||||
.Where(d =>
|
||||
@@ -869,39 +856,20 @@ namespace Elwig.Windows {
|
||||
.ToList();
|
||||
|
||||
if (printDocs.Count > 0) {
|
||||
try {
|
||||
var print = Document.Merge(printDocs);
|
||||
print.IsDoublePaged = doublePaged;
|
||||
await print.Generate(CancelGeneration.Token, new Progress<double>(v => {
|
||||
ProgressBar.Value = 100.0 * emailNum / totalNum + v * printNum / totalNum;
|
||||
}));
|
||||
PrintDocument = print;
|
||||
PrintMemberDocuments = printMemberDocs.ToDictionary(m => m.Member, m => m.Docs.Select(d => d.Doc).ToList());
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
UnlockInputs();
|
||||
GenerateButton.IsEnabled = true;
|
||||
GenerateButton.Visibility = Visibility.Visible;
|
||||
AbortButton.IsEnabled = false;
|
||||
AbortButton.Visibility = Visibility.Hidden;
|
||||
Mouse.OverrideCursor = null;
|
||||
return;
|
||||
}
|
||||
var print = Document.Merge(printDocs);
|
||||
await print.Generate(CancelGeneration?.Token, new Progress<double>(v => App.MainDispatcher.Invoke(() => {
|
||||
ProgressBar.Value = offset + v * printNum / totalNum;
|
||||
})));
|
||||
PrintDocument = print;
|
||||
PrintMemberDocuments = printMemberDocs.ToDictionary(m => m.Member, m => m.Docs.Select(d => d.Doc).ToList());
|
||||
} else {
|
||||
PrintDocument = null;
|
||||
PrintMemberDocuments = null;
|
||||
}
|
||||
ProgressBar.Value = 100.0;
|
||||
|
||||
UnlockInputs();
|
||||
GenerateButton.IsEnabled = true;
|
||||
GenerateButton.Visibility = Visibility.Visible;
|
||||
AbortButton.IsEnabled = false;
|
||||
AbortButton.Visibility = Visibility.Hidden;
|
||||
Mouse.OverrideCursor = null;
|
||||
PreviewButton.IsEnabled = true;
|
||||
PrintButton.IsEnabled = PrintDocument != null && !hasPreviewDocs;
|
||||
EmailButton.IsEnabled = EmailDocuments != null && !hasPreviewDocs && App.Config.Smtp != null;
|
||||
App.MainDispatcher.Invoke(() => {
|
||||
ProgressBar.Value = 100.0;
|
||||
});
|
||||
return hasPreviewDocs;
|
||||
}
|
||||
|
||||
private async void PreviewButton_Click(object sender, RoutedEventArgs evt) {
|
||||
|
||||
Reference in New Issue
Block a user