diff --git a/Tests/HelperTests/BillingTest.cs b/Tests/HelperTests/BillingTest.cs index c0c5c3d..526df46 100644 --- a/Tests/HelperTests/BillingTest.cs +++ b/Tests/HelperTests/BillingTest.cs @@ -7,9 +7,18 @@ namespace Tests.HelperTests { [TestFixture] public class BillingTest { - private const int Year1 = 2020, Year2 = 2020; + private const int Year1 = 2020, Year2 = 2021; private const int MgNr1 = 101, MgNr2 = 102, MgNr3 = 103, MgNr4 = 104; + private const decimal + GV_ungeb = 0.50m, + GV_geb = 0.60m, + GVB_ungeb = 0.54m, + GVB_geb = 0.64m, + GVK_ungeb = 0.61m, + GVK_geb = 0.71m, + WEI = 0.10m; + private SqliteConnection? Connection; [OneTimeSetUp] @@ -26,6 +35,40 @@ namespace Tests.HelperTests { Connection = null; } + [SetUp] + public async Task CreatePaymentVariant() { + var json = """ + { + "mode": "elwig", + "version": 1, + "payment": { + "GV/": "curve:0", + "GV/B": "curve:1", + "GV/K": "curve:2" + }, + "quality": {"WEI": 0.1}, + "curves": [{ + "id": 0, + "mode": "oe", + "data": {"15kmw": 0.5}, + "geb": 0.1 + }, { + "id": 1, + "mode": "oe", + "data": {"15kmw": 0.54}, + "geb": 0.1 + }, { + "id": 2, + "mode": "oe", + "data": {"15kmw": 0.61}, + "geb": 0.1 + }] + } + """; + await InsertPaymentVariant(Year1, 1, json); + await InsertPaymentVariant(Year2, 1, json); + } + [TearDown] public async Task CleanupDatabasePayment() { if (Connection == null) return; @@ -51,11 +94,11 @@ namespace Tests.HelperTests { return ctx.GetMemberPaymentBuckets(year, mgnr, Connection); } - private async Task> GetMemberDeliveryPrices(int year, int mgnr) { - var buckets = new Dictionary<(string, string), int>(); + private async Task> GetMemberDeliveryPrices(int year, int mgnr) { + var buckets = new Dictionary<(string, string), (int, decimal)>(); using (var cmd = Connection!.CreateCommand()) { cmd.CommandText = $""" - SELECT lsnr || '/' || d.dpnr, d.sortid || b.discr, price + SELECT lsnr || '/' || d.dpnr, d.sortid || b.discr, b.value, p.price FROM v_delivery d LEFT JOIN payment_delivery_part_bucket p ON (p.year, p.did, p.dpnr) = (d.year, d.did, d.dpnr) LEFT JOIN delivery_part_bucket b ON (b.year, b.did, b.dpnr, b.bktnr) = (p.year, p.did, p.dpnr, p.bktnr) @@ -65,7 +108,7 @@ namespace Tests.HelperTests { while (await reader.ReadAsync()) { var lsnr = reader.GetString(0); var bucket = reader.GetString(1); - buckets[(lsnr, bucket)] = reader.GetInt32(2); + buckets[(lsnr, bucket)] = (reader.GetInt32(2), Utils.DecFromDb(reader.GetInt32(3), 4)); } } return buckets; @@ -81,34 +124,6 @@ namespace Tests.HelperTests { [Test] public async Task Test_01_NoActiveAreaComs() { int mgnr = MgNr1, year = Year1; - await InsertPaymentVariant(year, 1, """ - { - "mode": "elwig", - "version": 1, - "payment": { - "GV/": "curve:0", - "GV/B": "curve:1", - "GV/K": "curve:2" - }, - "quality": {"WEI": 0.1}, - "curves": [{ - "id": 0, - "mode": "oe", - "data": {"15kmw": 0.5}, - "geb": 0.1 - }, { - "id": 1, - "mode": "oe", - "data": {"15kmw": 0.54}, - "geb": 0.1 - }, { - "id": 2, - "mode": "oe", - "data": {"15kmw": 0.61}, - "geb": 0.1 - }] - } - """); var areaCom = await GetMemberAreaCommitmentBuckets(year, mgnr); Assert.That(areaCom, Is.Empty); @@ -133,25 +148,117 @@ namespace Tests.HelperTests { var prices = await GetMemberDeliveryPrices(year, mgnr); Assert.Multiple(() => { Assert.That(prices, Has.Count.EqualTo(6)); - Assert.That(prices[("20201001X001/1", "GV_")], Is.EqualTo(0_6100)); - Assert.That(prices[("20201001X001/2", "GV_")], Is.EqualTo(0_5000)); - Assert.That(prices[("20201001X002/1", "GV_")], Is.EqualTo(0_5400)); - Assert.That(prices[("20201001X002/2", "GV_")], Is.EqualTo(0_5400)); - Assert.That(prices[("20201001X003/1", "GV_")], Is.EqualTo(0_1000)); - Assert.That(prices[("20201001X003/2", "GV_")], Is.EqualTo(0_5000)); + // Kabinett + Assert.That(prices[("20201001X001/1", "GV_")], Is.EqualTo((4_000, GV_ungeb))); + // ohne Attribut + Assert.That(prices[("20201001X001/2", "GV_")], Is.EqualTo((4_000, GV_ungeb))); + // Bio + Assert.That(prices[("20201001X002/1", "GV_")], Is.EqualTo((4_000, GVB_ungeb))); + // Bio + Assert.That(prices[("20201001X002/2", "GV_")], Is.EqualTo((4_000, GVB_ungeb))); + // ohne Attribut + Assert.That(prices[("20201001X003/1", "GV_")], Is.EqualTo(( 500, WEI))); + // ohne Attribut + Assert.That(prices[("20201001X003/2", "GV_")], Is.EqualTo(( 500, GV_ungeb))); }); } [Test] - [Ignore("Not implemented yet")] public async Task Test_02_SimpleNotStrictAreaComs() { - // TODO + int mgnr = MgNr1, year = Year2; + + var areaCom = await GetMemberAreaCommitmentBuckets(year, mgnr); + Assert.Multiple(() => { + Assert.That(areaCom, Has.Count.EqualTo(1)); + Assert.That(areaCom["GV"], Is.EqualTo(new AreaComBucket(10_000, 5_000, 10_000))); + }); + var delivery = await GetMemberDeliveryBuckets(year, mgnr); + Assert.Multiple(() => { + Assert.That(delivery, Has.Count.EqualTo(4)); + Assert.That(delivery["GV"], Is.EqualTo(16_000)); + Assert.That(delivery["GV_"], Is.EqualTo( 1_000)); + Assert.That(delivery["GVB"], Is.EqualTo( 8_000)); + Assert.That(delivery["GVK"], Is.EqualTo( 4_000)); + }); + + BillingVariant b = new(year, 1); + await b.CalculateBuckets(false, false, false, Connection); + var payment = await GetMemberPaymentBuckets(year, mgnr); + Assert.Multiple(() => { + Assert.That(payment, Has.Count.EqualTo(2)); + Assert.That(payment["GV_"], Is.EqualTo( 7_000)); + Assert.That(payment["GV"], Is.EqualTo(10_000)); + }); + + await b.Calculate(false, false, false); + var prices = await GetMemberDeliveryPrices(year, mgnr); + Assert.Multiple(() => { + Assert.That(prices, Has.Count.EqualTo(10)); + // Kabinett + Assert.That(prices[("20211001X001/1", "GV_")], Is.EqualTo((2_000, GV_ungeb))); + Assert.That(prices[("20211001X001/1", "GV")] , Is.EqualTo((2_000, GV_geb))); + // ohne Attribut + Assert.That(prices[("20211001X001/2", "GV_")], Is.EqualTo((4_000, GV_ungeb))); + Assert.That(prices[("20211001X001/2", "GV")], Is.EqualTo(( 0, GV_geb))); + // Bio + Assert.That(prices[("20211001X002/1", "GV_")], Is.EqualTo(( 0, GVB_ungeb))); + Assert.That(prices[("20211001X002/1", "GV")], Is.EqualTo((4_000, GVB_geb))); + // Bio + Assert.That(prices[("20211001X002/2", "GV_")], Is.EqualTo(( 0, GVB_ungeb))); + Assert.That(prices[("20211001X002/2", "GV")], Is.EqualTo((4_000, GVB_geb))); + // ohne Attribut + Assert.That(prices[("20211001X003/1", "GV_")], Is.EqualTo(( 500, WEI))); + // ohne Attribut + Assert.That(prices[("20211001X003/2", "GV_")], Is.EqualTo(( 500, GV_ungeb))); + }); } [Test] - [Ignore("Not implemented yet")] public async Task Test_03_SimpleNotStrictAreaComs_HonorGebunden() { - // TODO + int mgnr = MgNr1, year = Year2; + + var areaCom = await GetMemberAreaCommitmentBuckets(year, mgnr); + Assert.Multiple(() => { + Assert.That(areaCom, Has.Count.EqualTo(1)); + Assert.That(areaCom["GV"], Is.EqualTo(new AreaComBucket(10_000, 5_000, 10_000))); + }); + var delivery = await GetMemberDeliveryBuckets(year, mgnr); + Assert.Multiple(() => { + Assert.That(delivery, Has.Count.EqualTo(4)); + Assert.That(delivery["GV"], Is.EqualTo(16_000)); + Assert.That(delivery["GV_"], Is.EqualTo( 1_000)); + Assert.That(delivery["GVB"], Is.EqualTo( 8_000)); + Assert.That(delivery["GVK"], Is.EqualTo( 4_000)); + }); + + BillingVariant b = new(year, 1); + await b.CalculateBuckets(true, false, false, Connection); + var payment = await GetMemberPaymentBuckets(year, mgnr); + Assert.Multiple(() => { + Assert.That(payment, Has.Count.EqualTo(2)); + Assert.That(payment["GV_"], Is.EqualTo(9_000)); + Assert.That(payment["GV"], Is.EqualTo(8_000)); + }); + + await b.Calculate(true, false, false); + var prices = await GetMemberDeliveryPrices(year, mgnr); + Assert.Multiple(() => { + Assert.That(prices, Has.Count.EqualTo(8)); + // Kabinett + Assert.That(prices[("20211001X001/1", "GV_")], Is.EqualTo(( 0, GV_ungeb))); + Assert.That(prices[("20211001X001/1", "GV")], Is.EqualTo((4_000, GV_geb))); + // ohne Attribut + Assert.That(prices[("20211001X001/2", "GV_")], Is.EqualTo((4_000, GV_ungeb))); + // Bio + Assert.That(prices[("20211001X002/1", "GV_")], Is.EqualTo(( 0, GVB_ungeb))); + Assert.That(prices[("20211001X002/1", "GV")], Is.EqualTo((4_000, GVB_geb))); + // Bio + Assert.That(prices[("20211001X002/2", "GV_")], Is.EqualTo((4_000, GVB_ungeb))); + // ohne Attribut + Assert.That(prices[("20211001X003/1", "GV_")], Is.EqualTo(( 500, WEI))); + // ohne Attribut + Assert.That(prices[("20211001X003/2", "GV_")], Is.EqualTo(( 500, GV_ungeb))); + }); } [Test] diff --git a/Tests/Resources/Sql/BillingInsert.sql b/Tests/Resources/Sql/BillingInsert.sql index 7b1720b..02d4bff 100644 --- a/Tests/Resources/Sql/BillingInsert.sql +++ b/Tests/Resources/Sql/BillingInsert.sql @@ -16,17 +16,18 @@ INSERT INTO wine_attribute (attrid, name, active, max_kg_per_ha, strict, fill_lo ('R', 'Vertrag R', TRUE, NULL, TRUE, 2); INSERT INTO area_commitment_type (vtrgid, sortid, attrid, disc, min_kg_per_ha, penalty_per_kg, penalty_amount, penalty_none) VALUES -('ZW', 'ZW', NULL, NULL, 2500, 600, NULL, NULL), -('GV', 'GV', NULL, NULL, 5000, 500, NULL, NULL), -('GVK', 'GV', 'K', NULL, 5000, 500, NULL, NULL), -('GVD', 'GV', 'D', NULL, 5000, 1000, NULL, NULL), -('GVP', 'GV', 'P', NULL, 5000, 1000, 1000000, NULL), -('GVQ', 'GV', 'Q', NULL, 5000, 1000, 1000000, NULL), -('GVR', 'GV', 'R', NULL, 5000, 1000, 1000000, NULL); +('ZW', 'ZW', NULL, NULL, 2500, 600, NULL, NULL), +('GV', 'GV', NULL, NULL, 5000, 500, NULL, NULL), +('GVK', 'GV', 'K', NULL, 5000, 500, NULL, NULL), +('GVD', 'GV', 'D', NULL, 5000, 1000, NULL, NULL), +('GVP', 'GV', 'P', NULL, 5000, 1000, 1000000, NULL), +('GVQ', 'GV', 'Q', NULL, 5000, 1000, 1000000, NULL), +('GVR', 'GV', 'R', NULL, 5000, 1000, 1000000, NULL); INSERT INTO area_commitment (fbnr, mgnr, vtrgid, cultid, area, kgnr, gstnr, rdnr, year_from, year_to) VALUES -( 1, 101, 'GV', 'K', 10000, 06109, '123/4', NULL, 2000, 2019), -( 2, 101, 'GV', 'B', 10000, 06109, '123/5', NULL, 2025, 2030); +( 1, 101, 'GV', 'K', 10000, 06109, '123/4', NULL, 2000, 2019), +( 2, 101, 'GV', 'K', 10000, 06109, '123/5', NULL, 2025, 2030), +( 3, 101, 'GV', 'K', 10000, 06109, '123/6', NULL, 2021, 2031); INSERT INTO season (year, currency, min_kg_per_bs, max_kg_per_bs, penalty_per_kg, penalty_amount, penalty_none, start_date, end_date) VALUES (2020, 'EUR', 1000, 2000, NULL, NULL, NULL, NULL, NULL), @@ -36,18 +37,30 @@ INSERT INTO modifier (year, modid, ordering, name, abs, rel, standard, quick_sel (2020, 'S', 0, 'GeschÃĪdigte Trauben', NULL, -0.1, FALSE, FALSE), (2020, 'A', 0, 'Keine Voranmeldung', -1000, NULL, FALSE, FALSE); +-- Test 01 INSERT INTO delivery (mgnr, year, did, date, time, zwstid, lnr) VALUES (101, 2020, 1, '2020-10-01', NULL, 'X', 1), (101, 2020, 2, '2020-10-01', NULL, 'X', 2), (101, 2020, 3, '2020-10-01', NULL, 'X', 3); - INSERT INTO delivery_part (year, did, dpnr, sortid, attrid, weight, kmw, qualid, hkid, kgnr, gerebelt, manual_weighing, spl_check, scale_id, weighing_id, weighing_reason) VALUES -(2020, 1, 1, 'GV', 'K', 4000, 17, 'KAB', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2020, 1, 1, 'GV', 'K', 4000, 17, 'KAB', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 1, 2, 'GV', NULL, 4000, 16, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), -(2020, 2, 1, 'GV', 'B', 4000, 15, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), -(2020, 2, 2, 'GV', 'B', 4000, 16, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2020, 2, 1, 'GV', 'B', 4000, 15, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2020, 2, 2, 'GV', 'B', 4000, 16, 'QUW', 'WLNO', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 3, 1, 'GV', NULL, 500, 15, 'WEI', 'OEST', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL), (2020, 3, 2, 'GV', NULL, 500, 14, 'LDW', 'WLXX', 06109, TRUE, FALSE, FALSE, NULL, NULL, NULL); - INSERT INTO delivery_part_modifier (year, did, dpnr, modid) VALUES (2020, 1, 2, 'S'); + +-- Test 02 + 03 +INSERT INTO delivery (mgnr, year, did, date, time, zwstid, lnr) VALUES +(101, 2021, 1, '2021-10-01', NULL, 'X', 1), +(101, 2021, 2, '2021-10-01', NULL, 'X', 2), +(101, 2021, 3, '2021-10-01', NULL, 'X', 3); +INSERT INTO delivery_part (year, did, dpnr, sortid, attrid, weight, kmw, qualid, hkid, kgnr, gebunden, gerebelt, manual_weighing, spl_check, scale_id, weighing_id, weighing_reason) VALUES +(2021, 1, 1, 'GV', 'K', 4000, 17, 'KAB', 'WLNO', 06109, TRUE, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2021, 1, 2, 'GV', NULL, 4000, 16, 'QUW', 'WLNO', 06109, FALSE, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2021, 2, 1, 'GV', 'B', 4000, 15, 'QUW', 'WLNO', 06109, TRUE, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2021, 2, 2, 'GV', 'B', 4000, 16, 'QUW', 'WLNO', 06109, FALSE, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2021, 3, 1, 'GV', NULL, 500, 15, 'WEI', 'OEST', 06109, NULL, TRUE, FALSE, FALSE, NULL, NULL, NULL), +(2021, 3, 2, 'GV', NULL, 500, 14, 'LDW', 'WLXX', 06109, NULL, TRUE, FALSE, FALSE, NULL, NULL, NULL);