DimensionUtils.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using Comal.Classes;
  2. using InABox.Core;
  3. using InABox.Scripting;
  4. namespace PRSDimensionUtils;
  5. public static class DimensionUtils
  6. {
  7. private static Dictionary<Guid, ScriptDocument>? _dimensionscriptcache;
  8. public static void ResetDimensionScriptCache() => _dimensionscriptcache = null;
  9. public static void ReloadDimensionScriptCache(Guid[]? ids, Func<Filter<ProductDimensionUnit>?,Columns<ProductDimensionUnit>,CoreTable> reload)
  10. {
  11. _dimensionscriptcache ??= new Dictionary<Guid, ScriptDocument>();
  12. var scripts = reload(
  13. ids != null
  14. ? new Filter<ProductDimensionUnit>(x => x.ID).InList(ids)
  15. : null,
  16. Columns.None<ProductDimensionUnit>()
  17. .Add(x => x.ID)
  18. .Add(x => x.Conversion)
  19. ).ToDictionary<ProductDimensionUnit, Guid, String>(x => x.ID, x => x.Conversion);
  20. foreach (var id in scripts.Keys)
  21. {
  22. var doc = !String.IsNullOrWhiteSpace(scripts[id]) ? new ScriptDocument(scripts[id]) : null;
  23. if (doc?.Compile() == true)
  24. _dimensionscriptcache[id] = doc;
  25. else
  26. _dimensionscriptcache.Remove(id);
  27. }
  28. }
  29. public static void ReloadDimensionScriptCache(Guid[]? ids, IQueryProvider<ProductDimensionUnit> query)
  30. {
  31. ReloadDimensionScriptCache(ids, (f, c) => query.Query(f, c));
  32. }
  33. public static void ConvertDimensions(
  34. IDimensions dimensions,
  35. ref double quantity,
  36. IQueryProvider<ProductDimensionUnit> reload) => ConvertDimensions(dimensions, ref quantity, (f, c) => reload.Query(f, c));
  37. public static void ConvertDimensions(
  38. IDimensions dimensions,
  39. ref double quantity,
  40. Func<Filter<ProductDimensionUnit>?,Columns<ProductDimensionUnit>,CoreTable> reload)
  41. {
  42. if (quantity.IsEffectivelyEqual(0.0))
  43. return;
  44. if (_dimensionscriptcache == null)
  45. ReloadDimensionScriptCache(null, reload);
  46. if (_dimensionscriptcache?.TryGetValue(dimensions.Unit.ID, out ScriptDocument? script) == true)
  47. {
  48. script.SetValue("Quantity", quantity);
  49. script.SetValue("Dimensions", dimensions);
  50. script.Execute("Module", DimensionUnit.ConvertDimensionsMethodName());
  51. quantity = Convert.ToDouble(script.GetValue("Quantity"));
  52. }
  53. }
  54. public static double ConvertDimensions(IDimensions dimensions, double quantity, Func<Filter<ProductDimensionUnit>?, Columns<ProductDimensionUnit>, CoreTable> reload)
  55. {
  56. ConvertDimensions(dimensions, ref quantity, reload);
  57. return quantity;
  58. }
  59. public static double ConvertDimensions(IDimensions dimensions, double quantity, IQueryProvider<ProductDimensionUnit> query)
  60. {
  61. ConvertDimensions(dimensions, ref quantity, query);
  62. return quantity;
  63. }
  64. /// <summary>
  65. /// Convert the dimensions on a <see cref="PurchaseOrderItem"/>, and adjust
  66. /// its <see cref="PurchaseOrderItem.Cost"/> and <see
  67. /// cref="PurchaseOrderItem.Qty"/> accordingly.
  68. /// </summary>
  69. public static void ConvertDimensions(this PurchaseOrderItem entity, IQueryProvider<ProductDimensionUnit> query)
  70. {
  71. var dimensions = entity.Dimensions;
  72. var qty = entity.Qty;
  73. ConvertDimensions(
  74. dimensions,
  75. ref qty,
  76. query);
  77. if (!qty.IsEffectivelyEqual(entity.Qty))
  78. {
  79. entity.Cost = entity.Cost * entity.Qty / (qty.IsEffectivelyEqual(0.0) ? 1.0 : qty);
  80. entity.Qty = qty;
  81. }
  82. }
  83. }