using Comal.Classes; using InABox.Core; using InABox.Scripting; namespace PRSDimensionUtils; public static class DimensionUtils { private static Dictionary? _dimensionscriptcache; public static void ResetDimensionScriptCache() => _dimensionscriptcache = null; public static void ReloadDimensionScriptCache(Guid[]? ids, Func?,Columns,CoreTable> reload) { _dimensionscriptcache ??= new Dictionary(); var scripts = reload( ids != null ? new Filter(x => x.ID).InList(ids) : null, Columns.None() .Add(x => x.ID) .Add(x => x.Conversion) ).ToDictionary(x => x.ID, x => x.Conversion); foreach (var id in scripts.Keys) { var doc = !String.IsNullOrWhiteSpace(scripts[id]) ? new ScriptDocument(scripts[id]) : null; if (doc?.Compile() == true) _dimensionscriptcache[id] = doc; else _dimensionscriptcache.Remove(id); } } public static void ReloadDimensionScriptCache(Guid[]? ids, IQueryProvider query) { ReloadDimensionScriptCache(ids, (f, c) => query.Query(f, c)); } public static void ConvertDimensions( IDimensions dimensions, ref double quantity, IQueryProvider reload) => ConvertDimensions(dimensions, ref quantity, (f, c) => reload.Query(f, c)); public static void ConvertDimensions( IDimensions dimensions, ref double quantity, Func?,Columns,CoreTable> reload) { if (_dimensionscriptcache == null) ReloadDimensionScriptCache(null, reload); if (_dimensionscriptcache?.TryGetValue(dimensions.Unit.ID, out ScriptDocument? script) == true) { script.SetValue("Quantity", quantity); script.SetValue("Dimensions", dimensions); script.Execute("Module", DimensionUnit.ConvertDimensionsMethodName()); quantity = Convert.ToDouble(script.GetValue("Quantity")); } } public static double ConvertDimensions(IDimensions dimensions, double quantity, Func?, Columns, CoreTable> reload) { ConvertDimensions(dimensions, ref quantity, reload); return quantity; } public static double ConvertDimensions(IDimensions dimensions, double quantity, IQueryProvider query) { ConvertDimensions(dimensions, ref quantity, query); return quantity; } /// /// Convert the dimensions on a , and adjust /// its and accordingly. /// public static void ConvertDimensions(this PurchaseOrderItem entity, IQueryProvider query) { var dimensions = entity.Dimensions; var qty = entity.Qty; ConvertDimensions( dimensions, ref qty, query); if (!qty.IsEffectivelyEqual(entity.Qty)) { entity.Cost = entity.Cost * entity.Qty / (qty.IsEffectivelyEqual(0.0) ? 1.0 : qty); entity.Qty = qty; } } }