From 298e423de8a87d3659d979c563020b828740431e Mon Sep 17 00:00:00 2001
From: Lorenz Stechauner <lorenz.stechauner@necronda.net>
Date: Fri, 15 Mar 2024 15:05:15 +0100
Subject: [PATCH] [#43] Billing: Do only use AppDbContext short-lived

---
 Elwig/Helpers/Billing/Billing.cs        | 19 ++++++++++---------
 Elwig/Helpers/Billing/BillingVariant.cs |  6 ++++--
 2 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/Elwig/Helpers/Billing/Billing.cs b/Elwig/Helpers/Billing/Billing.cs
index 506ccb9..c99bb61 100644
--- a/Elwig/Helpers/Billing/Billing.cs
+++ b/Elwig/Helpers/Billing/Billing.cs
@@ -1,5 +1,6 @@
 using Elwig.Models.Entities;
 using Microsoft.Data.Sqlite;
+using Microsoft.EntityFrameworkCore;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -9,7 +10,6 @@ namespace Elwig.Helpers.Billing {
     public class Billing {
 
         protected readonly int Year;
-        protected readonly AppDbContext Context;
         protected readonly Season Season;
         protected readonly Dictionary<string, string> Attributes;
         protected readonly Dictionary<string, (decimal?, decimal?)> Modifiers;
@@ -17,11 +17,11 @@ namespace Elwig.Helpers.Billing {
 
         public Billing(int year) {
             Year = year;
-            Context = new AppDbContext();
-            Season = Context.Seasons.Find(Year)!;
-            Attributes = Context.WineAttributes.ToDictionary(a => a.AttrId, a => a.Name);
-            Modifiers = Context.Modifiers.Where(m => m.Year == Year).ToDictionary(m => m.ModId, m => (m.Abs, m.Rel));
-            AreaComTypes = Context.AreaCommitmentTypes.ToDictionary(v => v.VtrgId, v => (v.SortId, v.AttrId, v.Discriminator, v.MinKgPerHa, v.PenaltyAmount));
+            using var ctx = new AppDbContext();
+            Season = ctx.Seasons.Find(Year)!;
+            Attributes = ctx.WineAttributes.ToDictionary(a => a.AttrId, a => a.Name);
+            Modifiers = ctx.Modifiers.Where(m => m.Year == Year).Include(m => m.Season).ToDictionary(m => m.ModId, m => (m.Abs, m.Rel));
+            AreaComTypes = ctx.AreaCommitmentTypes.ToDictionary(v => v.VtrgId, v => (v.SortId, v.AttrId, v.Discriminator, v.MinKgPerHa, v.PenaltyAmount));
         }
 
         public async Task FinishSeason() {
@@ -51,14 +51,15 @@ namespace Elwig.Helpers.Billing {
             bool? avoidUnderDeliveries = null,
             SqliteConnection? cnx = null
          ) {
+            using var ctx = new AppDbContext();
             var honorGebunden = honorGebundenField ?? Season.Billing_HonorGebunden;
             var allowAttrsIntoLower = allowAttributesIntoLower ?? Season.Billing_AllowAttrsIntoLower;
             var avoidUnderDlvrs = avoidUnderDeliveries ?? Season.Billing_AvoidUnderDeliveries;
-            var attrVals = Context.WineAttributes.ToDictionary(a => a.AttrId, a => (a.IsStrict, a.FillLower));
+            var attrVals = ctx.WineAttributes.ToDictionary(a => a.AttrId, a => (a.IsStrict, a.FillLower));
             var attrForced = attrVals.Where(a => a.Value.IsStrict && a.Value.FillLower == 0).Select(a => a.Key).ToArray();
             var ownCnx = cnx == null;
             cnx ??= await AppDbContext.ConnectAsync();
-            await Context.GetMemberAreaCommitmentBuckets(Year, 0, cnx);
+            await ctx.GetMemberAreaCommitmentBuckets(Year, 0, cnx);
             var inserts = new List<(int, int, int, string, int)>();
 
             var deliveries = new List<(int, int, int, string, int, double, string, string?, string[], bool?)>();
@@ -87,7 +88,7 @@ namespace Elwig.Helpers.Billing {
             Dictionary<string, int> used = [];
             foreach (var (mgnr, did, dpnr, sortid, weight, kmw, qualid, attrid, modifiers, gebunden) in deliveries) {
                 if (lastMgNr != mgnr) {
-                    rightsAndObligations = await Context.GetMemberAreaCommitmentBuckets(Year, mgnr);
+                    rightsAndObligations = await ctx.GetMemberAreaCommitmentBuckets(Year, mgnr);
                     used = [];
                 }
                 if ((honorGebunden && gebunden == false) ||
diff --git a/Elwig/Helpers/Billing/BillingVariant.cs b/Elwig/Helpers/Billing/BillingVariant.cs
index 07b2206..783b8f6 100644
--- a/Elwig/Helpers/Billing/BillingVariant.cs
+++ b/Elwig/Helpers/Billing/BillingVariant.cs
@@ -1,5 +1,6 @@
 using Elwig.Models.Entities;
 using Microsoft.Data.Sqlite;
+using Microsoft.EntityFrameworkCore;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -14,8 +15,9 @@ namespace Elwig.Helpers.Billing {
 
         public BillingVariant(int year, int avnr) : base(year) {
             AvNr = avnr;
-            PaymentVariant = Context.PaymentVariants.Find(Year, AvNr) ?? throw new ArgumentException("PaymentVar not found");
-            Data = PaymentBillingData.FromJson(PaymentVariant.Data, Utils.GetVaributes(Context, Year, onlyDelivered: false));
+            using var ctx = new AppDbContext();
+            PaymentVariant = ctx.PaymentVariants.Include(v => v.Season).Where(v => v.Year == Year && v.AvNr == AvNr).Single() ?? throw new ArgumentException("PaymentVar not found");
+            Data = PaymentBillingData.FromJson(PaymentVariant.Data, Utils.GetVaributes(ctx, Year, onlyDelivered: false));
         }
 
         public async Task Calculate(bool? honorGebunden = null, bool? allowAttrsIntoLower = null, bool? avoidUnderDeliveries = null) {