JobMaterials.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Runtime.CompilerServices;
  6. using InABox.Core;
  7. namespace Comal.Classes
  8. {
  9. public class JobMaterialBOMAggregate : CoreAggregate<JobMaterial, JobBillOfMaterialsItem, double>
  10. {
  11. public override Expression<Func<JobBillOfMaterialsItem, double>> Aggregate => x => x.Quantity;
  12. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  13. public override Dictionary<Expression<Func<JobBillOfMaterialsItem, object>>, Expression<Func<JobMaterial, object>>> Links =>
  14. new Dictionary<Expression<Func<JobBillOfMaterialsItem, object>>, Expression<Func<JobMaterial, object>>>()
  15. {
  16. { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Job.ID, JobMaterial => JobMaterial.Job.ID },
  17. { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Product.ID, JobMaterial => JobMaterial.Product.ID },
  18. { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Style.ID, JobMaterial => JobMaterial.Style.ID },
  19. { JobBillOfMaterialsItem => JobBillOfMaterialsItem.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize }
  20. };
  21. public override Filter<JobBillOfMaterialsItem> Filter =>
  22. new Filter<JobBillOfMaterialsItem>(x => x.BillOfMaterials.Approved).IsNotEqualTo(DateTime.MinValue);
  23. }
  24. public class JobMaterialTotalRequiredAggregate : CoreAggregate<JobMaterial, JobRequisitionItem, double>
  25. {
  26. public override Expression<Func<JobRequisitionItem, double>> Aggregate => x => x.Qty;
  27. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  28. public override Dictionary<Expression<Func<JobRequisitionItem, object>>, Expression<Func<JobMaterial, object>>> Links =>
  29. new Dictionary<Expression<Func<JobRequisitionItem, object>>, Expression<Func<JobMaterial, object>>>()
  30. {
  31. { JobMaterialRequisitionItem => JobMaterialRequisitionItem.Requisition.Job.ID, JobMaterial => JobMaterial.Job.ID },
  32. { JobMaterialRequisitionItem => JobMaterialRequisitionItem.Product.ID, JobMaterial => JobMaterial.Product.ID },
  33. { JobMaterialRequisitionItem => JobMaterialRequisitionItem.Style.ID, JobMaterial => JobMaterial.Style.ID },
  34. { JobMaterialRequisitionItem => JobMaterialRequisitionItem.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize }
  35. };
  36. public override Filter<JobRequisitionItem> Filter =>
  37. new Filter<JobRequisitionItem>(x => x.Requisition.Approved).IsNotEqualTo(DateTime.MinValue);
  38. }
  39. public class JobMaterialOrderAggregate : CoreAggregate<JobMaterial, PurchaseOrderItem, double>
  40. {
  41. public override Expression<Func<PurchaseOrderItem, double>> Aggregate => x => x.Qty;
  42. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  43. public override Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<JobMaterial, object>>> Links =>
  44. new Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<JobMaterial, object>>>()
  45. {
  46. { PurchaseOrderItem => PurchaseOrderItem.Job.ID, JobMaterial => JobMaterial.Job.ID },
  47. { PurchaseOrderItem => PurchaseOrderItem.Product.ID, JobMaterial => JobMaterial.Product.ID },
  48. { PurchaseOrderItem => PurchaseOrderItem.Style.ID, JobMaterial => JobMaterial.Style.ID },
  49. { PurchaseOrderItem => PurchaseOrderItem.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize }
  50. };
  51. public override Filter<PurchaseOrderItem> Filter => new Filter<PurchaseOrderItem>(x => x.ReceivedDate).IsEqualTo(DateTime.MinValue);
  52. }
  53. public class JobMaterialOrderValue : CoreAggregate<JobMaterial, PurchaseOrderItem, double>
  54. {
  55. public override Expression<Func<PurchaseOrderItem, double>> Aggregate => x => x.ExTax;
  56. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  57. public override Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<JobMaterial, object>>> Links =>
  58. new Dictionary<Expression<Func<PurchaseOrderItem, object>>, Expression<Func<JobMaterial, object>>>()
  59. {
  60. { PurchaseOrderItem => PurchaseOrderItem.Job.ID, JobMaterial => JobMaterial.Job.ID },
  61. { PurchaseOrderItem => PurchaseOrderItem.Product.ID, JobMaterial => JobMaterial.Product.ID },
  62. { PurchaseOrderItem => PurchaseOrderItem.Style.ID, JobMaterial => JobMaterial.Style.ID },
  63. { PurchaseOrderItem => PurchaseOrderItem.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize }
  64. };
  65. public override Filter<PurchaseOrderItem> Filter => new Filter<PurchaseOrderItem>(x => x.ReceivedDate).IsEqualTo(DateTime.MinValue);
  66. }
  67. public class JobMaterialReceivedAggregate : CoreAggregate<JobMaterial, StockMovement, double>
  68. {
  69. public override Expression<Func<StockMovement, double>> Aggregate => x => x.Received;
  70. public override Filter<StockMovement> Filter => new Filter<StockMovement>(x => x.IsTransfer).IsEqualTo(false);
  71. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  72. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<JobMaterial, object>>> Links =>
  73. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<JobMaterial, object>>>()
  74. {
  75. { StockMovement => StockMovement.Job.ID, JobMaterial => JobMaterial.Job.ID },
  76. { StockMovement => StockMovement.Product.ID, JobMaterial => JobMaterial.Product.ID },
  77. { StockMovement => StockMovement.Style.ID, JobMaterial => JobMaterial.Style.ID },
  78. { StockMovement => StockMovement.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize }
  79. };
  80. }
  81. public class JobMaterialIssuedAggregate : CoreAggregate<JobMaterial, StockMovement, double>
  82. {
  83. public override Expression<Func<StockMovement, double>> Aggregate => x => x.Issued;
  84. public override Filter<StockMovement> Filter => new Filter<StockMovement>(x => x.IsTransfer).IsEqualTo(false);
  85. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  86. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<JobMaterial, object>>> Links =>
  87. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<JobMaterial, object>>>()
  88. {
  89. { StockMovement => StockMovement.Job.ID, JobMaterial => JobMaterial.Job.ID },
  90. { StockMovement => StockMovement.Product.ID, JobMaterial => JobMaterial.Product.ID },
  91. { StockMovement => StockMovement.Style.ID, JobMaterial => JobMaterial.Style.ID },
  92. { StockMovement => StockMovement.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize }
  93. };
  94. }
  95. public class JobMaterialBalanceRequiredFormula : IFormula<JobMaterial, double>
  96. {
  97. public Expression<Func<JobMaterial, double>> Value => x => x.TotalRequired;
  98. public Expression<Func<JobMaterial, double>>[] Modifiers => new Expression<Func<JobMaterial, double>>[] { x => x.Issued };
  99. public FormulaOperator Operator => FormulaOperator.Subtract;
  100. public FormulaType Type => FormulaType.Virtual;
  101. }
  102. public class JobMaterialReservedStockAggregate : CoreAggregate<JobMaterial, StockMovement, double>
  103. {
  104. public override Expression<Func<StockMovement, double>> Aggregate => x => x.Units;
  105. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  106. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<JobMaterial, object>>> Links =>
  107. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<JobMaterial, object>>>()
  108. {
  109. { StockMovement => StockMovement.Job.ID, JobMaterial => JobMaterial.Job.ID },
  110. { StockMovement => StockMovement.Product.ID, JobMaterial => JobMaterial.Product.ID },
  111. { StockMovement => StockMovement.Style.ID, JobMaterial => JobMaterial.Style.ID },
  112. { StockMovement => StockMovement.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize }
  113. };
  114. }
  115. public class JobMaterialFreeStockAggregate : CoreAggregate<JobMaterial, StockMovement, double>
  116. {
  117. public override Expression<Func<StockMovement, double>> Aggregate => x => x.Units;
  118. public override AggregateCalculation Calculation => AggregateCalculation.Sum;
  119. public override Filter<StockMovement> Filter => new Filter<StockMovement>(x => x.Job).NotLinkValid().Or(x=>x.Job.JobStatus.Active).IsEqualTo(false);
  120. public override Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<JobMaterial, object>>> Links =>
  121. new Dictionary<Expression<Func<StockMovement, object>>, Expression<Func<JobMaterial, object>>>()
  122. {
  123. { StockMovement => StockMovement.Product.ID, JobMaterial => JobMaterial.Product.ID },
  124. //{ StockMovement => StockMovement.Style.ID, JobMaterial => JobMaterial.Style.ID },
  125. //{ StockMovement => StockMovement.Dimensions.UnitSize, JobMaterial => JobMaterial.Dimensions.UnitSize }
  126. };
  127. }
  128. public class JobMaterialUnionGenerator : AutoEntityUnionGenerator<IJobMaterial>
  129. {
  130. protected override void Configure()
  131. {
  132. AddTable<StockMovement>();
  133. AddTable<JobBillOfMaterialsItem>();
  134. AddTable<JobRequisitionItem>();
  135. AddTable<PurchaseOrderItem>();
  136. }
  137. public override bool Distinct => true;
  138. public override Column<IJobMaterial>[] IDColumns => new Column<IJobMaterial>[]
  139. {
  140. new Column<IJobMaterial>(x => x.Job.ID),
  141. new Column<IJobMaterial>(x => x.Product.ID),
  142. new Column<IJobMaterial>(x => x.Style.ID),
  143. new Column<IJobMaterial>(x => x.Dimensions.Unit.ID),
  144. new Column<IJobMaterial>(x => x.Dimensions.Quantity),
  145. new Column<IJobMaterial>(x => x.Dimensions.Length),
  146. new Column<IJobMaterial>(x => x.Dimensions.Width),
  147. new Column<IJobMaterial>(x => x.Dimensions.Height),
  148. new Column<IJobMaterial>(x => x.Dimensions.Weight)
  149. };
  150. }
  151. [UserTracking(typeof(Job))]
  152. [AutoEntity(typeof(JobMaterialUnionGenerator))]
  153. public class JobMaterial : DimensionedEntity<StockDimensions>, IJobMaterial, IRemotable, IPersistent, IManyToMany<Job, Product>, ILicense<ProjectManagementLicense>/* , IDimensioned */
  154. {
  155. [NullEditor]
  156. public JobLink Job { get; set; }
  157. [EditorSequence(1)]
  158. public ProductLink Product { get; set; }
  159. [EditorSequence(2)]
  160. public ProductStyleLink Style { get; set; }
  161. [NullEditor]
  162. [Obsolete("Replaced with Dimensions", true)]
  163. public double UnitSize { get; set; }
  164. [EditorSequence(3)]
  165. [RequiredColumn]
  166. public override StockDimensions Dimensions { get; set; }
  167. [EditorSequence(4)]
  168. [DoubleEditor]
  169. [Aggregate(typeof(JobMaterialBOMAggregate))]
  170. public double BillOfMaterials { get; set; }
  171. [EditorSequence(5)]
  172. [DoubleEditor]
  173. [Aggregate(typeof(JobMaterialTotalRequiredAggregate))]
  174. public double TotalRequired { get; set; }
  175. [EditorSequence(6)]
  176. [DoubleEditor]
  177. [Aggregate(typeof(JobMaterialOrderAggregate))]
  178. public double OnOrder { get; set; }
  179. [EditorSequence(7)]
  180. [DoubleEditor]
  181. [Aggregate(typeof(JobMaterialOrderValue))]
  182. public double OrderValue { get; set; }
  183. [EditorSequence(8)]
  184. [Aggregate(typeof(JobMaterialReceivedAggregate))]
  185. [DoubleEditor(Editable = Editable.Hidden)]
  186. public double Received { get; set; }
  187. [EditorSequence(9)]
  188. [Aggregate(typeof(JobMaterialIssuedAggregate))]
  189. [DoubleEditor(Editable = Editable.Hidden)]
  190. public double Issued { get; set; }
  191. [EditorSequence(10)]
  192. [DoubleEditor]
  193. [Formula(typeof(JobMaterialBalanceRequiredFormula))]
  194. public double BalanceRequired { get; set; }
  195. [EditorSequence(11)]
  196. [Aggregate(typeof(JobMaterialReservedStockAggregate))]
  197. [DoubleEditor(Editable = Editable.Hidden)]
  198. public double ReservedStock { get; set; }
  199. [EditorSequence(12)]
  200. [Aggregate(typeof(JobMaterialFreeStockAggregate))]
  201. [DoubleEditor(Editable = Editable.Hidden)]
  202. public double FreeStock { get; set; }
  203. protected override void Init()
  204. {
  205. base.Init();
  206. Job = new JobLink();
  207. Product = new ProductLink();
  208. Style = new ProductStyleLink();
  209. Dimensions = new StockDimensions();
  210. }
  211. private static Column<JobMaterial> dimensions = new Column<JobMaterial>(x => x.Product.Dimensions);
  212. private bool bChanging;
  213. protected override void DoPropertyChanged(string name, object before, object after)
  214. {
  215. if (bChanging)
  216. return;
  217. if (dimensions.IsParentOf(name))
  218. {
  219. bChanging = true;
  220. String col = String.Join(".", name.Split('.').Skip(1));
  221. CoreUtils.SetPropertyValue(this, col, after);
  222. bChanging = false;
  223. }
  224. else
  225. base.DoPropertyChanged(name, before, after);
  226. }
  227. }
  228. }