Billing: differentiate between flag FillLowerBins

This commit is contained in:
2023-10-15 01:09:55 +02:00
parent 5657a8f90a
commit 62bf425313
2 changed files with 7 additions and 5 deletions

View File

@ -43,6 +43,7 @@ namespace Elwig.Helpers.Billing {
}
public async Task CalculateBins() {
var forcedAttr = Context.WineAttributes.Where(a => !a.FillLowerBins).Select(a => a.AttrId).ToArray();
using var cnx = await AppDbContext.ConnectAsync();
var memberOblRig = await GetMemberRightsObligations(cnx, Year);
var inserts = new List<(int, int, int, int, int, int, int)>();
@ -84,7 +85,7 @@ namespace Elwig.Helpers.Billing {
int w = weight;
int[] b = new int[4];
foreach (var p in Utils.Permutate(attributes)) {
foreach (var p in Utils.Permutate(attributes, attributes.Intersect(forcedAttr))) {
var c = p.Count();
var key = sortid + string.Join("", p);
if (rights.ContainsKey(key)) {

View File

@ -327,13 +327,14 @@ namespace Elwig.Helpers {
}
}
public static IEnumerable<IEnumerable<T>> Permutate<T>(IEnumerable<T> input) {
List<IEnumerable<T>> output = new();
public static IEnumerable<IEnumerable<T>> Permutate<T>(IEnumerable<T> input, IEnumerable<T>? forced = null) {
HashSet<IEnumerable<T>> output = new();
for (int i = 0; i < Math.Pow(2, input.Count()); i++) {
List<T> t = new();
for (int j = 0; j < 30; j++) {
if ((i & (1 << j)) != 0) {
t.Add(input.ElementAt(j));
var e = input.ElementAtOrDefault(j);
if (e != null && ((forced?.Contains(e) ?? false) || (i & (1 << j)) != 0)) {
t.Add(e);
}
}
output.Add(t);