119 lines
5.7 KiB
C#
119 lines
5.7 KiB
C#
using Elwig.Helpers;
|
|
using Elwig.Models.Entities;
|
|
using Elwig.ViewModels;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace Elwig.Services {
|
|
public static class DeliveryAncmtService {
|
|
|
|
public static void InitInputs(this DeliveryAncmtAdminViewModel vm) {
|
|
if (vm.SelectedDeliverySchedule is DeliverySchedule s)
|
|
vm.DeliverySchedule = (DeliverySchedule?)ControlUtils.GetItemFromSourceWithPk(vm.DeliveryScheduleSource, s.Year, s.DsNr);
|
|
}
|
|
|
|
public static void ClearInputs(this DeliveryAncmtAdminViewModel vm) {
|
|
}
|
|
|
|
public static async Task FillInputs(this DeliveryAncmtAdminViewModel vm, DeliveryAncmt a) {
|
|
vm.MgNr = a.MgNr;
|
|
vm.DeliverySchedule = (DeliverySchedule?)ControlUtils.GetItemFromSourceWithPk(vm.DeliveryScheduleSource, a.Year, a.DsNr);
|
|
vm.SortId = a.SortId;
|
|
vm.Weight = a.Weight;
|
|
}
|
|
|
|
public static async Task<(List<string>, IQueryable<DeliveryAncmt>, List<string>)> GetFilters(this DeliveryAncmtAdminViewModel vm, AppDbContext ctx) {
|
|
List<string> filterNames = [];
|
|
IQueryable<DeliveryAncmt> deliveryAncmtQuery = ctx.DeliveryAnnouncements;
|
|
if (vm.SelectedDeliverySchedule is DeliverySchedule s) {
|
|
deliveryAncmtQuery = deliveryAncmtQuery.Where(a => a.Year == s.Year && a.DsNr == s.DsNr);
|
|
filterNames.Add($"{s.Date:dd.MM.yyyy} - {s.Branch.Name} - {s.Description}");
|
|
} else {
|
|
deliveryAncmtQuery = deliveryAncmtQuery.Where(a => a.Year == vm.FilterSeason);
|
|
filterNames.Add($"{vm.FilterSeason}");
|
|
}
|
|
|
|
var filterVar = new List<string>();
|
|
var filterNotVar = new List<string>();
|
|
var filterMgNr = new List<int>();
|
|
|
|
var filter = vm.TextFilter;
|
|
if (filter.Count > 0) {
|
|
var var = await ctx.WineVarieties.ToDictionaryAsync(v => v.SortId, v => v);
|
|
var mgnr = await ctx.Members.ToDictionaryAsync(m => m.MgNr.ToString(), m => m);
|
|
|
|
for (int i = 0; i < filter.Count; i++) {
|
|
var e = filter[i];
|
|
if (e.ToLower() is "r" or "rot") {
|
|
filterVar.AddRange(var.Values.Where(v => v.IsRed).Select(v => v.SortId));
|
|
filter.RemoveAt(i--);
|
|
filterNames.Add("Rotweinsorten");
|
|
} else if (e.ToLower() is "w" or "weiß" or "weiss") {
|
|
filterVar.AddRange(var.Values.Where(v => v.IsWhite).Select(v => v.SortId));
|
|
filter.RemoveAt(i--);
|
|
filterNames.Add("Weißweinsorten");
|
|
} else if (e.Length == 2 && var.ContainsKey(e.ToUpper())) {
|
|
filterVar.Add(e.ToUpper());
|
|
filter.RemoveAt(i--);
|
|
filterNames.Add(var[e.ToUpper()].Name);
|
|
} else if (e.Length == 3 && e[0] == '!' && var.ContainsKey(e[1..].ToUpper())) {
|
|
filterNotVar.Add(e[1..].ToUpper());
|
|
filter.RemoveAt(i--);
|
|
filterNames.Add("außer " + var[e[1..].ToUpper()].Name);
|
|
} else if (e.All(char.IsAsciiDigit) && mgnr.TryGetValue(e, out var member)) {
|
|
filterMgNr.Add(int.Parse(e));
|
|
filter.RemoveAt(i--);
|
|
filterNames.Add(member.AdministrativeName);
|
|
} else if (e.Length > 2 && e.StartsWith('"') && e.EndsWith('"')) {
|
|
filter[i] = e[1..^1];
|
|
} else if (e.Length <= 2) {
|
|
filter.RemoveAt(i--);
|
|
}
|
|
}
|
|
|
|
if (filterMgNr.Count > 0) deliveryAncmtQuery = deliveryAncmtQuery.Where(a => filterMgNr.Contains(a.MgNr));
|
|
if (filterVar.Count > 0) deliveryAncmtQuery = deliveryAncmtQuery.Where(a => filterVar.Contains(a.SortId));
|
|
if (filterNotVar.Count > 0) deliveryAncmtQuery = deliveryAncmtQuery.Where(a => !filterNotVar.Contains(a.SortId));
|
|
}
|
|
|
|
return (filterNames, deliveryAncmtQuery, filter);
|
|
}
|
|
|
|
public static async Task<(int, int, int, string)> UpdateDeliveryAncmt(this DeliveryAncmtAdminViewModel vm, int? oldYear, int? oldDsNr, int? oldMgNr, string? oldSortId, string? oldType) {
|
|
int year = vm.DeliverySchedule!.Year;
|
|
int dsnr = vm.DeliverySchedule!.DsNr;
|
|
int newMgNr = vm.MgNr!.Value;
|
|
string newSortId = vm.SortId!;
|
|
|
|
using (var ctx = new AppDbContext()) {
|
|
var a = new DeliveryAncmt {
|
|
Year = oldYear ?? year,
|
|
DsNr = oldDsNr ?? dsnr,
|
|
MgNr = oldMgNr ?? newMgNr,
|
|
SortId = oldSortId ?? newSortId,
|
|
Weight = vm.Weight!.Value,
|
|
Type = oldType ?? "manual",
|
|
};
|
|
|
|
if (oldDsNr != null) {
|
|
ctx.Update(a);
|
|
} else {
|
|
ctx.Add(a);
|
|
}
|
|
|
|
await ctx.SaveChangesAsync();
|
|
|
|
if (oldDsNr != null && (oldYear != year || oldDsNr != dsnr || oldMgNr != newMgNr || oldSortId != newSortId)) {
|
|
await ctx.Database.ExecuteSqlRawAsync($"UPDATE delivery_announcement SET year = {year}, dsnr = {dsnr}, mgnr = {newMgNr}, sortid = '{newSortId}' WHERE (year, dsnr, mgnr, sortid) = ({a.Year}, {a.DsNr}, {a.MgNr}, '{a.SortId}')");
|
|
}
|
|
}
|
|
|
|
await App.HintContextChange();
|
|
|
|
return (year, dsnr, newMgNr, newSortId);
|
|
}
|
|
}
|
|
}
|