12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- using Comal.Classes;
- using InABox.Core;
- using InABox.Scripting;
- namespace PRSDimensionUtils;
- public static class DimensionUtils
- {
- private static Dictionary<Guid, ScriptDocument>? _dimensionscriptcache;
-
- public static void ResetDimensionScriptCache() => _dimensionscriptcache = null;
-
- public static void ReloadDimensionScriptCache(Guid[]? ids, Func<Filter<ProductDimensionUnit>?,Columns<ProductDimensionUnit>,CoreTable> reload)
- {
- _dimensionscriptcache ??= new Dictionary<Guid, ScriptDocument>();
- var scripts = reload(
- ids != null
- ? new Filter<ProductDimensionUnit>(x => x.ID).InList(ids)
- : null,
- Columns.None<ProductDimensionUnit>()
- .Add(x => x.ID)
- .Add(x => x.Conversion)
- ).ToDictionary<ProductDimensionUnit, Guid, String>(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<ProductDimensionUnit> query)
- {
- ReloadDimensionScriptCache(ids, (f, c) => query.Query(f, c));
- }
- public static void ConvertDimensions(
- IDimensions dimensions,
- ref double quantity,
- IQueryProvider<ProductDimensionUnit> reload) => ConvertDimensions(dimensions, ref quantity, (f, c) => reload.Query(f, c));
-
- public static void ConvertDimensions(
- IDimensions dimensions,
- ref double quantity,
- Func<Filter<ProductDimensionUnit>?,Columns<ProductDimensionUnit>,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<Filter<ProductDimensionUnit>?, Columns<ProductDimensionUnit>, CoreTable> reload)
- {
- ConvertDimensions(dimensions, ref quantity, reload);
- return quantity;
- }
- public static double ConvertDimensions(IDimensions dimensions, double quantity, IQueryProvider<ProductDimensionUnit> query)
- {
- ConvertDimensions(dimensions, ref quantity, query);
- return quantity;
- }
- /// <summary>
- /// Convert the dimensions on a <see cref="PurchaseOrderItem"/>, and adjust
- /// its <see cref="PurchaseOrderItem.Cost"/> and <see
- /// cref="PurchaseOrderItem.Qty"/> accordingly.
- /// </summary>
- public static void ConvertDimensions(this PurchaseOrderItem entity, IQueryProvider<ProductDimensionUnit> 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;
- }
- }
- }
|