DeliveryAdminWindow: Add DeliverySplittingDialog
All checks were successful
Test / Run tests (push) Successful in 2m10s
All checks were successful
Test / Run tests (push) Successful in 2m10s
This commit is contained in:
@ -430,103 +430,229 @@ namespace Elwig.Services {
|
||||
}
|
||||
|
||||
public static async Task<DeliveryPart> UpdateDeliveryPart(this DeliveryAdminViewModel vm, int? oldYear, int? oldDid, int? oldDpnr, bool dateHasChanged, bool timeHasChanged, bool timeIsDefault) {
|
||||
using var ctx = new AppDbContext();
|
||||
DeliveryPart p;
|
||||
|
||||
int year = oldYear ?? Utils.CurrentYear;
|
||||
int did = oldDid ?? await ctx.NextDId(year);
|
||||
int dpnr = oldDpnr ?? await ctx.NextDPNr(year, did);
|
||||
using (var ctx = new AppDbContext()) {
|
||||
int year = oldYear ?? Utils.CurrentYear;
|
||||
int did = oldDid ?? await ctx.NextDId(year);
|
||||
int dpnr = oldDpnr ?? await ctx.NextDPNr(year, did);
|
||||
|
||||
var oldDelivery = await ctx.Deliveries.FindAsync(year, did);
|
||||
bool deliveryNew = (oldDid == null);
|
||||
bool partNew = (oldDpnr == null);
|
||||
var originalMgNr = oldDelivery?.MgNr;
|
||||
var originalMemberKgNr = oldDelivery?.Member.DefaultKgNr;
|
||||
var oldDelivery = await ctx.Deliveries.FindAsync(year, did);
|
||||
bool deliveryNew = (oldDid == null);
|
||||
bool partNew = (oldDpnr == null);
|
||||
var originalMgNr = oldDelivery?.MgNr;
|
||||
var originalMemberKgNr = oldDelivery?.Member.DefaultKgNr;
|
||||
|
||||
var date = DateOnly.ParseExact(vm.Date!, "dd.MM.yyyy");
|
||||
int? newLnr = (deliveryNew || dateHasChanged) ? await ctx.NextLNr(date, vm.Branch!.ZwstId) : null;
|
||||
string? newLsNr = (newLnr != null) ? Utils.GenerateLsNr(date, vm.Branch!.ZwstId, newLnr.Value) : null;
|
||||
var date = DateOnly.ParseExact(vm.Date!, "dd.MM.yyyy");
|
||||
int? newLnr = (deliveryNew || dateHasChanged) ? await ctx.NextLNr(date, vm.Branch!.ZwstId) : null;
|
||||
string? newLsNr = (newLnr != null) ? Utils.GenerateLsNr(date, vm.Branch!.ZwstId, newLnr.Value) : null;
|
||||
|
||||
string? newTimeString = null;
|
||||
if (partNew && timeIsDefault) {
|
||||
newTimeString = DateTime.Now.ToString("HH:mm:ss");
|
||||
} else if (partNew || timeHasChanged) {
|
||||
newTimeString = string.IsNullOrEmpty(vm.Time) ? null : vm.Time + ":00";
|
||||
}
|
||||
|
||||
var d = new Delivery {
|
||||
Year = year,
|
||||
DId = did,
|
||||
DateString = $"{date:yyyy-MM-dd}",
|
||||
TimeString = newTimeString ?? oldDelivery?.TimeString,
|
||||
LNr = newLnr ?? oldDelivery!.LNr,
|
||||
ZwstId = vm.Branch!.ZwstId,
|
||||
LsNr = newLsNr ?? vm.LsNr!,
|
||||
MgNr = (int)vm.MgNr!,
|
||||
Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
|
||||
};
|
||||
|
||||
var p = new DeliveryPart {
|
||||
Year = year,
|
||||
DId = did,
|
||||
DPNr = dpnr,
|
||||
|
||||
SortId = vm.WineVar!.SortId,
|
||||
AttrId = vm.WineAttr?.AttrId,
|
||||
CultId = vm.WineCult?.CultId,
|
||||
Kmw = (double)vm.GradationKmw!,
|
||||
QualId = vm.WineQualityLevel!.QualId,
|
||||
HkId = vm.WineOrigin!.HkId,
|
||||
KgNr = vm.WineKg?.KgNr,
|
||||
RdNr = vm.WineRd?.RdNr,
|
||||
|
||||
IsNetWeight = vm.IsNetWeight,
|
||||
IsHandPicked = vm.IsHandPicked,
|
||||
IsLesewagen = vm.IsLesewagen,
|
||||
IsGebunden = vm.IsGebunden,
|
||||
Temperature = vm.Temperature,
|
||||
Acid = vm.Acid,
|
||||
Comment = string.IsNullOrEmpty(vm.PartComment) ? null : vm.PartComment,
|
||||
|
||||
Weight = (int)vm.Weight!,
|
||||
IsManualWeighing = vm.IsManualWeighing,
|
||||
ScaleId = vm.ScaleId,
|
||||
WeighingData = vm.WeighingData,
|
||||
WeighingReason = vm.ManualWeighingReason,
|
||||
};
|
||||
|
||||
if (oldDelivery != null && ctx.Entry(oldDelivery) is EntityEntry<Delivery> entry) {
|
||||
entry.State = EntityState.Detached;
|
||||
}
|
||||
if (!deliveryNew) {
|
||||
ctx.Update(d);
|
||||
} else {
|
||||
ctx.Add(d);
|
||||
}
|
||||
if (!partNew) {
|
||||
ctx.Update(p);
|
||||
} else {
|
||||
ctx.Add(p);
|
||||
}
|
||||
|
||||
ctx.UpdateDeliveryPartModifiers(p, await ctx.DeliveryPartModifiers
|
||||
.Where(m => m.Year == p.Year && m.DId == p.DId && m.DPNr == p.DPNr)
|
||||
.Select(m => m.Modifier)
|
||||
.ToListAsync(), vm.Modifiers);
|
||||
|
||||
if (originalMgNr != null && originalMgNr.Value != d.MgNr) {
|
||||
// update origin (KgNr), if default is selected
|
||||
var newKgNr = (await ctx.Members.FindAsync(d.MgNr))?.DefaultKgNr;
|
||||
foreach (var part in d.Parts.Where(part => part.DPNr != dpnr && part.KgNr == originalMemberKgNr)) {
|
||||
part.KgNr = newKgNr;
|
||||
ctx.Update(part);
|
||||
string? newTimeString = null;
|
||||
if (partNew && timeIsDefault) {
|
||||
newTimeString = DateTime.Now.ToString("HH:mm:ss");
|
||||
} else if (partNew || timeHasChanged) {
|
||||
newTimeString = string.IsNullOrEmpty(vm.Time) ? null : vm.Time + ":00";
|
||||
}
|
||||
|
||||
var d = new Delivery {
|
||||
Year = year,
|
||||
DId = did,
|
||||
DateString = $"{date:yyyy-MM-dd}",
|
||||
TimeString = newTimeString ?? oldDelivery?.TimeString,
|
||||
LNr = newLnr ?? oldDelivery!.LNr,
|
||||
ZwstId = vm.Branch!.ZwstId,
|
||||
LsNr = newLsNr ?? vm.LsNr!,
|
||||
MgNr = (int)vm.MgNr!,
|
||||
Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
|
||||
};
|
||||
|
||||
p = new DeliveryPart {
|
||||
Year = year,
|
||||
DId = did,
|
||||
DPNr = dpnr,
|
||||
|
||||
SortId = vm.WineVar!.SortId,
|
||||
AttrId = vm.WineAttr?.AttrId,
|
||||
CultId = vm.WineCult?.CultId,
|
||||
Kmw = (double)vm.GradationKmw!,
|
||||
QualId = vm.WineQualityLevel!.QualId,
|
||||
HkId = vm.WineOrigin!.HkId,
|
||||
KgNr = vm.WineKg?.KgNr,
|
||||
RdNr = vm.WineRd?.RdNr,
|
||||
|
||||
IsNetWeight = vm.IsNetWeight,
|
||||
IsHandPicked = vm.IsHandPicked,
|
||||
IsLesewagen = vm.IsLesewagen,
|
||||
IsGebunden = vm.IsGebunden,
|
||||
Temperature = vm.Temperature,
|
||||
Acid = vm.Acid,
|
||||
Comment = string.IsNullOrEmpty(vm.PartComment) ? null : vm.PartComment,
|
||||
|
||||
Weight = (int)vm.Weight!,
|
||||
IsManualWeighing = vm.IsManualWeighing,
|
||||
ScaleId = vm.ScaleId,
|
||||
WeighingData = vm.WeighingData,
|
||||
WeighingReason = vm.ManualWeighingReason,
|
||||
};
|
||||
|
||||
if (oldDelivery != null && ctx.Entry(oldDelivery) is EntityEntry<Delivery> entry) {
|
||||
entry.State = EntityState.Detached;
|
||||
}
|
||||
if (!deliveryNew) {
|
||||
ctx.Update(d);
|
||||
} else {
|
||||
ctx.Add(d);
|
||||
}
|
||||
if (!partNew) {
|
||||
ctx.Update(p);
|
||||
} else {
|
||||
ctx.Add(p);
|
||||
}
|
||||
|
||||
ctx.UpdateDeliveryPartModifiers(p, await ctx.DeliveryPartModifiers
|
||||
.Where(m => m.Year == p.Year && m.DId == p.DId && m.DPNr == p.DPNr)
|
||||
.Select(m => m.Modifier)
|
||||
.ToListAsync(), vm.Modifiers);
|
||||
|
||||
if (originalMgNr != null && originalMgNr.Value != d.MgNr) {
|
||||
// update origin (KgNr), if default is selected
|
||||
var newKgNr = (await ctx.Members.FindAsync(d.MgNr))?.DefaultKgNr;
|
||||
foreach (var part in d.Parts.Where(part => part.DPNr != dpnr && part.KgNr == originalMemberKgNr)) {
|
||||
part.KgNr = newKgNr;
|
||||
ctx.Update(part);
|
||||
}
|
||||
}
|
||||
|
||||
await ctx.SaveChangesAsync();
|
||||
}
|
||||
|
||||
await ctx.SaveChangesAsync();
|
||||
App.HintContextChange();
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
public static async Task<Delivery> SplitDeliveryToMember(int year, int did, int[] weights, int mgnr) {
|
||||
Delivery n;
|
||||
|
||||
using (var ctx = new AppDbContext()) {
|
||||
bool anyLeft = false;
|
||||
var d = (await ctx.Deliveries.FindAsync(year, did))!;
|
||||
var lnr = await ctx.NextLNr(d.Date, d.ZwstId);
|
||||
n = new Delivery {
|
||||
Year = year,
|
||||
DId = await ctx.NextDId(d.Year),
|
||||
DateString = d.DateString,
|
||||
TimeString = d.TimeString,
|
||||
ZwstId = d.ZwstId,
|
||||
LNr = lnr,
|
||||
LsNr = Utils.GenerateLsNr(d.Date, d.ZwstId, lnr),
|
||||
MgNr = mgnr,
|
||||
Comment = d.Comment,
|
||||
};
|
||||
ctx.Add(n);
|
||||
await ctx.SaveChangesAsync();
|
||||
|
||||
var dpnr = 1;
|
||||
foreach (var (p, w) in d.Parts.ToList().Zip(weights)) {
|
||||
if (w <= 0) {
|
||||
anyLeft = true;
|
||||
continue;
|
||||
} else if (w >= p.Weight) {
|
||||
await ctx.Database.ExecuteSqlAsync($"UPDATE delivery_part SET year = {n.Year}, did = {n.DId}, dpnr = {dpnr++} WHERE (year, did, dpnr) = ({p.Year}, {p.DId}, {p.DPNr})");
|
||||
} else {
|
||||
anyLeft = true;
|
||||
p.Weight -= w;
|
||||
ctx.Update(p);
|
||||
var s = ctx.CreateProxy<DeliveryPart>();
|
||||
var values = ctx.Entry(p).CurrentValues;
|
||||
ctx.Entry(s).CurrentValues.SetValues(values);
|
||||
s.Year = n.Year;
|
||||
s.DId = n.DId;
|
||||
s.DPNr = dpnr++;
|
||||
s.Weight = w;
|
||||
ctx.Add(s);
|
||||
}
|
||||
}
|
||||
|
||||
await ctx.SaveChangesAsync();
|
||||
if (!anyLeft)
|
||||
await ctx.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({d.Year}, {d.DId})");
|
||||
}
|
||||
|
||||
App.HintContextChange();
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
public static async Task<Delivery> SplitDeliveryToLsNr(int year, int did, int[] weights, string lsnr) {
|
||||
Delivery n;
|
||||
|
||||
using (var ctx = new AppDbContext()) {
|
||||
var anyLeft = false;
|
||||
n = (await ctx.Deliveries.FirstAsync(d => d.LsNr == lsnr))!;
|
||||
var d = (await ctx.Deliveries.FindAsync(year, did))!;
|
||||
var dpnr = await ctx.NextDPNr(n.Year, n.DId);
|
||||
foreach (var (p, w) in d.Parts.ToList().Zip(weights)) {
|
||||
if (w <= 0) {
|
||||
anyLeft = true;
|
||||
continue;
|
||||
} else if (w >= p.Weight) {
|
||||
await ctx.Database.ExecuteSqlAsync($"UPDATE delivery_part SET year = {n.Year}, did = {n.DId}, dpnr = {dpnr++} WHERE (year, did, dpnr) = ({p.Year}, {p.DId}, {p.DPNr})");
|
||||
} else {
|
||||
anyLeft = true;
|
||||
p.Weight -= w;
|
||||
ctx.Update(p);
|
||||
var s = ctx.CreateProxy<DeliveryPart>();
|
||||
var values = ctx.Entry(p).CurrentValues;
|
||||
ctx.Entry(s).CurrentValues.SetValues(values);
|
||||
s.Year = n.Year;
|
||||
s.DId = n.DId;
|
||||
s.DPNr = dpnr++;
|
||||
s.Weight = w;
|
||||
ctx.Add(s);
|
||||
}
|
||||
}
|
||||
|
||||
await ctx.SaveChangesAsync();
|
||||
if (!anyLeft)
|
||||
await ctx.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({d.Year}, {d.DId})");
|
||||
}
|
||||
|
||||
App.HintContextChange();
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
public static async Task DepreciateDelivery(int year, int did, int[] weights) {
|
||||
using (var ctx = new AppDbContext()) {
|
||||
var d = (await ctx.Deliveries.FindAsync(year, did))!;
|
||||
var dpnr = await ctx.NextDPNr(year, did);
|
||||
foreach (var (p, w) in d.Parts.ToList().Zip(weights)) {
|
||||
if (w <= 0) {
|
||||
continue;
|
||||
} else if (w >= p.Weight) {
|
||||
p.QualId = "WEI";
|
||||
p.HkId = "OEST";
|
||||
ctx.Update(p);
|
||||
} else {
|
||||
p.Weight -= w;
|
||||
ctx.Update(p);
|
||||
var n = ctx.CreateProxy<DeliveryPart>();
|
||||
var values = ctx.Entry(p).CurrentValues;
|
||||
ctx.Entry(n).CurrentValues.SetValues(values);
|
||||
n.DPNr = dpnr++;
|
||||
n.Weight = w;
|
||||
n.QualId = "WEI";
|
||||
n.HkId = "OEST";
|
||||
ctx.Add(n);
|
||||
}
|
||||
}
|
||||
await ctx.SaveChangesAsync();
|
||||
}
|
||||
|
||||
App.HintContextChange();
|
||||
}
|
||||
|
||||
public static async Task GenerateDeliveryNote(int year, int did, ExportMode mode) {
|
||||
Mouse.OverrideCursor = Cursors.AppStarting;
|
||||
try {
|
||||
|
Reference in New Issue
Block a user