BillingTest: Implement Test_02 and Test_03

This commit is contained in:
2024-02-03 00:34:11 +01:00
parent 0591d91f49
commit 42eb68d431
2 changed files with 177 additions and 57 deletions

View File

@ -7,9 +7,18 @@ namespace Tests.HelperTests {
[TestFixture] [TestFixture]
public class BillingTest { 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 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; private SqliteConnection? Connection;
[OneTimeSetUp] [OneTimeSetUp]
@ -26,6 +35,40 @@ namespace Tests.HelperTests {
Connection = null; 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] [TearDown]
public async Task CleanupDatabasePayment() { public async Task CleanupDatabasePayment() {
if (Connection == null) return; if (Connection == null) return;
@ -51,11 +94,11 @@ namespace Tests.HelperTests {
return ctx.GetMemberPaymentBuckets(year, mgnr, Connection); return ctx.GetMemberPaymentBuckets(year, mgnr, Connection);
} }
private async Task<Dictionary<(string, string), int>> GetMemberDeliveryPrices(int year, int mgnr) { private async Task<Dictionary<(string, string), (int, decimal)>> GetMemberDeliveryPrices(int year, int mgnr) {
var buckets = new Dictionary<(string, string), int>(); var buckets = new Dictionary<(string, string), (int, decimal)>();
using (var cmd = Connection!.CreateCommand()) { using (var cmd = Connection!.CreateCommand()) {
cmd.CommandText = $""" 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 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 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) 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()) { while (await reader.ReadAsync()) {
var lsnr = reader.GetString(0); var lsnr = reader.GetString(0);
var bucket = reader.GetString(1); 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; return buckets;
@ -81,34 +124,6 @@ namespace Tests.HelperTests {
[Test] [Test]
public async Task Test_01_NoActiveAreaComs() { public async Task Test_01_NoActiveAreaComs() {
int mgnr = MgNr1, year = Year1; 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); var areaCom = await GetMemberAreaCommitmentBuckets(year, mgnr);
Assert.That(areaCom, Is.Empty); Assert.That(areaCom, Is.Empty);
@ -133,25 +148,117 @@ namespace Tests.HelperTests {
var prices = await GetMemberDeliveryPrices(year, mgnr); var prices = await GetMemberDeliveryPrices(year, mgnr);
Assert.Multiple(() => { Assert.Multiple(() => {
Assert.That(prices, Has.Count.EqualTo(6)); Assert.That(prices, Has.Count.EqualTo(6));
Assert.That(prices[("20201001X001/1", "GV_")], Is.EqualTo(0_6100)); // Kabinett
Assert.That(prices[("20201001X001/2", "GV_")], Is.EqualTo(0_5000)); Assert.That(prices[("20201001X001/1", "GV_")], Is.EqualTo((4_000, GV_ungeb)));
Assert.That(prices[("20201001X002/1", "GV_")], Is.EqualTo(0_5400)); // ohne Attribut
Assert.That(prices[("20201001X002/2", "GV_")], Is.EqualTo(0_5400)); Assert.That(prices[("20201001X001/2", "GV_")], Is.EqualTo((4_000, GV_ungeb)));
Assert.That(prices[("20201001X003/1", "GV_")], Is.EqualTo(0_1000)); // Bio
Assert.That(prices[("20201001X003/2", "GV_")], Is.EqualTo(0_5000)); 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] [Test]
[Ignore("Not implemented yet")]
public async Task Test_02_SimpleNotStrictAreaComs() { 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] [Test]
[Ignore("Not implemented yet")]
public async Task Test_03_SimpleNotStrictAreaComs_HonorGebunden() { 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] [Test]

View File

@ -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); ('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 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), ('ZW', 'ZW', NULL, NULL, 2500, 600, NULL, NULL),
('GV', 'GV', NULL, NULL, 5000, 500, NULL, NULL), ('GV', 'GV', NULL, NULL, 5000, 500, NULL, NULL),
('GVK', 'GV', 'K', NULL, 5000, 500, NULL, NULL), ('GVK', 'GV', 'K', NULL, 5000, 500, NULL, NULL),
('GVD', 'GV', 'D', NULL, 5000, 1000, NULL, NULL), ('GVD', 'GV', 'D', NULL, 5000, 1000, NULL, NULL),
('GVP', 'GV', 'P', NULL, 5000, 1000, 1000000, NULL), ('GVP', 'GV', 'P', NULL, 5000, 1000, 1000000, NULL),
('GVQ', 'GV', 'Q', NULL, 5000, 1000, 1000000, NULL), ('GVQ', 'GV', 'Q', NULL, 5000, 1000, 1000000, NULL),
('GVR', 'GV', 'R', 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 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), ( 1, 101, 'GV', 'K', 10000, 06109, '123/4', NULL, 2000, 2019),
( 2, 101, 'GV', 'B', 10000, 06109, '123/5', NULL, 2025, 2030); ( 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 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), (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, 'S', 0, 'Geschädigte Trauben', NULL, -0.1, FALSE, FALSE),
(2020, 'A', 0, 'Keine Voranmeldung', -1000, NULL, FALSE, FALSE); (2020, 'A', 0, 'Keine Voranmeldung', -1000, NULL, FALSE, FALSE);
-- Test 01
INSERT INTO delivery (mgnr, year, did, date, time, zwstid, lnr) VALUES INSERT INTO delivery (mgnr, year, did, date, time, zwstid, lnr) VALUES
(101, 2020, 1, '2020-10-01', NULL, 'X', 1), (101, 2020, 1, '2020-10-01', NULL, 'X', 1),
(101, 2020, 2, '2020-10-01', NULL, 'X', 2), (101, 2020, 2, '2020-10-01', NULL, 'X', 2),
(101, 2020, 3, '2020-10-01', NULL, 'X', 3); (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 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, 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, 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, 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, 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); (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 INSERT INTO delivery_part_modifier (year, did, dpnr, modid) VALUES
(2020, 1, 2, 'S'); (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);