DimensionUnit.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using InABox.Core;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Linq;
  6. namespace Comal.Classes
  7. {
  8. public abstract class DimensionUnit : Entity, IRemotable, IPersistent, ISequenceable, IDimensionUnit
  9. {
  10. [UniqueCodeEditor(Visible = Visible.Default, Editable = Editable.Enabled)]
  11. [EditorSequence(1)]
  12. public virtual String Code { get; set; }
  13. [TextBoxEditor]
  14. [EditorSequence(2)]
  15. public virtual String Description { get; set; }
  16. [CheckBoxEditor]
  17. [EditorSequence(3)]
  18. public virtual bool HasQuantity { get; set; } = false;
  19. [CheckBoxEditor]
  20. [EditorSequence(4)]
  21. public virtual bool HasLength { get; set; } = false;
  22. [CheckBoxEditor]
  23. [EditorSequence(5)]
  24. public virtual bool HasWidth { get; set; } = false;
  25. [CheckBoxEditor]
  26. [EditorSequence(6)]
  27. public virtual bool HasHeight { get; set; } = false;
  28. [CheckBoxEditor]
  29. [EditorSequence(7)]
  30. public virtual bool HasWeight { get; set; } = false;
  31. [ExpressionEditor(null, typeof(DimensionsExpressionModelGenerator))]
  32. [EditorSequence(8)]
  33. public virtual string Formula { get; set; } = "1";
  34. [ExpressionEditor(null, typeof(DimensionsExpressionModelGenerator))]
  35. [EditorSequence(9)]
  36. public virtual string Format { get; set; } = "\"EACH\"";
  37. [ScriptEditor]
  38. [EditorSequence(10)]
  39. public virtual string Conversion { get; set; } = "";
  40. [NullEditor]
  41. public long Sequence { get; set; }
  42. public bool HasDimensions() => HasHeight || HasWidth || HasLength || HasWeight || HasQuantity;
  43. public static string ConvertDimensionsMethodName() => "ConvertDimensions";
  44. public static string DefaultConvertDimensionsScript()
  45. {
  46. return
  47. "using Comal.Classes;\n"+
  48. "\n"+
  49. "public class Module\n"+
  50. "{\n"+
  51. " public void " + ConvertDimensionsMethodName() + "(PurchaseOrderItem item)\n"+
  52. " {\n"+
  53. " }\n"+
  54. "}\n";
  55. }
  56. public bool Validate(List<String> errors)
  57. {
  58. bool result = true;
  59. var variables = new Dictionary<string, object?>()
  60. {
  61. { "Quantity", 1.00F },
  62. { "Length", 1.00F },
  63. { "Width", 1.00F },
  64. { "Height", 1.00F },
  65. { "Weight", 1.00F }
  66. };
  67. try
  68. {
  69. var expr = new CoreExpression(Formula);
  70. expr.Evaluate(variables);
  71. result = true;
  72. }
  73. catch (Exception e)
  74. {
  75. errors.Add($"{Code}: Formula [{Formula}] => {e.Message}");
  76. result = false;
  77. }
  78. try
  79. {
  80. var expr = new CoreExpression(Format);
  81. expr.Evaluate(variables);
  82. result = true;
  83. }
  84. catch (Exception e)
  85. {
  86. errors.Add($"{Code}: Format [{Format}] => {e.Message}");
  87. result = false;
  88. }
  89. return result;
  90. }
  91. private class DimensionsExpressionModelGenerator : IExpressionModelGenerator
  92. {
  93. public List<string> GetVariables(object?[] items)
  94. {
  95. var dimensionUnits = items.Select(x => x as IDimensionUnit).Where(x => x != null).Cast<IDimensionUnit>();
  96. var variables = new List<string>();
  97. if (dimensionUnits.All(x => x.HasQuantity)) variables.Add("Quantity");
  98. if (dimensionUnits.All(x => x.HasLength)) variables.Add("Length");
  99. if (dimensionUnits.All(x => x.HasWidth)) variables.Add("Width");
  100. if (dimensionUnits.All(x => x.HasHeight)) variables.Add("Height");
  101. if (dimensionUnits.All(x => x.HasWeight)) variables.Add("Weight");
  102. return variables;
  103. }
  104. }
  105. }
  106. }