using System; using System.Collections.Generic; using System.Linq; using Comal.Classes; using InABox.Clients; using InABox.Core; using InABox.DynamicGrid; using InABox.Wpf; namespace PRSDesktop; public static class SystemSetupActions { private class V6SettingsGrid : DynamicItemsListGrid { private void Validate(string sql, List errors) where T : V6Object, new() { var t = new T(); List _e = new(); t.ValidateQuery(sql,_e); if (_e.Any()) { errors.Add($"The query for {typeof(T).Name} has some errors:"); errors.AddRange(_e); } } private static void ValidateUom(V6Settings settings, string uomcode, List errors, IEnumerable uoms, params string[] checks) { var _uomvalue = CoreUtils.GetPropertyValue(settings, uomcode) as string; if (string.IsNullOrWhiteSpace(_uomvalue)) { errors.Add($"{uomcode.SplitCamelCase()} may not be blank!"); return; } var _uom = uoms.FirstOrDefault(x => string.Equals(x.Code, _uomvalue)); if (_uom == null) { errors.Add($"{uomcode.SplitCamelCase()}: {_uomvalue} is not a value Unit of Measure!"); return; } List _missing = new(); foreach (var _check in checks) { var _enabled = (bool)(CoreUtils.GetPropertyValue(_uom, _check) ?? false); if (!_enabled) _missing.Add(_check); } if (_missing.Any()) errors.Add($"{_uomvalue} is missing the following checks: {string.Join(", ",_missing)}"); } protected override void DoValidate(V6Settings[] items, List errors) { base.DoValidate(items, errors); var _item = items.FirstOrDefault(); if (_item == null) return; var _uoms = Client.Query(new Filter().All(), Columns.All()).ToObjects().ToArray(); if (_item.ImportCosts != V6ImportCosts.None) { ValidateUom(_item, nameof(V6Settings.ProfileUom), errors, _uoms, nameof(ProductDimensionUnit.HasLength)); ValidateUom(_item, nameof(V6Settings.ComponentUom), errors, _uoms, nameof(ProductDimensionUnit.HasQuantity)); ValidateUom(_item, nameof(V6Settings.GlassUom), errors, _uoms, nameof(ProductDimensionUnit.HasHeight), nameof(ProductDimensionUnit.HasWidth)); } if (_item.ImportDesigns == V6ImportDesigns.ToManufacturing) { if (String.IsNullOrWhiteSpace(_item.PacketTemplate)) errors.Add("Packet Template my not be blank!"); else { var _found = Client .Query(new Filter(x => x.Code).IsEqualTo(_item.PacketTemplate), Columns.None()).Rows.Any(); if (!_found) errors.Add($"Packet Template [{_item.PacketTemplate}] does not exist!"); } } _item.CheckSQL(); Validate(_item.QuoteSQL, errors); Validate(_item.ElevationSQL, errors); Validate(_item.DrawingsSQL, errors); Validate(_item.ProfileSQL, errors); Validate(_item.ComponentSQL, errors); Validate(_item.LabourSQL, errors); Validate(_item.GlassSQL, errors); } } private class LogikalSettingsGrid : DynamicItemsListGrid { private void Validate(string sql, List errors) where T : LogikalItem, new() { var t = new T(); List _e = new(); t.ValidateQuery(sql, _e); if (_e.Any()) { errors.Add($"The query for {typeof(T).Name} has some errors:"); errors.AddRange(_e); } } private static void ValidateUom(LogikalSettings settings, string uomcode, List errors, IEnumerable uoms, params string[] checks) { var _uomvalue = CoreUtils.GetPropertyValue(settings, uomcode) as string; if (string.IsNullOrWhiteSpace(_uomvalue)) { errors.Add($"{uomcode.SplitCamelCase()} may not be blank!"); return; } var _uom = uoms.FirstOrDefault(x => string.Equals(x.Code, _uomvalue)); if (_uom == null) { errors.Add($"{uomcode.SplitCamelCase()}: {_uomvalue} is not a value Unit of Measure!"); return; } List _missing = new(); foreach (var _check in checks) { var _enabled = (bool)(CoreUtils.GetPropertyValue(_uom, _check) ?? false); if (!_enabled) _missing.Add(_check); } if (_missing.Any()) errors.Add($"{_uomvalue} is missing the following checks: {string.Join(", ", _missing)}"); } protected override void DoValidate(LogikalSettings[] items, List errors) { base.DoValidate(items, errors); var _item = items.FirstOrDefault(); if (_item == null) return; var _uoms = Client.Query(new Filter().All(), Columns.All()).ToObjects().ToArray(); ValidateUom(_item, nameof(LogikalSettings.ProfileUom), errors, _uoms, nameof(ProductDimensionUnit.HasLength)); ValidateUom(_item, nameof(LogikalSettings.ComponentUom), errors, _uoms, nameof(ProductDimensionUnit.HasQuantity)); ValidateUom(_item, nameof(LogikalSettings.GlassUom), errors, _uoms, nameof(ProductDimensionUnit.HasHeight), nameof(ProductDimensionUnit.HasWidth)); //if (_item.ImportDesigns == V6ImportDesigns.ToManufacturing) //{ // if (String.IsNullOrWhiteSpace(_item.PacketTemplate)) // errors.Add("Packet Template my not be blank!"); // else // { // var _found = Client // .Query(new Filter(x => x.Code).IsEqualTo(_item.PacketTemplate), // Columns.None()).Rows.Any(); // if (!_found) // errors.Add($"Packet Template [{_item.PacketTemplate}] does not exist!"); // } //} _item.CheckSQL(); Validate(_item.ProfileSQL, errors); Validate(_item.ComponentSQL, errors); Validate(_item.LabourSQL, errors); Validate(_item.GlassSQL, errors); } } public static void ERPStatuses(IPanelHost host) { host.CreateSetupActionIfCanView("Logikal Settings", PRSDesktop.Resources.logikal, (action) => { var logikal = Client.Query( new Filter().All(), Columns.All() ).Rows .FirstOrDefault()? .ToObject() ?? new LogikalSettings(); var grid = new LogikalSettingsGrid(); if (grid.EditItems(new LogikalSettings[] { logikal })) { Client.Save(logikal, "Updated Settings"); } }); host.CreateSetupActionIfCanView("V6 Settings", PRSDesktop.Resources.v6, (action) => { var v6 = Client.Query( new Filter().All(), Columns.All() ).Rows .FirstOrDefault()? .ToObject() ?? new V6Settings(); v6.CheckSQL(); var grid = new V6SettingsGrid(); if (grid.EditItems(new V6Settings[] { v6 })) { Client.Save(v6, "Updated Settings"); } }); } }